Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

563624 views
1
/*
2
* Normaliz
3
* Copyright (C) 2007-2014 Winfried Bruns, Bogdan Ichim, Christof Soeger
4
* This program is free software: you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation, either version 3 of the License, or
7
* (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
*
17
* As an exception, when this program is distributed through (i) the App Store
18
* by Apple Inc.; (ii) the Mac App Store by Apple Inc.; or (iii) Google Play
19
* by Google Inc., then that store may impose any digital rights management,
20
* device limits and/or redistribution restrictions that are required by its
21
* terms of service.
22
*/
23
24
#ifdef NMZ_MIC_OFFLOAD
25
#pragma offload_attribute (push, target(mic))
26
#endif
27
28
#include <vector>
29
#include <string>
30
#include <assert.h>
31
32
#include "libnormaliz/cone_property.h"
33
#include "libnormaliz/libnormaliz.h"
34
#include "libnormaliz/normaliz_exception.h"
35
36
namespace libnormaliz {
37
using std::bitset;
38
using std::vector;
39
using std::string;
40
using std::endl;
41
42
43
/* Constructors */
44
ConeProperties::ConeProperties() {
45
CPs = bitset<ConeProperty::EnumSize>();
46
}
47
ConeProperties::ConeProperties(ConeProperty::Enum p1) {
48
CPs = bitset<ConeProperty::EnumSize>();
49
CPs.set(p1);
50
}
51
ConeProperties::ConeProperties(ConeProperty::Enum p1, ConeProperty::Enum p2) {
52
CPs = bitset<ConeProperty::EnumSize>();
53
CPs.set(p1);
54
CPs.set(p2);
55
}
56
ConeProperties::ConeProperties(ConeProperty::Enum p1, ConeProperty::Enum p2,
57
ConeProperty::Enum p3) {
58
CPs = bitset<ConeProperty::EnumSize>();
59
CPs.set(p1);
60
CPs.set(p2);
61
CPs.set(p3);
62
}
63
ConeProperties::ConeProperties(const bitset<ConeProperty::EnumSize>& props){
64
CPs = props;
65
}
66
67
/* set Properties */
68
ConeProperties& ConeProperties::set(ConeProperty::Enum p1, bool value) {
69
CPs.set(p1, value);
70
return *this;
71
}
72
ConeProperties& ConeProperties::set(ConeProperty::Enum p1, ConeProperty::Enum p2) {
73
CPs.set(p1);
74
CPs.set(p2);
75
return *this;
76
}
77
ConeProperties& ConeProperties::set(const ConeProperties& ConeProps) {
78
CPs ^= ConeProps.CPs;
79
return *this;
80
}
81
82
ConeProperties& ConeProperties::set(const std::string s, bool value) {
83
CPs.set(toConeProperty(s), value);
84
return *this;
85
}
86
87
/* reset (=unset) properties */
88
ConeProperties& ConeProperties::reset(ConeProperty::Enum Property) {
89
CPs.set(Property, false);
90
return *this;
91
}
92
ConeProperties& ConeProperties::reset(const ConeProperties& ConeProps) {
93
CPs &= ~ConeProps.CPs;
94
return *this;
95
}
96
97
ConeProperties& ConeProperties::reset_compute_options() {
98
CPs.set(ConeProperty::Projection, false);
99
CPs.set(ConeProperty::ProjectionFloat, false);
100
CPs.set(ConeProperty::NoProjection, false);
101
CPs.set(ConeProperty::Approximate, false);
102
CPs.set(ConeProperty::BottomDecomposition, false);
103
CPs.set(ConeProperty::NoBottomDec, false);
104
CPs.set(ConeProperty::DefaultMode, false);
105
CPs.set(ConeProperty::DualMode, false);
106
CPs.set(ConeProperty::PrimalMode, false);
107
CPs.set(ConeProperty::KeepOrder, false);
108
CPs.set(ConeProperty::HSOP, false);
109
CPs.set(ConeProperty::Symmetrize, false);
110
CPs.set(ConeProperty::NoSymmetrization, false);
111
CPs.set(ConeProperty::BigInt, false);
112
CPs.set(ConeProperty::NoSubdivision, false);
113
CPs.set(ConeProperty::NoNestedTri, false);
114
CPs.set(ConeProperty::NoPeriodBound, false);
115
CPs.set(ConeProperty::SCIP, false);
116
return *this;
117
}
118
119
/* return a new ConeProperties object with only the goals/options set,
120
* which are set in this object
121
*/
122
ConeProperties ConeProperties::goals() {
123
ConeProperties ret(*this);
124
ret.reset_compute_options();
125
return ret;
126
}
127
ConeProperties ConeProperties::options() {
128
ConeProperties ret;
129
ret.set(ConeProperty::Projection, CPs.test(ConeProperty::Projection));
130
ret.set(ConeProperty::ProjectionFloat, CPs.test(ConeProperty::ProjectionFloat));
131
ret.set(ConeProperty::NoProjection, CPs.test(ConeProperty::NoProjection));
132
ret.set(ConeProperty::Approximate, CPs.test(ConeProperty::Approximate));
133
ret.set(ConeProperty::BottomDecomposition, CPs.test(ConeProperty::BottomDecomposition));
134
ret.set(ConeProperty::NoBottomDec, CPs.test(ConeProperty::NoBottomDec));
135
ret.set(ConeProperty::DefaultMode, CPs.test(ConeProperty::DefaultMode));
136
ret.set(ConeProperty::DualMode, CPs.test(ConeProperty::DualMode));
137
ret.set(ConeProperty::KeepOrder, CPs.test(ConeProperty::KeepOrder));
138
ret.set(ConeProperty::HSOP, CPs.test(ConeProperty::HSOP));
139
ret.set(ConeProperty::Symmetrize, CPs.test(ConeProperty::Symmetrize));
140
ret.set(ConeProperty::NoSymmetrization, CPs.test(ConeProperty::NoSymmetrization));
141
ret.set(ConeProperty::PrimalMode, CPs.test(ConeProperty::PrimalMode));
142
ret.set(ConeProperty::NoSubdivision, CPs.test(ConeProperty::NoSubdivision));
143
ret.set(ConeProperty::NoNestedTri, CPs.test(ConeProperty::NoNestedTri));
144
ret.set(ConeProperty::BigInt, CPs.test(ConeProperty::BigInt));
145
ret.set(ConeProperty::NoPeriodBound, CPs.test(ConeProperty::NoPeriodBound));
146
ret.set(ConeProperty::SCIP, CPs.test(ConeProperty::SCIP));
147
return ret;
148
}
149
150
/* test which/how many properties are set */
151
bool ConeProperties::test(ConeProperty::Enum Property) const {
152
return CPs.test(Property);
153
}
154
bool ConeProperties::any() const {
155
return CPs.any();
156
}
157
bool ConeProperties::none() const {
158
return CPs.none();
159
}
160
size_t ConeProperties::count() const {
161
return CPs.count();
162
}
163
164
165
/* add preconditions */
166
void ConeProperties::set_preconditions(bool inhomogeneous) {
167
168
if(CPs.test(ConeProperty::VerticesFloat)){
169
CPs.set(ConeProperty::SupportHyperplanes);
170
if(!inhomogeneous)
171
CPs.set(ConeProperty::Grading);
172
}
173
174
if(CPs.test(ConeProperty::ProjectionFloat))
175
CPs.set(ConeProperty::Projection);
176
177
if(CPs.test(ConeProperty::GeneratorOfInterior))
178
CPs.set(ConeProperty::IsGorenstein);
179
180
if(CPs.test(ConeProperty::IsGorenstein))
181
CPs.set(ConeProperty::SupportHyperplanes);
182
183
if(CPs.test(ConeProperty::NoNestedTri))
184
CPs.set(ConeProperty::NoSubdivision);
185
186
if (CPs.test(ConeProperty::WitnessNotIntegrallyClosed))
187
CPs.set(ConeProperty::IsIntegrallyClosed);
188
189
if (CPs.test(ConeProperty::IsDeg1HilbertBasis)) {
190
CPs.set(ConeProperty::HilbertBasis);
191
CPs.set(ConeProperty::Grading);
192
}
193
if (CPs.test(ConeProperty::IsDeg1ExtremeRays)) {
194
CPs.set(ConeProperty::ExtremeRays);
195
CPs.set(ConeProperty::Grading);
196
}
197
if (CPs.test(ConeProperty::Grading))
198
CPs.set(ConeProperty::Generators);
199
200
if (CPs.test(ConeProperty::IsPointed))
201
CPs.set(ConeProperty::ExtremeRays);
202
203
if (CPs.test(ConeProperty::VerticesOfPolyhedron))
204
CPs.set(ConeProperty::ExtremeRays);
205
206
if (CPs.test(ConeProperty::ExtremeRays))
207
CPs.set(ConeProperty::SupportHyperplanes);
208
209
if (CPs.test(ConeProperty::HSOP)){
210
CPs.set(ConeProperty::SupportHyperplanes);
211
CPs.set(ConeProperty::HilbertSeries);
212
}
213
214
if(CPs.test(ConeProperty::ModuleGeneratorsOverOriginalMonoid))
215
CPs.set(ConeProperty::HilbertBasis);
216
217
if (CPs.test(ConeProperty::ModuleGenerators))
218
CPs.set(ConeProperty::HilbertBasis);
219
220
if (CPs.test(ConeProperty::MaximalSubspace))
221
CPs.set(ConeProperty::SupportHyperplanes);
222
223
if (CPs.test(ConeProperty::ConeDecomposition))
224
CPs.set(ConeProperty::Triangulation);
225
226
if (CPs.test(ConeProperty::GradingDenom))
227
CPs.reset(ConeProperty::Grading);
228
229
if(CPs.test(ConeProperty::UnitGroupIndex))
230
CPs.set(ConeProperty::HilbertBasis);
231
232
if(CPs.test(ConeProperty::Equations) || CPs.test(ConeProperty::Congruences) || CPs.test(ConeProperty::ExternalIndex))
233
CPs.set(ConeProperty::Sublattice);
234
235
if(CPs.test(ConeProperty::Rank))
236
CPs.set(ConeProperty::Sublattice);
237
238
if(CPs.test(ConeProperty::HilbertQuasiPolynomial))
239
CPs.set(ConeProperty::HilbertSeries);
240
241
if(CPs.test(ConeProperty::Multiplicity) || CPs.test(ConeProperty::HilbertSeries))
242
CPs.set(ConeProperty::SupportHyperplanes); // to meke them computed if Symmetrize is used
243
244
if (CPs.test(ConeProperty::Integral)){
245
// CPs.set(ConeProperty::Multiplicity);
246
CPs.set(ConeProperty::Triangulation);
247
}
248
249
if (CPs.test(ConeProperty::VirtualMultiplicity)){
250
// CPs.set(ConeProperty::Multiplicity);
251
CPs.set(ConeProperty::Triangulation);
252
}
253
254
if (CPs.test(ConeProperty::WeightedEhrhartQuasiPolynomial))
255
CPs.set(ConeProperty::WeightedEhrhartSeries);
256
257
if (CPs.test(ConeProperty::WeightedEhrhartSeries)){
258
// CPs.set(ConeProperty::Multiplicity);
259
CPs.set(ConeProperty::StanleyDec);
260
}
261
}
262
263
/* removes ignored compute options and sets implications */
264
void ConeProperties::prepare_compute_options(bool inhomogeneous) {
265
266
if (CPs.test(ConeProperty::IntegerHull)){
267
if(inhomogeneous){
268
CPs.set(ConeProperty::HilbertBasis);
269
}
270
else{
271
CPs.set(ConeProperty::Deg1Elements);
272
}
273
}
274
275
// -d without -1 means: compute Hilbert basis in dual mode
276
if (CPs.test(ConeProperty::DualMode) && !CPs.test(ConeProperty::Deg1Elements)){
277
CPs.set(ConeProperty::HilbertBasis);
278
}
279
280
if(CPs.test(ConeProperty::ModuleGeneratorsOverOriginalMonoid)) // can't be computed in dual mode
281
CPs.reset(ConeProperty::DualMode);
282
283
if((CPs.test(ConeProperty::Approximate) || CPs.test(ConeProperty::Projection))){
284
if(inhomogeneous)
285
CPs.set(ConeProperty::HilbertBasis);
286
else
287
CPs.set(ConeProperty::Deg1Elements);
288
}
289
290
// dual mode has priority, approximation and projection make no sense if HB is computed, except possibly with inhomogeneous data
291
if(CPs.test(ConeProperty::DualMode) || (CPs.test(ConeProperty::HilbertBasis) && !inhomogeneous)){
292
CPs.reset(ConeProperty::Approximate);
293
CPs.reset(ConeProperty::Projection);
294
}
295
296
if ((CPs.test(ConeProperty::DualMode) || CPs.test(ConeProperty::Approximate) || CPs.test(ConeProperty::Projection))
297
&& (CPs.test(ConeProperty::HilbertSeries) || CPs.test(ConeProperty::StanleyDec))
298
&& !CPs.test(ConeProperty::HilbertBasis)){
299
CPs.reset(ConeProperty::DualMode); //it makes no sense to compute only deg 1 elements in dual mode
300
CPs.reset(ConeProperty::Approximate); // or by approximation or projection if the
301
CPs.reset(ConeProperty::Projection); // Stanley decomposition must be computed anyway
302
}
303
304
if(inhomogeneous && CPs.test(ConeProperty::SupportHyperplanes))
305
CPs.set(ConeProperty::AffineDim);
306
307
if(CPs.test(ConeProperty::DefaultMode)){
308
CPs.set(ConeProperty::HilbertBasis);
309
CPs.set(ConeProperty::HilbertSeries);
310
if(!inhomogeneous)
311
CPs.set(ConeProperty::ClassGroup);
312
CPs.set(ConeProperty::SupportHyperplanes);
313
}
314
}
315
316
void ConeProperties::check_conflicting_variants() {
317
318
if(
319
(CPs.test(ConeProperty::BottomDecomposition) && CPs.test(ConeProperty::NoBottomDec))
320
|| (CPs.test(ConeProperty::DualMode) && CPs.test(ConeProperty::PrimalMode))
321
|| (CPs.test(ConeProperty::Symmetrize) && CPs.test(ConeProperty::NoSymmetrization))
322
|| (CPs.test(ConeProperty::Projection) && CPs.test(ConeProperty::NoProjection))
323
|| (CPs.test(ConeProperty::Projection) && CPs.test(ConeProperty::ProjectionFloat))
324
|| (CPs.test(ConeProperty::NoProjection) && CPs.test(ConeProperty::ProjectionFloat))
325
)
326
throw BadInputException("Contradictory algorithmic variants in options.");
327
328
size_t nr_var=0;
329
if(CPs.test(ConeProperty::DualMode))
330
nr_var++;
331
if(CPs.test(ConeProperty::PrimalMode))
332
nr_var++;
333
if(CPs.test(ConeProperty::Projection))
334
nr_var++;
335
if(CPs.test(ConeProperty::Approximate))
336
nr_var++;
337
if(nr_var>1)
338
throw BadInputException("Only one of DualMode, PrimalMode, Approximate, Projection allowed.");
339
}
340
341
void ConeProperties::check_sanity(bool inhomogeneous) {
342
343
ConeProperty::Enum prop;
344
345
if(CPs.test(ConeProperty::IsTriangulationNested) || CPs.test(ConeProperty::IsTriangulationPartial))
346
throw BadInputException("ConeProperty not allowed in compute().");
347
348
for (size_t i=0; i<ConeProperty::EnumSize; i++) {
349
if (CPs.test(i)) {
350
prop = static_cast<ConeProperty::Enum>(i);
351
if (inhomogeneous) {
352
if ( prop == ConeProperty::Deg1Elements
353
|| prop == ConeProperty::StanleyDec
354
|| prop == ConeProperty::Triangulation
355
|| prop == ConeProperty::ConeDecomposition
356
|| prop == ConeProperty::IsIntegrallyClosed
357
|| prop == ConeProperty::WitnessNotIntegrallyClosed
358
|| prop == ConeProperty::ClassGroup
359
|| prop == ConeProperty::Symmetrize
360
|| prop == ConeProperty::NoSymmetrization
361
|| prop == ConeProperty::InclusionExclusionData
362
|| prop == ConeProperty::ExcludedFaces
363
|| prop == ConeProperty::UnitGroupIndex
364
|| prop == ConeProperty::ReesPrimaryMultiplicity
365
|| prop == ConeProperty::IsReesPrimary
366
|| prop == ConeProperty::IsDeg1HilbertBasis
367
|| prop == ConeProperty::IsDeg1ExtremeRays
368
|| prop == ConeProperty::Integral
369
|| prop == ConeProperty::IsGorenstein
370
|| prop == ConeProperty::GeneratorOfInterior
371
) {
372
throw BadInputException(toString(prop) + " not computable in the inhomogeneous case.");
373
}
374
} else { // homgeneous
375
if ( prop == ConeProperty::VerticesOfPolyhedron
376
|| prop == ConeProperty::ModuleRank
377
|| prop == ConeProperty::ModuleGenerators
378
) {
379
throw BadInputException(toString(prop) + " only computable in the inhomogeneous case.");
380
}
381
}
382
} //end if test(i)
383
}
384
}
385
386
387
/* conversion */
388
namespace {
389
// only to initialize the CPN in ConePropertyNames
390
vector<string> initializeCPN() {
391
vector<string> CPN(ConeProperty::EnumSize);
392
CPN.at(ConeProperty::Generators) = "Generators";
393
CPN.at(ConeProperty::ExtremeRays) = "ExtremeRays";
394
CPN.at(ConeProperty::VerticesFloat) = "VerticesFloat";
395
CPN.at(ConeProperty::VerticesOfPolyhedron) = "VerticesOfPolyhedron";
396
CPN.at(ConeProperty::SupportHyperplanes) = "SupportHyperplanes";
397
CPN.at(ConeProperty::TriangulationSize) = "TriangulationSize";
398
CPN.at(ConeProperty::TriangulationDetSum) = "TriangulationDetSum";
399
CPN.at(ConeProperty::Triangulation) = "Triangulation";
400
CPN.at(ConeProperty::Multiplicity) = "Multiplicity";
401
CPN.at(ConeProperty::RecessionRank) = "RecessionRank";
402
CPN.at(ConeProperty::AffineDim) = "AffineDim";
403
CPN.at(ConeProperty::ModuleRank) = "ModuleRank";
404
CPN.at(ConeProperty::HilbertBasis) = "HilbertBasis";
405
CPN.at(ConeProperty::ModuleGenerators) = "ModuleGenerators";
406
CPN.at(ConeProperty::Deg1Elements) = "Deg1Elements";
407
CPN.at(ConeProperty::HilbertSeries) = "HilbertSeries";
408
CPN.at(ConeProperty::Grading) = "Grading";
409
CPN.at(ConeProperty::IsPointed) = "IsPointed";
410
CPN.at(ConeProperty::IsDeg1ExtremeRays) = "IsDeg1ExtremeRays";
411
CPN.at(ConeProperty::IsDeg1HilbertBasis) = "IsDeg1HilbertBasis";
412
CPN.at(ConeProperty::IsIntegrallyClosed) = "IsIntegrallyClosed";
413
CPN.at(ConeProperty::WitnessNotIntegrallyClosed) = "WitnessNotIntegrallyClosed";
414
CPN.at(ConeProperty::OriginalMonoidGenerators) = "OriginalMonoidGenerators";
415
CPN.at(ConeProperty::IsReesPrimary) = "IsReesPrimary";
416
CPN.at(ConeProperty::ReesPrimaryMultiplicity) = "ReesPrimaryMultiplicity";
417
CPN.at(ConeProperty::StanleyDec) = "StanleyDec";
418
CPN.at(ConeProperty::ExcludedFaces) = "ExcludedFaces";
419
CPN.at(ConeProperty::Dehomogenization) = "Dehomogenization";
420
CPN.at(ConeProperty::InclusionExclusionData) = "InclusionExclusionData";
421
CPN.at(ConeProperty::Sublattice) = "Sublattice";
422
CPN.at(ConeProperty::ClassGroup) = "ClassGroup";
423
CPN.at(ConeProperty::ModuleGeneratorsOverOriginalMonoid) = "ModuleGeneratorsOverOriginalMonoid";
424
CPN.at(ConeProperty::Approximate) = "Approximate";
425
CPN.at(ConeProperty::BottomDecomposition) = "BottomDecomposition";
426
CPN.at(ConeProperty::DefaultMode) = "DefaultMode";
427
CPN.at(ConeProperty::DualMode) = "DualMode";
428
CPN.at(ConeProperty::KeepOrder) = "KeepOrder";
429
CPN.at(ConeProperty::IntegerHull) = "IntegerHull";
430
CPN.at(ConeProperty::MaximalSubspace) = "MaximalSubspace";
431
CPN.at(ConeProperty::ConeDecomposition) = "ConeDecomposition";
432
CPN.at(ConeProperty::HSOP) = "HSOP";
433
CPN.at(ConeProperty::NoBottomDec) = "NoBottomDec";
434
CPN.at(ConeProperty::PrimalMode) = "PrimalMode";
435
CPN.at(ConeProperty::Symmetrize) = "Symmetrize";
436
CPN.at(ConeProperty::NoSymmetrization) = "NoSymmetrization";
437
CPN.at(ConeProperty::EmbeddingDim) = "EmbeddingDim";
438
CPN.at(ConeProperty::Rank) = "Rank";
439
CPN.at(ConeProperty::InternalIndex) = "InternalIndex";
440
CPN.at(ConeProperty::IsInhomogeneous) = "IsInhomogeneous";
441
CPN.at(ConeProperty::UnitGroupIndex) = "UnitGroupIndex";
442
CPN.at(ConeProperty::GradingDenom) = "GradingDenom";
443
CPN.at(ConeProperty::Equations) = "Equations";
444
CPN.at(ConeProperty::Congruences) = "Congruences";
445
CPN.at(ConeProperty::ExternalIndex) = "ExternalIndex";
446
CPN.at(ConeProperty::HilbertQuasiPolynomial) = "HilbertQuasiPolynomial";
447
CPN.at(ConeProperty::IsTriangulationNested) = "IsTriangulationNested";
448
CPN.at(ConeProperty::IsTriangulationPartial) = "IsTriangulationPartial";
449
CPN.at(ConeProperty::BigInt) = "BigInt";
450
CPN.at(ConeProperty::NoSubdivision) = "NoSubdivision";
451
CPN.at(ConeProperty::Projection) = "Projection";
452
CPN.at(ConeProperty::ProjectionFloat) = "ProjectionFloat";
453
CPN.at(ConeProperty::NoProjection) = "NoProjection";
454
CPN.at(ConeProperty::NoNestedTri) = "NoNestedTri";
455
CPN.at(ConeProperty::Integral) = "Integral";
456
CPN.at(ConeProperty::VirtualMultiplicity) = "VirtualMultiplicity";
457
CPN.at(ConeProperty::WeightedEhrhartSeries) = "WeightedEhrhartSeries";
458
CPN.at(ConeProperty::WeightedEhrhartQuasiPolynomial) = "WeightedEhrhartQuasiPolynomial";
459
CPN.at(ConeProperty::IsGorenstein) = "IsGorenstein";
460
CPN.at(ConeProperty::NoPeriodBound) = "NoPeriodBound";
461
CPN.at(ConeProperty::SCIP) = "SCIP";
462
CPN.at(ConeProperty::GeneratorOfInterior) = "GeneratorOfInterior";
463
464
// detect changes in size of Enum, to remember to update CPN!
465
static_assert (ConeProperty::EnumSize == 71,
466
"ConeProperties Enum size does not fit! Update cone_property.cpp!");
467
// assert all fields contain an non-empty string
468
for (size_t i=0; i<ConeProperty::EnumSize; i++) {
469
assert(CPN.at(i).size() > 0);
470
}
471
return CPN;
472
}
473
474
const vector<string>& ConePropertyNames() {
475
static const vector<string> CPN(initializeCPN());
476
return CPN;
477
}
478
}
479
480
bool isConeProperty(ConeProperty::Enum& cp, const std::string& s) {
481
const vector<string>& CPN = ConePropertyNames();
482
for (size_t i=0; i<ConeProperty::EnumSize; i++) {
483
if (CPN[i] == s) {
484
cp = static_cast<ConeProperty::Enum>(i);
485
return true;
486
}
487
}
488
return false;
489
}
490
491
ConeProperty::Enum toConeProperty(const std::string& s) {
492
ConeProperty::Enum cp;
493
if (isConeProperty(cp, s)) return cp;
494
throw BadInputException("Unknown ConeProperty string \"" + s + "\"");
495
}
496
497
const std::string& toString(ConeProperty::Enum cp) {
498
return ConePropertyNames()[cp];
499
}
500
501
/* print it in a nice way */
502
std::ostream& operator<< (std::ostream& out, const ConeProperties& CP){
503
for (size_t i=0; i<ConeProperty::EnumSize; i++) {
504
if (CP.CPs.test(i)) out << toString(static_cast<ConeProperty::Enum>(i)) << " ";
505
}
506
return out;
507
}
508
509
510
} /* end namespace libnormaliz */
511
512
#ifdef NMZ_MIC_OFFLOAD
513
#pragma offload_attribute (pop)
514
#endif
515