SplitStrategy.cpp
Go to the documentation of this file.
/* Frobby: Software for monomial ideal computations.
Copyright (C) 2007 Bjarke Hammersholt Roune (www.broune.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
*/
#include "stdinc.h"
#include "SplitStrategy.h"
#include "Slice.h"
#include "Term.h"
#include "Ideal.h"
#include "NameFactory.h"
#include "TermGrader.h"
#include "error.h"
#include "display.h"
SplitStrategy::SplitStrategy() {
}
SplitStrategy::~SplitStrategy() {
}
class SplitStrategyCommon : public SplitStrategy {
public:
virtual void getPivot(Term& pivot, Slice& slice) const {
ASSERT(false);
reportInternalError("Requested pivot split of non-pivot split strategy.\n");
}
virtual void getPivot(Term& pivot, Slice& slice, const TermGrader& grader) const {
getPivot(pivot, slice);
}
virtual size_t getLabelSplitVariable(const Slice& slice) const {
ASSERT(false);
reportInternalError("Requested label split of non-label split strategy.");
return 0; // To avoid spurious warnings from static analyses.
}
virtual bool isPivotSplit() const {
return false;
}
virtual bool isLabelSplit() const {
return false;
}
protected:
Exponent getMedianPositiveExponentOf(Slice& slice, size_t var) const {
slice.singleDegreeSortIdeal(var);
Ideal::const_iterator end = slice.getIdeal().end();
Ideal::const_iterator begin = slice.getIdeal().begin();
while ((*begin)[var] == 0) {
++begin;
ASSERT(begin != end);
}
return (*(begin + (distance(begin, end) ) / 2))[var];
}
// Returns the variable that divides the most minimal generators of
// those where some minimal generator is divisible by the square of
// that variable.
mutable Term coVariableForGetBestVar;
size_t getBestVar(const Slice& slice) const {
Term& co = coVariableForGetBestVar;
co.reset(slice.getVarCount());
slice.getIdeal().getSupportCounts(co);
const Term& lcm = slice.getLcm();
for (size_t var = 0; var < slice.getVarCount(); ++var)
if (lcm[var] <= 1)
co[var] = 0;
ASSERT(!co.isIdentity());
Exponent maxCount = co[co.getFirstMaxExponent()];
for (size_t var = 0; var < slice.getVarCount(); ++var)
if (co[var] < maxCount)
co[var] = 0;
// Choose the middle variable among those that are best. This
// is better at avoiding a bad pattern than just choosing the
// first one.
return co.getMiddleNonZeroExponent();
}
};
class LabelSplit : public SplitStrategyCommon {
protected:
mutable Term _counts;
void setCounts(const Slice& slice) const {
_counts.reset(slice.getVarCount());
slice.getIdeal().getSupportCounts(_counts);
}
mutable Term _oneCounts;
void setOneCounts(const Slice& slice) const {
ASSERT(!const_cast<Slice&>(slice).adjustMultiply());
ASSERT(!const_cast<Slice&>(slice).baseCase(false));
// For each variable, count number of terms with exponent equal to 1,
// not counting pure powers.
_oneCounts.reset(slice.getVarCount());
Ideal::const_iterator end = slice.getIdeal().end();
for (Ideal::const_iterator it = slice.getIdeal().begin();
it != end; ++it) {
if (Term::getSizeOfSupport(*it, slice.getVarCount()) == 1)
continue; // Not counting pure powers.
for (size_t var = 0; var < slice.getVarCount(); ++var)
if ((*it)[var] == 1)
_oneCounts[var] += 1;
}
}
virtual bool isLabelSplit() const {
return true;
}
};
// Use the variable that divides the most minimal generators.
class MaxLabelSplit : public LabelSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "maxlabel";
}
virtual size_t getLabelSplitVariable(const Slice& slice) const {
setCounts(slice);
return _counts.getFirstMaxExponent();
}
};
// Use the first variable that is valid for a label split.
class VarLabelSplit : public LabelSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "varlabel";
}
virtual size_t getLabelSplitVariable(const Slice& slice) const {
setOneCounts(slice);
for (size_t var = 0; ; ++var) {
ASSERT(var < slice.getVarCount());
if (_oneCounts[var] > 0)
return var;
}
}
};
// Among those variables with least number of exponents equal to one,
// use the variable that divides the most minimal generators.
class MinLabelSplit : public LabelSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "minlabel";
}
virtual size_t getLabelSplitVariable(const Slice& slice) const {
setCounts(slice);
setOneCounts(slice);
// Zero those variables of _counts that have more than the least number
// of exponent 1 minimal generators.
size_t mostGeneric = 0;
for (size_t var = 1; var < slice.getVarCount(); ++var)
if (mostGeneric == 0 ||
(mostGeneric > _oneCounts[var] && _oneCounts[var] > 0))
mostGeneric = _oneCounts[var];
for (size_t var = 0; var < slice.getVarCount(); ++var)
if (_oneCounts[var] != mostGeneric)
_counts[var] = 0;
return _counts.getFirstMaxExponent();
}
};
class PivotSplit : public SplitStrategyCommon {
public:
virtual bool isPivotSplit() const {
return true;
}
};
class MinimumSplit : public PivotSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "minimum";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
size_t var = getBestVar(slice);
pivot.setToIdentity();
pivot[var] = 1;
}
};
class MedianSplit : public PivotSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "median";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
size_t var = getBestVar(slice);
pivot.setToIdentity();
pivot[var] = getMedianPositiveExponentOf(slice, var);
if (pivot[var] == slice.getLcm()[var])
pivot[var] -= 1;
}
};
class MaximumSplit : public PivotSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "maximum";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
size_t var = getBestVar(slice);
pivot.setToIdentity();
pivot[var] = slice.getLcm()[var] - 1;
}
};
class IndependencePivotSplit : public MedianSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "indep";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
if (slice.getVarCount() == 1) {
MedianSplit::getPivot(pivot, slice);
return;
}
for (int attempts = 0; attempts < 10; ++attempts) {
// Pick two distinct variables.
size_t var1 = rand() % slice.getVarCount();
size_t var2 = rand() % (slice.getVarCount() - 1);
if (var2 >= var1)
++var2;
// Make pivot as big as it can be while making var1 and var2
// independent of each other.
bool first = true;
Ideal::const_iterator end = slice.getIdeal().end();
for (Ideal::const_iterator it = slice.getIdeal().begin();
it != end; ++it) {
if ((*it)[var1] == 0 || (*it)[var2] == 0)
continue;
if (first)
pivot = *it;
else {
for (size_t var = 0; var < slice.getVarCount(); ++var)
if (pivot[var] >= (*it)[var])
pivot[var] = (*it)[var] - 1;
}
}
if (!first && !pivot.isIdentity())
return;
}
MedianSplit::getPivot(pivot, slice);
}
};
class GcdSplit : public PivotSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "gcd";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
size_t var = getBestVar(slice);
size_t nonDivisibleCount = 0;
Ideal::const_iterator end = slice.getIdeal().end();
for (Ideal::const_iterator it = slice.getIdeal().begin();
it != end; ++it)
if ((*it)[var] >= 2)
++nonDivisibleCount;
for (int i = 0; i < 3; ++i) {
size_t selected = rand() % nonDivisibleCount;
for (Ideal::const_iterator it = slice.getIdeal().begin(); ; ++it) {
ASSERT(it != end);
if ((*it)[var] < 2)
continue;
if (selected == 0) {
if (i == 0)
pivot = *it;
else
pivot.gcd(pivot, *it);
break;
}
--selected;
}
}
pivot.decrement();
}
};
class MinGenSplit : public PivotSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "mingen";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
size_t nonSquareFreeCount = 0;
Ideal::const_iterator end = slice.getIdeal().end();
for (Ideal::const_iterator it = slice.getIdeal().begin();
it != end; ++it)
if (!Term::isSquareFree(*it, slice.getVarCount()))
++nonSquareFreeCount;
size_t selected = rand() % nonSquareFreeCount;
for (Ideal::const_iterator it = slice.getIdeal().begin(); ; ++it) {
ASSERT(it != end);
if (Term::isSquareFree(*it, slice.getVarCount()))
continue;
if (selected == 0) {
pivot = *it;
break;
}
--selected;
}
pivot.decrement();
}
};
class DegreeSplit : public PivotSplit {
public:
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "degree";
}
virtual void getPivot(Term& pivot, Slice& slice) const {
reportInternalError("Called getPivot directly on FrobeniusSplit.");
}
virtual void getPivot(Term& pivot, Slice& slice, const TermGrader& grader) const {
const Term& lcm = slice.getLcm();
// TODO: pick a middle variable in case of ties.
_maxDiff = -1;
size_t maxOffset = 0u;
for (size_t var = 0; var < slice.getVarCount(); ++var) {
if (lcm[var] <= 1)
continue;
Exponent base = slice.getMultiply()[var];
Exponent mid = base + lcm[var] / 2;
// We could be looking at an added pure power whose exponent is
// defined to have degree 0. We don't want to look at that.
if (mid == grader.getMaxExponent(var) && mid > base)
--mid;
_diff = grader.getGrade(var, mid) - grader.getGrade(var, base);
if (grader.getGradeSign(var) < 0)
_diff = -_diff;
ASSERT(_diff >= 0 || base == mid);
if (_diff > _maxDiff) {
maxOffset = var;
_maxDiff = _diff;
}
}
pivot.setToIdentity();
pivot[maxOffset] = lcm[maxOffset] / 2;
}
private:
mutable mpz_class _maxDiff;
mutable mpz_class _diff;
};
class DeprecatedFrobeniusSplit : public DegreeSplit {
public:
DeprecatedFrobeniusSplit() {
displayNote
("The split selection strategy \"frob\" is deprecated and will be "
"removed in a future version of Frobby. Use the name \"degree\" "
"to achieve the same thing.");
}
virtual const char* getName() const {
return staticGetName();
}
static const char* staticGetName() {
return "frob";
}
};
namespace {
typedef NameFactory<SplitStrategy> SplitFactory;
SplitFactory getSplitFactory() {
SplitFactory factory("Slice split strategy");
nameFactoryRegister<MaxLabelSplit>(factory);
nameFactoryRegister<MinLabelSplit>(factory);
nameFactoryRegister<VarLabelSplit>(factory);
nameFactoryRegister<MinimumSplit>(factory);
nameFactoryRegister<MedianSplit>(factory);
nameFactoryRegister<MaximumSplit>(factory);
nameFactoryRegister<MinGenSplit>(factory);
nameFactoryRegister<IndependencePivotSplit>(factory);
nameFactoryRegister<GcdSplit>(factory);
nameFactoryRegister<DegreeSplit>(factory);
nameFactoryRegister<DeprecatedFrobeniusSplit>(factory);
return factory;
}
}
unique_ptr<SplitStrategy> SplitStrategy::createStrategy(const string& prefix) {
unique_ptr<SplitStrategy> split = createWithPrefix(getSplitFactory(), prefix);
ASSERT(split.get() != 0);
return split;
}
Ideal.h
NameFactory.h
nameFactoryRegister
void nameFactoryRegister(NameFactory< AbstractProduct > &factory)
Registers the string returned by ConcreteProduct::getStaticName() to a function that default-construc...
Definition NameFactory.h:142
createWithPrefix
unique_ptr< AbstractProduct > createWithPrefix(const NameFactory< AbstractProduct > &factory, const string &prefix)
Creates the unique product that has the indicated prefix, or create the actual product that has name ...
Definition NameFactory.h:154
Slice.h
SplitStrategy.h
TermGrader.h
Term.h
DegreeSplit
Definition SplitStrategy.cpp:390
DegreeSplit::_maxDiff
mpz_class _maxDiff
This is member variable used by getPivot.
Definition SplitStrategy.cpp:445
DegreeSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:392
DegreeSplit::_diff
mpz_class _diff
This is member variable used by getPivot.
Definition SplitStrategy.cpp:451
DegreeSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:396
DegreeSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice, const TermGrader &grader) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:404
DegreeSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:400
DeprecatedFrobeniusSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:466
DeprecatedFrobeniusSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:470
DeprecatedFrobeniusSplit::DeprecatedFrobeniusSplit
DeprecatedFrobeniusSplit()
Definition SplitStrategy.cpp:459
GcdSplit
Definition SplitStrategy.cpp:313
GcdSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:319
GcdSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:315
GcdSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:323
Ideal::const_iterator
Cont::const_iterator const_iterator
Definition Ideal.h:43
Ideal::end
const_iterator end() const
Definition Ideal.h:49
Ideal::begin
const_iterator begin() const
Definition Ideal.h:48
Ideal::getSupportCounts
void getSupportCounts(Exponent *counts) const
counts[var] will be the number of generators divisible by var.
Definition Ideal.cpp:227
IndependencePivotSplit
Definition SplitStrategy.cpp:264
IndependencePivotSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:266
IndependencePivotSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:270
IndependencePivotSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:274
LabelSplit
Definition SplitStrategy.cpp:102
LabelSplit::_counts
Term _counts
Definition SplitStrategy.cpp:104
LabelSplit::isLabelSplit
virtual bool isLabelSplit() const
If returns true, only call getLabelSplitVariable.
Definition SplitStrategy.cpp:129
LabelSplit::setCounts
void setCounts(const Slice &slice) const
Definition SplitStrategy.cpp:105
LabelSplit::setOneCounts
void setOneCounts(const Slice &slice) const
Definition SplitStrategy.cpp:111
LabelSplit::_oneCounts
Term _oneCounts
Definition SplitStrategy.cpp:110
MaxLabelSplit
Definition SplitStrategy.cpp:135
MaxLabelSplit::getLabelSplitVariable
virtual size_t getLabelSplitVariable(const Slice &slice) const
Returns the variable to perform a label split on.
Definition SplitStrategy.cpp:145
MaxLabelSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:141
MaxLabelSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:137
MaximumSplit
Definition SplitStrategy.cpp:247
MaximumSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:249
MaximumSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:257
MaximumSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:253
MedianSplit
Definition SplitStrategy.cpp:227
MedianSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:229
MedianSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:237
MedianSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:233
MinGenSplit
Definition SplitStrategy.cpp:355
MinGenSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:361
MinGenSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:357
MinGenSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:365
MinLabelSplit
Definition SplitStrategy.cpp:174
MinLabelSplit::getLabelSplitVariable
virtual size_t getLabelSplitVariable(const Slice &slice) const
Returns the variable to perform a label split on.
Definition SplitStrategy.cpp:184
MinLabelSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:176
MinLabelSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:180
MinimumSplit
Definition SplitStrategy.cpp:210
MinimumSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:216
MinimumSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:212
MinimumSplit::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:220
NameFactory
A NameFactory takes a name and then creates an instance of a class that has been previously registere...
Definition NameFactory.h:33
PivotSplit
Definition SplitStrategy.cpp:203
PivotSplit::isPivotSplit
virtual bool isPivotSplit() const
If returns true, only call getPivot.
Definition SplitStrategy.cpp:205
Slice
This class represents a slice, which is the central data structure of the Slice Algorithm.
Definition Slice.h:77
Slice::singleDegreeSortIdeal
void singleDegreeSortIdeal(size_t var)
Calls Ideal::singleDegreeSort on getIdeal().
Definition Slice.cpp:106
Slice::getMultiply
Term & getMultiply()
Returns for a slice .
Definition Slice.h:113
Slice::getIdeal
const Ideal & getIdeal() const
Returns for a slice .
Definition Slice.h:104
Slice::getLcm
const Term & getLcm() const
Returns the least common multiple of the generators of getIdeal().
Definition Slice.cpp:52
Slice::getVarCount
size_t getVarCount() const
Returns the number of variables in the ambient ring.
Definition Slice.h:96
SplitStrategyCommon
This common base class provides code that is useful for writing pivot split strategies.
Definition SplitStrategy.cpp:37
SplitStrategyCommon::getLabelSplitVariable
virtual size_t getLabelSplitVariable(const Slice &slice) const
Returns the variable to perform a label split on.
Definition SplitStrategy.cpp:48
SplitStrategyCommon::isLabelSplit
virtual bool isLabelSplit() const
If returns true, only call getLabelSplitVariable.
Definition SplitStrategy.cpp:58
SplitStrategyCommon::getPivot
virtual void getPivot(Term &pivot, Slice &slice) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:39
SplitStrategyCommon::getBestVar
size_t getBestVar(const Slice &slice) const
Definition SplitStrategy.cpp:78
SplitStrategyCommon::coVariableForGetBestVar
Term coVariableForGetBestVar
Definition SplitStrategy.cpp:77
SplitStrategyCommon::getMedianPositiveExponentOf
Exponent getMedianPositiveExponentOf(Slice &slice, size_t var) const
Definition SplitStrategy.cpp:63
SplitStrategyCommon::isPivotSplit
virtual bool isPivotSplit() const
If returns true, only call getPivot.
Definition SplitStrategy.cpp:54
SplitStrategyCommon::getPivot
virtual void getPivot(Term &pivot, Slice &slice, const TermGrader &grader) const
Sets pivot to the pivot of a pivot split on slice.
Definition SplitStrategy.cpp:44
SplitStrategy::createStrategy
static unique_ptr< SplitStrategy > createStrategy(const string &prefix)
Returns the strategy whose name has the given prefix.
Definition SplitStrategy.cpp:497
SplitStrategy::SplitStrategy
SplitStrategy()
Definition SplitStrategy.cpp:28
SplitStrategy::~SplitStrategy
virtual ~SplitStrategy()
Definition SplitStrategy.cpp:31
TermGrader
A TermGrader assigns a value, the degree, to each monomial.
Definition TermGrader.h:27
TermGrader::getMaxExponent
Exponent getMaxExponent(size_t var) const
Definition TermGrader.cpp:282
TermGrader::getGradeSign
int getGradeSign(size_t var) const
Returns 1 if the grade strictly increases with the exponent of var, returns -1 if it strictly decreas...
Definition TermGrader.cpp:302
TermGrader::getGrade
const mpz_class & getGrade(size_t var, Exponent exponent) const
Definition TermGrader.cpp:275
Term
Term represents a product of variables which does not include a coefficient.
Definition Term.h:49
Term::reset
void reset(size_t newVarCount)
Definition Term.h:551
Term::decrement
static void decrement(Exponent *a, size_t varCount)
Decrements each positive entry of a by one.
Definition Term.h:532
Term::getSizeOfSupport
static size_t getSizeOfSupport(const Exponent *a, size_t varCount)
Returns the number of variables such that divides .
Definition Term.h:402
Term::getMiddleNonZeroExponent
static size_t getMiddleNonZeroExponent(const Exponent *a, size_t varCount)
Returns a median element of the set of var's such that a[var] is non-zero.
Definition Term.h:361
Term::isIdentity
static bool isIdentity(const Exponent *a, size_t varCount)
Returns whether a is 1, i.e. whether all entries of a are 0.
Definition Term.h:316
Term::gcd
static void gcd(Exponent *res, const Exponent *a, const Exponent *b, size_t varCount)
Sets res equal to the greatest common divisor of a and b.
Definition Term.h:255
Term::isSquareFree
static bool isSquareFree(const Exponent *a, size_t varCount)
Returns whether a is square free, i.e. for each where .
Definition Term.h:331
Term::getFirstMaxExponent
static size_t getFirstMaxExponent(const Exponent *a, size_t varCount)
Returns a var such that a[var] >= a[i] for all i.
Definition Term.h:381
Term::setToIdentity
static void setToIdentity(Exponent *res, size_t varCount)
Set res equal to , i.e. set each entry of res equal to 0.
Definition Term.h:304
VarLabelSplit
Definition SplitStrategy.cpp:152
VarLabelSplit::getName
virtual const char * getName() const
Returns the name of the strategy.
Definition SplitStrategy.cpp:154
VarLabelSplit::staticGetName
static const char * staticGetName()
Definition SplitStrategy.cpp:158
VarLabelSplit::getLabelSplitVariable
virtual size_t getLabelSplitVariable(const Slice &slice) const
Returns the variable to perform a label split on.
Definition SplitStrategy.cpp:162
displayNote
void displayNote(const string &msg)
Display msg to standard error in a way that indicates that this is something that the user should tak...
Definition display.cpp:135
display.h
This file contains functions for printing strings to standard error.
reportInternalError
void reportInternalError(const string &errorMsg)
Definition error.cpp:29
error.h
stdinc.h
This header file includes common definitions and is included as the first line of code in every imple...
Exponent
unsigned int Exponent
Definition stdinc.h:89
ASSERT
#define ASSERT(X)
Definition stdinc.h:86