1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
#include "traverser_stableintersection.h"
#include <iostream>
#include "halfopencone.h"
#include "tropical.h"
#include "division.h"
#include "wallideal.h"
#include "groebnerengine.h"
#include "tropical2.h"
#include "multiplicity.h"
#include "mixedvolume.h"
#include "log.h"
StableIntersectionTraverser::StableIntersectionTraverser(PolynomialSet const &coneGroebnerBasis_, PolynomialSet const &idealGroebnerBasis_):
coneGroebnerBasis(coneGroebnerBasis_),
idealGroebnerBasis(idealGroebnerBasis_),
theCone(coneGroebnerBasis_.getRing().getNumberOfVariables())
{
n=coneGroebnerBasis_.getRing().getNumberOfVariables();
updatePolyhedralCone(mixedVolume(coneGroebnerBasis));
PolyhedralCone homogeneitySpac=homogeneitySpace(coneGroebnerBasis);
d=homogeneitySpac.dimensionOfLinealitySpace();
}
void StableIntersectionTraverser::updatePolyhedralCone(int multiplicity)
{
theCone=PolyhedralCone(fastNormals(wallInequalities(idealGroebnerBasis)),wallInequalities(coneGroebnerBasis),n);
theCone.canonicalize();
theCone.setMultiplicity(multiplicity);
}
static void checkSameLeadingTerms(PolynomialSet const &a, PolynomialSet const &b)
{
assert(a.size()==b.size());
PolynomialSet::const_iterator A=a.begin();
for(PolynomialSet::const_iterator B=b.begin();B!=b.end();B++,A++)
assert(A->getMarked().m.exponent==B->getMarked().m.exponent);
}
void StableIntersectionTraverser::changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector)
{
IntegerVectorList m;
m.push_back(ridgeVector);
m.push_back(rayVector);
MatrixTermOrder T(m);
idealGroebnerBasis.markAndScale(T);
coneGroebnerBasis=initialFormsAssumeMarked(initialFormsAssumeMarked(idealGroebnerBasis,ridgeVector),rayVector);
updatePolyhedralCone(mixedVolume(coneGroebnerBasis));
checkSameLeadingTerms(idealGroebnerBasis,coneGroebnerBasis);
}
IntegerVectorList StableIntersectionTraverser::link(IntegerVector const &ridgeVector)
{
assert(idealGroebnerBasis.containsInClosedGroebnerCone(ridgeVector));
PolynomialSet tempIdeal=initialFormsAssumeMarked(idealGroebnerBasis,ridgeVector);
tempIdeal.simplestPolynomialsFirst();
PolyhedralFan theLink=tropicalHyperSurfaceIntersectionClosed(n,tempIdeal);
IntegerVectorList rays1=theLink.getRaysInPrintingOrder(0);
log2 {
cerr<<"Ray candidates:"<<endl;
AsciiPrinter(Stderr)<<rays1;
}
IntegerVectorList rays2;
for(IntegerVectorList::const_iterator i=rays1.begin();i!=rays1.end();i++)
if(mixedVolumePositive(initialForms(tempIdeal,*i)))
{
PolyhedralCone theRidge=theCone.faceContaining(ridgeVector);
IntegerVectorList linealityGenerators=theRidge.generatorsOfLinealitySpace();
// IntegerVectorList linealityGenerators=theRidge.linealitySpace().dualCone().getEquations();
IntegerVectorList generators;generators.push_back(*i);
PolyhedralCone ray=PolyhedralCone::givenByRays(generators,linealityGenerators,n);
ray.canonicalize();
rays2.push_back(ray.getUniquePoint());
// rays2.push_back(*i);
}
log2{
cerr<<"True rays:"<<endl;
AsciiPrinter(Stderr)<<rays2;
}
return rays2;
}
PolyhedralCone & StableIntersectionTraverser::refToPolyhedralCone()
{
return theCone;
}
|