24 for (
size_t a = 0;
a <=
lat.getNeighborCount(); ++
a) {
26 if (
a <
lat.getNeighborCount())
28 for (
size_t b = 0;
b <
lat.getNeighborCount(); ++
b) {
29 for (
size_t c = 0;
c <
lat.getNeighborCount(); ++
c) {
35 for (
size_t p = 0;
p <
planes.size(); ++
p) {
45 for (
size_t n = 0;
n <
lat.getNeighborCount(); ++
n) {
46 if (!
plane.closeToPlane(
lat.getNeighbor(
n))) {
118 plane.tri.getBSideMlfbs().size();
146 const vector<mpz_class>&
rhs,
148 size_t onFacet = numeric_limits<size_t>::max();
151 for (
size_t n = 0;
n <
lat.getNeighborCount(); ++
n) {
152 for (
size_t i = 0;
i <
lat.getYDim(); ++
i) {
159 if (
onFacet == numeric_limits<size_t>::max() ||
171 size_t onFacet = numeric_limits<size_t>::max();
174 for (
size_t n = 0;
n <
lat.getNeighborCount(); ++
n) {
175 for (
size_t i = 1;
i <
lat.getYDim(); ++
i)
179 if (
onFacet == numeric_limits<size_t>::max() ||
193 rhs.resize(
lat.getYDim());
194 for (
size_t var = 0; var <
lat.getYDim(); ++var) {
196 for (
size_t p = 1;
p <
points.size(); ++
p)
213 for (
size_t i = 0;
i <
lat.getYDim(); ++
i)
224 for (
size_t var = 0; var <
lat.getHDim(); ++var)
232 for (
size_t var = 0; var <
lat.getHDim(); ++var)
246 facade.computeIrreducibleDecomposition(
true);
255 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
261 for (
size_t var = 0; var <
initialIdeal.getVarCount(); ++var)
274 transpose(nullSpaceBasis, nullSpaceBasis);
277 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
374 for (
size_t i = 0;
i <
lat.getYDim(); ++
i)
391 for (
size_t i = 0;
i <
lat.getYDim(); ++
i)
453 for (
size_t j = 0;
j < 4; ++
j) {
462 for (
size_t i = 1;
i < flatSeq.size() - 1; ++
i) {
463 const Mlfb&
prev = *(flatSeq[
i - 1].mlfb);
476 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
523 if (!
lat.isPointFreeBody(
a,
sum))
525 if (!
lat.isPointFreeBody(
b,
sum))
541 plane.neighborPlace.resize(
lat.getNeighborCount());
542 for (
size_t gen = 0;
gen <
lat.getNeighborCount(); ++
gen) {
556 for (
size_t p = 0;
p <
planes.size(); ++
p) {
558 for (
size_t i = 0;
i <
mlfbs.size(); ++
i)
569 _a(
a), _b(
b), _sum(
sum) {
572 for (
size_t m = 0;
m <
mlfbs.size(); ++
m)
577 for (
size_t m = 0;
m <
mlfbs.size(); ++
m)
587 vector<mpz_class>
rhs;
590 for (
size_t n = 0;
n <
lat.getNeighborCount(); ++
n) {
594 for (
size_t i = 0;
i <
rhs.size(); ++
i) {
614 for (
size_t i =0 ;
i <
mlfbs.size(); ++
i) {
624 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
626 size_t to =
mlfbs[
i].getEdge(0)->getOffset();
637 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
644 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
655 for (
size_t p2 = 0;
p2 <
p1; ++
p2) {
663 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
666 for (
size_t p = 0;
p <
planes.size(); ++
p) {
682 for (
size_t p = 0;
p <
planes.size(); ++
p) {
683 if (
planes[
p].flatIntervalCount > 1)
687 if (
planes[
p].pivots.size() == 4)
700 for (
size_t p = 0;
p <
planes.size(); ++
p) {
715 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
739 for (
size_t i = 0;
i <
a.size(); ++
i)
740 for (
size_t j = 0;
j <
b.size(); ++
j)
741 if (
a[
i].mlfb ==
b[
j].mlfb)
749 const vector<SeqPos>& flatSeq) {
751 for (
size_t m = 0;
m <
mlfbs.size(); ++
m)
753 pivots.push_back(&(
mlfbs[
m]));
754 if (pivots.size() != 4 || flatSeq.empty())
759 size_t sumFacet = flatSeq.front().mlfb->getMinInitialFacet();
760 pivots.push_back(flatSeq.front().mlfb->getEdge(0));
761 pivots.push_back(flatSeq.front().mlfb->getEdge(
sumFacet));
763 sumFacet = flatSeq.back().mlfb->getMinInitialFacet();
764 for (
size_t i = 0;
i < 4; ++
i)
766 pivots.push_back(flatSeq.back().mlfb->getEdge(
i));
770 vector<vector<SeqPos> >&
right,
775 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
779 for (
size_t i = 0;
i < 4; ++
i) {
780 const Mlfb&
e = *(
p.getEdge(
i));
785 for (
size_t s = 0;
s <
seqs.size(); ++
s) {
811 vector<SeqPos>&
seq =
seqs.back();
836 for (
size_t s = 0;
s <
seqs.size(); ++
s) {
839 if (*(
seqs[
s].back().mlfb) ==
m)
861 for (
size_t s = 0;
s <
seqs.size(); ++
s) {
864 if (*(
seqs[
s].back().mlfb) ==
pm)
871 for (
size_t s = 0;
s <
seqs.size(); ++
s) {
893 vector<SeqPos>&
seq =
seqs.back();
905 const vector<SeqPos>&
seq,
912 for (
size_t m = 1;
m <
seq.size() - 1 ; ++
m) {
938 const vector<vector<SeqPos> >&
side,
944 for (
size_t s = 0;
s <
side.size(); ++
s){
960 for (
size_t m = 0;
m <
mlfbs.size(); ++
m)
967 const vector<vector<SeqPos> >&
right,
977 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
1007 for (
size_t i = 0;
i < 4; ++
i)
1020 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
1022 if (
plane.isFlat(mlfb))
1023 for (
size_t i = 0;
i < 4; ++
i)
1029 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
1033 if (!
plane.isFlat(mlfb)) {
1034 for (
size_t i = 0;
i < 4; ++
i) {
1051 const Mlfb& mlfb = *
plane.tri.getASideMlfbs()[
m];
1055 const Mlfb& mlfb = *
plane.tri.getBSideMlfbs()[
m];
1064 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
1068 for (
size_t i = 0;
i < 4; ++
i) {
1071 if (
adj.isParallelogram())
1082 for (
size_t m = 0;
m <
mlfbs.size(); ++
m) {
1084 for (
size_t i = 0;
i < 4; ++
i) {
1095 const vector<SeqPos>& flatSeq) {
1107 for (
size_t i = 0;
i < 3; ++
i) {
1144 for (
size_t i = 0;
i < 3; ++
i) {
1158 const vector<Neighbor>&
nonSums =
lat.getNonSums();
1162 for (
size_t ns = 0;
ns < 3; ++
ns)
1163 for (
size_t var = 0; var < 3; ++var)
1169 for (
size_t ns = 0;
ns < 4; ++
ns)
1170 for (
size_t var = 0; var < 3; ++var)
1183 if (flatSeq.empty())
1185 size_t sumf = flatSeq.front().mlfb->getMinInitialFacet();
1189 for (
size_t j = 0;
j < 4; ++
j) {
1190 if (
j != 0 &&
j !=
sumf) {
1197 for (
size_t j = 0;
j < 4; ++
j) {
1204 for (
size_t i = 0;
i < flatSeq.size(); ++
i) {
1214 if (
i < flatSeq.size() - 1) {
1217 const Mlfb&
next = *(flatSeq[
i + 1].mlfb);
1242 const Mlfb&
prev = *(flatSeq[
i - 1].mlfb);
1244 if (
flat.getHitsFacet(0) ==
af) {
1261 const vector<const Mlfb*>& pivots,
1269 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
1279 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
1291 for (
size_t i = 0;
i <
mlfbs.size(); ++
i) {
1312 case 0:
return "sw";
1313 case 1:
return "se";
1314 case 2:
return "ne";
1315 case 3:
return "nw";
1323 for (
size_t m = 0;
m <
mlfbs.size(); ++
m)
1337 for (
size_t f = 0;
f < 4; ++
f)
1340 for (
size_t f = 0;
f < 4; ++
f)
1346 for (
size_t i = 0; ; ++
i) {
1359 for (
to = 0;
to < 4; ++
to) {
1403 _lat(&
lat), _row(
lat.getNeighborCount() + 1) {
1481 for (
size_t i = 0;
i < 4; ++
i)
1550 for (
size_t j = 0;
j <
i; ++
j) {
void swap(HilbertSlice &a, HilbertSlice &b)
void checkFlatSeq(const vector< SeqPos > &flatSeq, const GrobLat &lat, const Plane &plane)
void checkGraphOnPlane(const Plane &plane, const vector< Mlfb > &mlfbs)
void checkPlanes(const vector< TriPlane > &thinPlanes, const vector< Plane > &dtPlanes)
void checkMlfbs(const vector< Mlfb > &mlfbs, const GrobLat &lat)
bool disjointSeqs(const vector< SeqPos > &a, const vector< SeqPos > &b)
void computePivotSeqs(vector< vector< SeqPos > > &seqs, const Mlfb &pivot, const Plane &plane)
Starting at pivot (which must be a pivot), follow the three non-flat sequences starting at pivot.
SeqPos prevInSeq(SeqPos pos)
void checkSeqs(const vector< vector< SeqPos > > &left, const vector< vector< SeqPos > > &right, const Plane &plane, const vector< Mlfb > &mlfbs)
void checkSeq(vector< bool > &seenOnSide, const vector< SeqPos > &seq, const Plane &plane)
void computeSeqs(vector< vector< SeqPos > > &left, vector< vector< SeqPos > > &right, const vector< Mlfb > &mlfbs, const Plane &plane)
size_t pivotToFlatFacet(const Mlfb &pivot, const Plane &plane)
Returns the facet to push in of pivot to get to a flat.
size_t pushOutFacetZero(const vector< mpz_class > &rhs, const GrobLat &lat)
char getPlaceCode(NeighborPlace place)
void computeMlfbs(vector< Mlfb > &mlfbs, const GrobLat &lat)
void computePivots(vector< const Mlfb * > &pivots, const vector< Mlfb > &mlfbs, const Plane &plane, const vector< SeqPos > &flatSeq)
Put all pivots into pivots.
void checkGraph(const vector< Mlfb > &mlfbs)
void checkMiddle(const Plane &plane, const vector< Mlfb > &mlfbs)
mpq_class getIndexSum(const vector< Mlfb > &mlfbs)
void checkDoubleTriangle(const Plane &plane, const vector< Mlfb > &mlfbs)
void computePlanes(vector< Plane > &planes, const GrobLat &lat, vector< Mlfb > &mlfbs)
const char * getEdgePos(size_t index)
void checkDoubleTrianglePlanes(const vector< Plane > &planes, const GrobLat &lat, const vector< Mlfb > &mlfbs)
void checkSide(vector< bool > &pivotOnSide, const vector< vector< SeqPos > > &side, const Plane &plane, const vector< Mlfb > &mlfbs)
void computeFlatSeq(vector< SeqPos > &seq, const vector< Mlfb > &mlfbs, const Plane &plane)
void check0Graph(const vector< Mlfb > &mlfbs)
SeqPos nextInSeq(SeqPos pos)
size_t pushOutFacetPositive(size_t facetPushOut, const vector< mpz_class > &rhs, const GrobLat &lat)
void getThinPlanes(vector< TriPlane > &planes, const GrobLat &lat)
void checkNonSums(const GrobLat &lat)
void computeRhs(vector< mpz_class > &rhs, const vector< Neighbor > points)
void checkPlane(const Plane &plane, const vector< Mlfb > &mlfbs)
void checkPlaneTri(const GrobLat &lat, const vector< Mlfb > &mlfbs, const vector< const Mlfb * > &pivots, const Plane &plane)
void checkPivotSeqs(vector< vector< SeqPos > > &pivotSeqs, const Plane &plane, const vector< Mlfb > &mlfbs, const vector< SeqPos > &flatSeq)
Perform checks where pivotSeqs are the 3 non-flat sequences on one side.
size_t computeFlatIntervalCount(const vector< SeqPos > &flatSeq)
bool solve(Matrix &sol, const Matrix &lhs, const Matrix &rhs)
Sets sol to some matrix such that lhs*sol=rhs and returns true if such a matrix exists.
mpq_class getParallelogramAreaSq(const Matrix &mat)
Returns the square of the area of the parallelogram whose vertices are the 4 rows of mat.
void product(Matrix &prod, const Matrix &a, const Matrix &b)
Sets prod to a * b.
bool isParallelogram(const Matrix &mat)
Returns true if the rows of mat are the (4) vertices of a parallelogram.
void nullSpace(Matrix &basis, const Matrix &matParam)
Sets the columns of basis to a basis of the null space of mat.
mpq_class determinant(const Matrix &mat)
Returns the determinant of mat.
void copyRow(Matrix &target, size_t targetRow, const Matrix &source, size_t sourceRow)
Copies row sourceRow from source to row targetRow of target.
bool hasSameRowSpace(const Matrix &a, const Matrix &b)
Returns true if a and b have the same row space.
void transpose(Matrix &trans, const Matrix &mat)
Sets trans to the transpose of mat.
void nameFactoryRegister(NameFactory< AbstractProduct > &factory)
Registers the string returned by ConcreteProduct::getStaticName() to a function that default-construc...
BigTermRecorder records all the terms it consumes into an ideal.
A lattice with associated Grobner basis/neighbors.
Neighbor getNeighbor(size_t row) const
GrobLat(const Matrix &matrix, const SatBinomIdeal &ideal)
Neighbor getSum(Neighbor a, Neighbor b) const
size_t getNeighborCount() const
const Matrix & getYMatrix() const
bool isSum(Neighbor n) const
const Matrix & getHMatrix() const
vector< Neighbor > _nonSums
const mpq_class & getZero() const
size_t getColCount() const
size_t getRowCount() const
const vector< mpz_class > & getRhs() const
Neighbor getPoint(size_t offset) const
vector< Neighbor > _points
vector< size_t > edgeHitsFacet
void reset(size_t offset, const vector< Neighbor > &points)
size_t getPointCount() const
bool isParallelogram() const
const Mlfb * getEdge(size_t indexParam) const
size_t getMinInitialFacet() const
size_t getHitsFacet(size_t indexParam) const
const mpq_class & getH(size_t i) const
const mpq_class & getY(size_t i) const
bool isFlat(const Mlfb &mlfb) const
vector< NeighborPlace > neighborPlace
bool isPivot(const Mlfb &mlfb) const
bool is22(const Mlfb &mlfb) const
NeighborPlace getPlace(Neighbor neighbor) const
map< size_t, size_t > typeCounts
size_t getTypeCount(size_t type) const
bool isSidePivot(const Mlfb &mlfb) const
size_t getMaxType() const
bool inPlane(Neighbor neighbor) const
size_t getType(const Mlfb &mlfb) const
Represents a saturated binomial ideal.
void getMatrix(Matrix &matrix) const
A facade for operations on monomial ideals using the Slice Algorithm.
vector< const Mlfb * > _bSideMlfbs
const vector< const Mlfb * > & getASideMlfbs() const
Tri(Neighbor a, Neighbor b, Neighbor sum, const vector< Mlfb > &mlfbs, const GrobLat &lat)
vector< Neighbor > _interior
vector< Neighbor > _boundary
vector< const Mlfb * > _aSideMlfbs
SeqPos getReverse() const
bool operator<(const SeqPos &pos) const
size_t getForwardFacet() const
size_t getBackFacet() const