Skip to content

Commit

Permalink
added new functions to gfanlib, restructured bbcone/bbfan
Browse files Browse the repository at this point in the history
- fans now can compute their codimension and dimension of lineality space
- shared functions are now in bbcone instead of bbfan
- bbpolytope now has getAmbientDimension and getDimension
  • Loading branch information
Yue Ren committed Jan 23, 2012
1 parent 8b9bedc commit 0cd8298
Show file tree
Hide file tree
Showing 10 changed files with 176 additions and 101 deletions.
117 changes: 100 additions & 17 deletions Singular/bbcone.cc
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
#include <kernel/longrat.h>
#include <Singular/subexpr.h>
#include <gfanlib/gfanlib.h>
#include <kernel/bbcone.h>
#include <ipshell.h>
#include <kernel/intvec.h>
#include <sstream>

#include <kernel/bbcone.h>
#include <kernel/bbfan.h>
#include <kernel/bbpolytope.h>

int coneID;

Expand Down Expand Up @@ -520,28 +522,109 @@ BOOLEAN getLinearForms(leftv res, leftv args)
return TRUE;
}

int getAmbientDimension(gfan::ZCone* zc)
BOOLEAN getAmbientDimension(leftv res, leftv args)
{
int i = zc->ambientDimension();
return i;
leftv u=args;
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) zc->ambientDimension();
return FALSE;
}
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getAmbientDimension(zf);
return FALSE;
}
if ((u != NULL) && (u->Typ() == polytopeID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getAmbientDimension(zc);
return FALSE;
}
WerrorS("getAmbientDimension: unexpected parameters");
return TRUE;
}

int getDimension(gfan::ZCone* zc)
BOOLEAN getDimension(leftv res, leftv args)
{
int i = zc->dimension();
return i;
leftv u=args;
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) zc->dimension();
return FALSE;
}
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getDimension(zf);
return FALSE;
}
if ((u != NULL) && (u->Typ() == polytopeID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getDimension(zc);
return FALSE;
}
WerrorS("getDimension: unexpected parameters");
return TRUE;
}

int getCodimension(gfan::ZCone* zc)
BOOLEAN getCodimension(leftv res, leftv args)
{
int i = zc->codimension();
return i;
leftv u=args;
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) zc->codimension();
return FALSE;
}
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getCodimension(zf);
return FALSE;
}
if ((u != NULL) && (u->Typ() == polytopeID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getCodimension(zc);
return FALSE;
}
WerrorS("getCodimension: unexpected parameters");
return TRUE;
}

int getLinealityDimension(gfan::ZCone* zc)
BOOLEAN getLinealityDimension(leftv res, leftv args)
{
int i = zc->dimensionOfLinealitySpace();
return i;
leftv u=args;
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) zc->dimensionOfLinealitySpace();
return FALSE;
}
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
res->rtyp = INT_CMD;
res->data = (char*) getLinealityDimension(zf);
return FALSE;
}
WerrorS("getLinealityDimension: unexpected parameters");
return TRUE;
}

BOOLEAN getMultiplicity(leftv res, leftv args)
Expand Down Expand Up @@ -948,10 +1031,10 @@ void bbcone_setup()
iiAddCproc("","getFacetNormals",FALSE,getFacetNormals);
iiAddCproc("","getImpliedEquations",FALSE,getImpliedEquations);
iiAddCproc("","getRelativeInteriorPoint",FALSE,getRelativeInteriorPoint);
// iiAddCproc("","getAmbientDimension",FALSE,getAmbientDimension);
// iiAddCproc("","getDimension",FALSE,getDimension);
// iiAddCproc("","getCodimension",FALSE,getCodimension);
// iiAddCproc("","getLinealityDimension",FALSE,getLinealityDimension);
iiAddCproc("","getAmbientDimension",FALSE,getAmbientDimension);
iiAddCproc("","getCodimension",FALSE,getCodimension);
iiAddCproc("","getDimension",FALSE,getDimension);
iiAddCproc("","getLinealityDimension",FALSE,getLinealityDimension);
iiAddCproc("","isOrigin",FALSE,isOrigin);
iiAddCproc("","isFullSpace",FALSE,isFullSpace);
iiAddCproc("","containsPositiveVector",FALSE,containsPositiveVector);
Expand Down
97 changes: 14 additions & 83 deletions Singular/bbfan.cc
Original file line number Diff line number Diff line change
Expand Up @@ -231,96 +231,24 @@ BOOLEAN fullFan(leftv res, leftv args)
return TRUE;
}

BOOLEAN getAmbientDimension(leftv res, leftv args)
int getAmbientDimension(gfan::ZFan* zf)
{
leftv u=args;
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
int d = zf->getAmbientDimension();
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
int d = getAmbientDimension(zc);
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
WerrorS("getAmbientDimension: unexpected parameters");
return TRUE;
return zf->getAmbientDimension();
}

BOOLEAN getDimension(leftv res, leftv args)
int getCodimension(gfan::ZFan* zf)
{
leftv u=args;
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
int d = zf->getDimension();
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
int d = getDimension(zc);
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
WerrorS("getDimension: unexpected parameters");
return TRUE;
return zf->getCodimension();
}

BOOLEAN getCodimension(leftv res, leftv args)
int getDimension(gfan::ZFan* zf)
{
leftv u=args;
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
int d = 0; // zf->getAmbientDimension() - zf->dimension();
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
int d = getCodimension(zc);
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
WerrorS("getCodimension: unexpected parameters");
return TRUE;
return zf->getDimension();
}

BOOLEAN getLinealityDimension(leftv res, leftv args)
int getLinealityDimension(gfan::ZFan* zf)
{
leftv u=args;
if ((u != NULL) && (u->Typ() == fanID))
{
gfan::ZFan* zf = (gfan::ZFan*)u->Data();
int d = 0; // zf->dimensionOfLinealitySpace();
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
if ((u != NULL) && (u->Typ() == coneID))
{
gfan::ZCone* zc = (gfan::ZCone*)u->Data();
int d = getLinealityDimension(zc);
res->rtyp = INT_CMD;
res->data = (char*) d;
return FALSE;
}
WerrorS("getLinealityDimension: unexpected parameters");
return TRUE;
return zf->getLinealityDimension();
}

BOOLEAN numberOfConesOfDimension(leftv res, leftv args)
Expand Down Expand Up @@ -780,9 +708,12 @@ void bbfan_setup()
b->blackbox_Assign=bbfan_Assign;
iiAddCproc("","emptyFan",FALSE,emptyFan);
iiAddCproc("","fullFan",FALSE,fullFan);
iiAddCproc("","getAmbientDimension",FALSE,getAmbientDimension);
iiAddCproc("","getDimension",FALSE,getDimension);
iiAddCproc("","getLinealityDimension",FALSE,getLinealityDimension);
/* the following functions are implemented in bbcone.cc */
// iiAddCproc("","getAmbientDimension",FALSE,getAmbientDimension);
// iiAddCproc("","getCodimension",FALSE,getDimension);
// iiAddCproc("","getDimension",FALSE,getDimension);
// iiAddCproc("","getLinealityDimension",FALSE,getLinealityDimension);
/********************************************************/
iiAddCproc("","isCompatible",FALSE,isCompatible);
iiAddCproc("","numberOfConesOfDimension",FALSE,numberOfConesOfDimension);
iiAddCproc("","ncones",FALSE,ncones);
Expand Down
22 changes: 22 additions & 0 deletions Singular/bbpolytope.cc
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,21 @@ BOOLEAN getVertices(leftv res, leftv args)
return TRUE;
}

int getAmbientDimension(gfan::ZCone* zc) // zc is meant to represent a polytope here
{ // hence ambientDimension-1
return zc->ambientDimension()-1;
}

int getCodimension(gfan::ZCone *zc)
{
return zc->codimension();
}

int getDimension(gfan::ZCone* zc)
{
return zc->dimension()-1;
}

void bbpolytope_setup()
{
blackbox *b=(blackbox*)omAlloc0(sizeof(blackbox));
Expand All @@ -336,10 +351,17 @@ void bbpolytope_setup()
iiAddCproc("","polytopeViaPoints",FALSE,polytopeViaPoints);
iiAddCproc("","polytopeViaInequalities",FALSE,polytopeViaInequalities);
iiAddCproc("","getVertices",FALSE,getVertices);
/********************************************************/
/* the following functions are implemented in bbcone.cc */
// iiAddCproc("","getAmbientDimension",FALSE,getAmbientDimension);
// iiAddCproc("","getDimension",FALSE,getDimension);
/********************************************************/
/* the following functions are identical to those in bbcone.cc */
// iiAddCproc("","setLinearForms",FALSE,setLinearForms);
// iiAddCproc("","getLinearForms",FALSE,getLinearForms);
// iiAddCproc("","setMultiplicity",FALSE,setMultiplicity);
// iiAddCproc("","getMultiplicity",FALSE,getMultiplicity);
/***************************************************************/
// iiAddCproc("","getEquations",FALSE,getEquations);
// iiAddCproc("","getInequalities",FALSE,getInequalities);
polytopeID=setBlackboxStuff(b,"polytope");
Expand Down
6 changes: 6 additions & 0 deletions gfanlib/gfanlib_symmetriccomplex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,12 @@ int SymmetricComplex::getMinDim()const
}


int SymmetricComplex::getLinDim()const
{
ZMatrix zm=linealitySpace;
return zm.reduceAndComputeRank();
}

bool SymmetricComplex::isMaximal(Cone const &c)const
{
if(c.isKnownToBeNonMaximal())return false;
Expand Down
1 change: 1 addition & 0 deletions gfanlib/gfanlib_symmetriccomplex.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ namespace gfan{
void insert(Cone const &c);
int getMaxDim()const;
int getMinDim()const;
int getLinDim()const;
bool isMaximal(Cone const &c)const;
bool isPure()const;
ZVector fvector(bool boundedPart=false)const;
Expand Down
18 changes: 18 additions & 0 deletions gfanlib/gfanlib_zfan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,15 @@ namespace gfan
assert(0);
return 0;
}
int ZFan::getCodimension()const
{
if(complex)
return complex->getAmbientDimension()-complex->getMaxDim();
if(coneCollection)
return coneCollection->getAmbientDimension()-coneCollection->getMaxDimension();
assert(0);
return 0;
}
int ZFan::getDimension()const
{
if(complex)
Expand All @@ -280,6 +289,15 @@ namespace gfan
assert(0);
return 0;
}
int ZFan::getLinealityDimension()const
{
if(complex)
return complex->getLinDim();
if(coneCollection)
return coneCollection->dimensionOfLinealitySpace();
assert(0);
return 0;
}
ZVector ZFan::getFVector()const
{
ensureComplex();
Expand Down
2 changes: 2 additions & 0 deletions gfanlib/gfanlib_zfan.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,9 @@ class ZFan
* Returns the dimension of the ambient space.
*/
int getAmbientDimension()const;
int getCodimension()const;
int getDimension()const;
int getLinealityDimension()const;
ZVector getFVector()const;
bool isSimplicial()const;
bool isPure()const;
Expand Down
1 change: 0 additions & 1 deletion kernel/bbcone.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ gfan::ZVector intvec2ZVector(const intvec* iVec);
std::string toString(gfan::ZMatrix const &m, char *tab=0);
int integerToInt(gfan::Integer const &V, bool &ok);

int getAmbientDimension(gfan::ZCone* zc);
int getDimension(gfan::ZCone* zc);
int getCodimension(gfan::ZCone* zc);
int getLinealityDimension(gfan::ZCone* zc);
Expand Down
Loading

0 comments on commit 0cd8298

Please sign in to comment.