GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
/*1* Normaliz2* Copyright (C) 2007-2014 Winfried Bruns, Bogdan Ichim, Christof Soeger3* This program is free software: you can redistribute it and/or modify4* it under the terms of the GNU General Public License as published by5* the Free Software Foundation, either version 3 of the License, or6* (at your option) any later version.7*8* This program is distributed in the hope that it will be useful,9* but WITHOUT ANY WARRANTY; without even the implied warranty of10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11* GNU General Public License for more details.12*13* You should have received a copy of the GNU General Public License14* along with this program. If not, see <http://www.gnu.org/licenses/>.15*16* As an exception, when this program is distributed through (i) the App Store17* by Apple Inc.; (ii) the Mac App Store by Apple Inc.; or (iii) Google Play18* by Google Inc., then that store may impose any digital rights management,19* device limits and/or redistribution restrictions that are required by its20* terms of service.21*/2223#ifdef NMZ_MIC_OFFLOAD24#pragma offload_attribute (push, target(mic))25#endif2627#include <vector>28#include <string>29#include <assert.h>3031#include "libnormaliz/cone_property.h"32#include "libnormaliz/libnormaliz.h"33#include "libnormaliz/normaliz_exception.h"3435namespace libnormaliz {36using std::bitset;37using std::vector;38using std::string;39using std::endl;404142/* Constructors */43ConeProperties::ConeProperties() {44CPs = bitset<ConeProperty::EnumSize>();45}46ConeProperties::ConeProperties(ConeProperty::Enum p1) {47CPs = bitset<ConeProperty::EnumSize>();48CPs.set(p1);49}50ConeProperties::ConeProperties(ConeProperty::Enum p1, ConeProperty::Enum p2) {51CPs = bitset<ConeProperty::EnumSize>();52CPs.set(p1);53CPs.set(p2);54}55ConeProperties::ConeProperties(ConeProperty::Enum p1, ConeProperty::Enum p2,56ConeProperty::Enum p3) {57CPs = bitset<ConeProperty::EnumSize>();58CPs.set(p1);59CPs.set(p2);60CPs.set(p3);61}62ConeProperties::ConeProperties(const bitset<ConeProperty::EnumSize>& props){63CPs = props;64}6566/* set Properties */67ConeProperties& ConeProperties::set(ConeProperty::Enum p1, bool value) {68CPs.set(p1, value);69return *this;70}71ConeProperties& ConeProperties::set(ConeProperty::Enum p1, ConeProperty::Enum p2) {72CPs.set(p1);73CPs.set(p2);74return *this;75}76ConeProperties& ConeProperties::set(const ConeProperties& ConeProps) {77CPs ^= ConeProps.CPs;78return *this;79}8081ConeProperties& ConeProperties::set(const std::string s, bool value) {82CPs.set(toConeProperty(s), value);83return *this;84}8586/* reset (=unset) properties */87ConeProperties& ConeProperties::reset(ConeProperty::Enum Property) {88CPs.set(Property, false);89return *this;90}91ConeProperties& ConeProperties::reset(const ConeProperties& ConeProps) {92CPs &= ~ConeProps.CPs;93return *this;94}9596ConeProperties& ConeProperties::reset_compute_options() {97CPs.set(ConeProperty::Projection, false);98CPs.set(ConeProperty::ProjectionFloat, false);99CPs.set(ConeProperty::NoProjection, false);100CPs.set(ConeProperty::Approximate, false);101CPs.set(ConeProperty::BottomDecomposition, false);102CPs.set(ConeProperty::NoBottomDec, false);103CPs.set(ConeProperty::DefaultMode, false);104CPs.set(ConeProperty::DualMode, false);105CPs.set(ConeProperty::PrimalMode, false);106CPs.set(ConeProperty::KeepOrder, false);107CPs.set(ConeProperty::HSOP, false);108CPs.set(ConeProperty::Symmetrize, false);109CPs.set(ConeProperty::NoSymmetrization, false);110CPs.set(ConeProperty::BigInt, false);111CPs.set(ConeProperty::NoSubdivision, false);112CPs.set(ConeProperty::NoNestedTri, false);113CPs.set(ConeProperty::NoPeriodBound, false);114CPs.set(ConeProperty::SCIP, false);115return *this;116}117118/* return a new ConeProperties object with only the goals/options set,119* which are set in this object120*/121ConeProperties ConeProperties::goals() {122ConeProperties ret(*this);123ret.reset_compute_options();124return ret;125}126ConeProperties ConeProperties::options() {127ConeProperties ret;128ret.set(ConeProperty::Projection, CPs.test(ConeProperty::Projection));129ret.set(ConeProperty::ProjectionFloat, CPs.test(ConeProperty::ProjectionFloat));130ret.set(ConeProperty::NoProjection, CPs.test(ConeProperty::NoProjection));131ret.set(ConeProperty::Approximate, CPs.test(ConeProperty::Approximate));132ret.set(ConeProperty::BottomDecomposition, CPs.test(ConeProperty::BottomDecomposition));133ret.set(ConeProperty::NoBottomDec, CPs.test(ConeProperty::NoBottomDec));134ret.set(ConeProperty::DefaultMode, CPs.test(ConeProperty::DefaultMode));135ret.set(ConeProperty::DualMode, CPs.test(ConeProperty::DualMode));136ret.set(ConeProperty::KeepOrder, CPs.test(ConeProperty::KeepOrder));137ret.set(ConeProperty::HSOP, CPs.test(ConeProperty::HSOP));138ret.set(ConeProperty::Symmetrize, CPs.test(ConeProperty::Symmetrize));139ret.set(ConeProperty::NoSymmetrization, CPs.test(ConeProperty::NoSymmetrization));140ret.set(ConeProperty::PrimalMode, CPs.test(ConeProperty::PrimalMode));141ret.set(ConeProperty::NoSubdivision, CPs.test(ConeProperty::NoSubdivision));142ret.set(ConeProperty::NoNestedTri, CPs.test(ConeProperty::NoNestedTri));143ret.set(ConeProperty::BigInt, CPs.test(ConeProperty::BigInt));144ret.set(ConeProperty::NoPeriodBound, CPs.test(ConeProperty::NoPeriodBound));145ret.set(ConeProperty::SCIP, CPs.test(ConeProperty::SCIP));146return ret;147}148149/* test which/how many properties are set */150bool ConeProperties::test(ConeProperty::Enum Property) const {151return CPs.test(Property);152}153bool ConeProperties::any() const {154return CPs.any();155}156bool ConeProperties::none() const {157return CPs.none();158}159size_t ConeProperties::count() const {160return CPs.count();161}162163164/* add preconditions */165void ConeProperties::set_preconditions(bool inhomogeneous) {166167if(CPs.test(ConeProperty::VerticesFloat)){168CPs.set(ConeProperty::SupportHyperplanes);169if(!inhomogeneous)170CPs.set(ConeProperty::Grading);171}172173if(CPs.test(ConeProperty::ProjectionFloat))174CPs.set(ConeProperty::Projection);175176if(CPs.test(ConeProperty::GeneratorOfInterior))177CPs.set(ConeProperty::IsGorenstein);178179if(CPs.test(ConeProperty::IsGorenstein))180CPs.set(ConeProperty::SupportHyperplanes);181182if(CPs.test(ConeProperty::NoNestedTri))183CPs.set(ConeProperty::NoSubdivision);184185if (CPs.test(ConeProperty::WitnessNotIntegrallyClosed))186CPs.set(ConeProperty::IsIntegrallyClosed);187188if (CPs.test(ConeProperty::IsDeg1HilbertBasis)) {189CPs.set(ConeProperty::HilbertBasis);190CPs.set(ConeProperty::Grading);191}192if (CPs.test(ConeProperty::IsDeg1ExtremeRays)) {193CPs.set(ConeProperty::ExtremeRays);194CPs.set(ConeProperty::Grading);195}196if (CPs.test(ConeProperty::Grading))197CPs.set(ConeProperty::Generators);198199if (CPs.test(ConeProperty::IsPointed))200CPs.set(ConeProperty::ExtremeRays);201202if (CPs.test(ConeProperty::VerticesOfPolyhedron))203CPs.set(ConeProperty::ExtremeRays);204205if (CPs.test(ConeProperty::ExtremeRays))206CPs.set(ConeProperty::SupportHyperplanes);207208if (CPs.test(ConeProperty::HSOP)){209CPs.set(ConeProperty::SupportHyperplanes);210CPs.set(ConeProperty::HilbertSeries);211}212213if(CPs.test(ConeProperty::ModuleGeneratorsOverOriginalMonoid))214CPs.set(ConeProperty::HilbertBasis);215216if (CPs.test(ConeProperty::ModuleGenerators))217CPs.set(ConeProperty::HilbertBasis);218219if (CPs.test(ConeProperty::MaximalSubspace))220CPs.set(ConeProperty::SupportHyperplanes);221222if (CPs.test(ConeProperty::ConeDecomposition))223CPs.set(ConeProperty::Triangulation);224225if (CPs.test(ConeProperty::GradingDenom))226CPs.reset(ConeProperty::Grading);227228if(CPs.test(ConeProperty::UnitGroupIndex))229CPs.set(ConeProperty::HilbertBasis);230231if(CPs.test(ConeProperty::Equations) || CPs.test(ConeProperty::Congruences) || CPs.test(ConeProperty::ExternalIndex))232CPs.set(ConeProperty::Sublattice);233234if(CPs.test(ConeProperty::Rank))235CPs.set(ConeProperty::Sublattice);236237if(CPs.test(ConeProperty::HilbertQuasiPolynomial))238CPs.set(ConeProperty::HilbertSeries);239240if(CPs.test(ConeProperty::Multiplicity) || CPs.test(ConeProperty::HilbertSeries))241CPs.set(ConeProperty::SupportHyperplanes); // to meke them computed if Symmetrize is used242243if (CPs.test(ConeProperty::Integral)){244// CPs.set(ConeProperty::Multiplicity);245CPs.set(ConeProperty::Triangulation);246}247248if (CPs.test(ConeProperty::VirtualMultiplicity)){249// CPs.set(ConeProperty::Multiplicity);250CPs.set(ConeProperty::Triangulation);251}252253if (CPs.test(ConeProperty::WeightedEhrhartQuasiPolynomial))254CPs.set(ConeProperty::WeightedEhrhartSeries);255256if (CPs.test(ConeProperty::WeightedEhrhartSeries)){257// CPs.set(ConeProperty::Multiplicity);258CPs.set(ConeProperty::StanleyDec);259}260}261262/* removes ignored compute options and sets implications */263void ConeProperties::prepare_compute_options(bool inhomogeneous) {264265if (CPs.test(ConeProperty::IntegerHull)){266if(inhomogeneous){267CPs.set(ConeProperty::HilbertBasis);268}269else{270CPs.set(ConeProperty::Deg1Elements);271}272}273274// -d without -1 means: compute Hilbert basis in dual mode275if (CPs.test(ConeProperty::DualMode) && !CPs.test(ConeProperty::Deg1Elements)){276CPs.set(ConeProperty::HilbertBasis);277}278279if(CPs.test(ConeProperty::ModuleGeneratorsOverOriginalMonoid)) // can't be computed in dual mode280CPs.reset(ConeProperty::DualMode);281282if((CPs.test(ConeProperty::Approximate) || CPs.test(ConeProperty::Projection))){283if(inhomogeneous)284CPs.set(ConeProperty::HilbertBasis);285else286CPs.set(ConeProperty::Deg1Elements);287}288289// dual mode has priority, approximation and projection make no sense if HB is computed, except possibly with inhomogeneous data290if(CPs.test(ConeProperty::DualMode) || (CPs.test(ConeProperty::HilbertBasis) && !inhomogeneous)){291CPs.reset(ConeProperty::Approximate);292CPs.reset(ConeProperty::Projection);293}294295if ((CPs.test(ConeProperty::DualMode) || CPs.test(ConeProperty::Approximate) || CPs.test(ConeProperty::Projection))296&& (CPs.test(ConeProperty::HilbertSeries) || CPs.test(ConeProperty::StanleyDec))297&& !CPs.test(ConeProperty::HilbertBasis)){298CPs.reset(ConeProperty::DualMode); //it makes no sense to compute only deg 1 elements in dual mode299CPs.reset(ConeProperty::Approximate); // or by approximation or projection if the300CPs.reset(ConeProperty::Projection); // Stanley decomposition must be computed anyway301}302303if(inhomogeneous && CPs.test(ConeProperty::SupportHyperplanes))304CPs.set(ConeProperty::AffineDim);305306if(CPs.test(ConeProperty::DefaultMode)){307CPs.set(ConeProperty::HilbertBasis);308CPs.set(ConeProperty::HilbertSeries);309if(!inhomogeneous)310CPs.set(ConeProperty::ClassGroup);311CPs.set(ConeProperty::SupportHyperplanes);312}313}314315void ConeProperties::check_conflicting_variants() {316317if(318(CPs.test(ConeProperty::BottomDecomposition) && CPs.test(ConeProperty::NoBottomDec))319|| (CPs.test(ConeProperty::DualMode) && CPs.test(ConeProperty::PrimalMode))320|| (CPs.test(ConeProperty::Symmetrize) && CPs.test(ConeProperty::NoSymmetrization))321|| (CPs.test(ConeProperty::Projection) && CPs.test(ConeProperty::NoProjection))322|| (CPs.test(ConeProperty::Projection) && CPs.test(ConeProperty::ProjectionFloat))323|| (CPs.test(ConeProperty::NoProjection) && CPs.test(ConeProperty::ProjectionFloat))324)325throw BadInputException("Contradictory algorithmic variants in options.");326327size_t nr_var=0;328if(CPs.test(ConeProperty::DualMode))329nr_var++;330if(CPs.test(ConeProperty::PrimalMode))331nr_var++;332if(CPs.test(ConeProperty::Projection))333nr_var++;334if(CPs.test(ConeProperty::Approximate))335nr_var++;336if(nr_var>1)337throw BadInputException("Only one of DualMode, PrimalMode, Approximate, Projection allowed.");338}339340void ConeProperties::check_sanity(bool inhomogeneous) {341342ConeProperty::Enum prop;343344if(CPs.test(ConeProperty::IsTriangulationNested) || CPs.test(ConeProperty::IsTriangulationPartial))345throw BadInputException("ConeProperty not allowed in compute().");346347for (size_t i=0; i<ConeProperty::EnumSize; i++) {348if (CPs.test(i)) {349prop = static_cast<ConeProperty::Enum>(i);350if (inhomogeneous) {351if ( prop == ConeProperty::Deg1Elements352|| prop == ConeProperty::StanleyDec353|| prop == ConeProperty::Triangulation354|| prop == ConeProperty::ConeDecomposition355|| prop == ConeProperty::IsIntegrallyClosed356|| prop == ConeProperty::WitnessNotIntegrallyClosed357|| prop == ConeProperty::ClassGroup358|| prop == ConeProperty::Symmetrize359|| prop == ConeProperty::NoSymmetrization360|| prop == ConeProperty::InclusionExclusionData361|| prop == ConeProperty::ExcludedFaces362|| prop == ConeProperty::UnitGroupIndex363|| prop == ConeProperty::ReesPrimaryMultiplicity364|| prop == ConeProperty::IsReesPrimary365|| prop == ConeProperty::IsDeg1HilbertBasis366|| prop == ConeProperty::IsDeg1ExtremeRays367|| prop == ConeProperty::Integral368|| prop == ConeProperty::IsGorenstein369|| prop == ConeProperty::GeneratorOfInterior370) {371throw BadInputException(toString(prop) + " not computable in the inhomogeneous case.");372}373} else { // homgeneous374if ( prop == ConeProperty::VerticesOfPolyhedron375|| prop == ConeProperty::ModuleRank376|| prop == ConeProperty::ModuleGenerators377) {378throw BadInputException(toString(prop) + " only computable in the inhomogeneous case.");379}380}381} //end if test(i)382}383}384385386/* conversion */387namespace {388// only to initialize the CPN in ConePropertyNames389vector<string> initializeCPN() {390vector<string> CPN(ConeProperty::EnumSize);391CPN.at(ConeProperty::Generators) = "Generators";392CPN.at(ConeProperty::ExtremeRays) = "ExtremeRays";393CPN.at(ConeProperty::VerticesFloat) = "VerticesFloat";394CPN.at(ConeProperty::VerticesOfPolyhedron) = "VerticesOfPolyhedron";395CPN.at(ConeProperty::SupportHyperplanes) = "SupportHyperplanes";396CPN.at(ConeProperty::TriangulationSize) = "TriangulationSize";397CPN.at(ConeProperty::TriangulationDetSum) = "TriangulationDetSum";398CPN.at(ConeProperty::Triangulation) = "Triangulation";399CPN.at(ConeProperty::Multiplicity) = "Multiplicity";400CPN.at(ConeProperty::RecessionRank) = "RecessionRank";401CPN.at(ConeProperty::AffineDim) = "AffineDim";402CPN.at(ConeProperty::ModuleRank) = "ModuleRank";403CPN.at(ConeProperty::HilbertBasis) = "HilbertBasis";404CPN.at(ConeProperty::ModuleGenerators) = "ModuleGenerators";405CPN.at(ConeProperty::Deg1Elements) = "Deg1Elements";406CPN.at(ConeProperty::HilbertSeries) = "HilbertSeries";407CPN.at(ConeProperty::Grading) = "Grading";408CPN.at(ConeProperty::IsPointed) = "IsPointed";409CPN.at(ConeProperty::IsDeg1ExtremeRays) = "IsDeg1ExtremeRays";410CPN.at(ConeProperty::IsDeg1HilbertBasis) = "IsDeg1HilbertBasis";411CPN.at(ConeProperty::IsIntegrallyClosed) = "IsIntegrallyClosed";412CPN.at(ConeProperty::WitnessNotIntegrallyClosed) = "WitnessNotIntegrallyClosed";413CPN.at(ConeProperty::OriginalMonoidGenerators) = "OriginalMonoidGenerators";414CPN.at(ConeProperty::IsReesPrimary) = "IsReesPrimary";415CPN.at(ConeProperty::ReesPrimaryMultiplicity) = "ReesPrimaryMultiplicity";416CPN.at(ConeProperty::StanleyDec) = "StanleyDec";417CPN.at(ConeProperty::ExcludedFaces) = "ExcludedFaces";418CPN.at(ConeProperty::Dehomogenization) = "Dehomogenization";419CPN.at(ConeProperty::InclusionExclusionData) = "InclusionExclusionData";420CPN.at(ConeProperty::Sublattice) = "Sublattice";421CPN.at(ConeProperty::ClassGroup) = "ClassGroup";422CPN.at(ConeProperty::ModuleGeneratorsOverOriginalMonoid) = "ModuleGeneratorsOverOriginalMonoid";423CPN.at(ConeProperty::Approximate) = "Approximate";424CPN.at(ConeProperty::BottomDecomposition) = "BottomDecomposition";425CPN.at(ConeProperty::DefaultMode) = "DefaultMode";426CPN.at(ConeProperty::DualMode) = "DualMode";427CPN.at(ConeProperty::KeepOrder) = "KeepOrder";428CPN.at(ConeProperty::IntegerHull) = "IntegerHull";429CPN.at(ConeProperty::MaximalSubspace) = "MaximalSubspace";430CPN.at(ConeProperty::ConeDecomposition) = "ConeDecomposition";431CPN.at(ConeProperty::HSOP) = "HSOP";432CPN.at(ConeProperty::NoBottomDec) = "NoBottomDec";433CPN.at(ConeProperty::PrimalMode) = "PrimalMode";434CPN.at(ConeProperty::Symmetrize) = "Symmetrize";435CPN.at(ConeProperty::NoSymmetrization) = "NoSymmetrization";436CPN.at(ConeProperty::EmbeddingDim) = "EmbeddingDim";437CPN.at(ConeProperty::Rank) = "Rank";438CPN.at(ConeProperty::InternalIndex) = "InternalIndex";439CPN.at(ConeProperty::IsInhomogeneous) = "IsInhomogeneous";440CPN.at(ConeProperty::UnitGroupIndex) = "UnitGroupIndex";441CPN.at(ConeProperty::GradingDenom) = "GradingDenom";442CPN.at(ConeProperty::Equations) = "Equations";443CPN.at(ConeProperty::Congruences) = "Congruences";444CPN.at(ConeProperty::ExternalIndex) = "ExternalIndex";445CPN.at(ConeProperty::HilbertQuasiPolynomial) = "HilbertQuasiPolynomial";446CPN.at(ConeProperty::IsTriangulationNested) = "IsTriangulationNested";447CPN.at(ConeProperty::IsTriangulationPartial) = "IsTriangulationPartial";448CPN.at(ConeProperty::BigInt) = "BigInt";449CPN.at(ConeProperty::NoSubdivision) = "NoSubdivision";450CPN.at(ConeProperty::Projection) = "Projection";451CPN.at(ConeProperty::ProjectionFloat) = "ProjectionFloat";452CPN.at(ConeProperty::NoProjection) = "NoProjection";453CPN.at(ConeProperty::NoNestedTri) = "NoNestedTri";454CPN.at(ConeProperty::Integral) = "Integral";455CPN.at(ConeProperty::VirtualMultiplicity) = "VirtualMultiplicity";456CPN.at(ConeProperty::WeightedEhrhartSeries) = "WeightedEhrhartSeries";457CPN.at(ConeProperty::WeightedEhrhartQuasiPolynomial) = "WeightedEhrhartQuasiPolynomial";458CPN.at(ConeProperty::IsGorenstein) = "IsGorenstein";459CPN.at(ConeProperty::NoPeriodBound) = "NoPeriodBound";460CPN.at(ConeProperty::SCIP) = "SCIP";461CPN.at(ConeProperty::GeneratorOfInterior) = "GeneratorOfInterior";462463// detect changes in size of Enum, to remember to update CPN!464static_assert (ConeProperty::EnumSize == 71,465"ConeProperties Enum size does not fit! Update cone_property.cpp!");466// assert all fields contain an non-empty string467for (size_t i=0; i<ConeProperty::EnumSize; i++) {468assert(CPN.at(i).size() > 0);469}470return CPN;471}472473const vector<string>& ConePropertyNames() {474static const vector<string> CPN(initializeCPN());475return CPN;476}477}478479bool isConeProperty(ConeProperty::Enum& cp, const std::string& s) {480const vector<string>& CPN = ConePropertyNames();481for (size_t i=0; i<ConeProperty::EnumSize; i++) {482if (CPN[i] == s) {483cp = static_cast<ConeProperty::Enum>(i);484return true;485}486}487return false;488}489490ConeProperty::Enum toConeProperty(const std::string& s) {491ConeProperty::Enum cp;492if (isConeProperty(cp, s)) return cp;493throw BadInputException("Unknown ConeProperty string \"" + s + "\"");494}495496const std::string& toString(ConeProperty::Enum cp) {497return ConePropertyNames()[cp];498}499500/* print it in a nice way */501std::ostream& operator<< (std::ostream& out, const ConeProperties& CP){502for (size_t i=0; i<ConeProperty::EnumSize; i++) {503if (CP.CPs.test(i)) out << toString(static_cast<ConeProperty::Enum>(i)) << " ";504}505return out;506}507508509} /* end namespace libnormaliz */510511#ifdef NMZ_MIC_OFFLOAD512#pragma offload_attribute (pop)513#endif514515