Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
constants.cpp
Go to the documentation of this file.
2
3#include <cmath>
4#include <type_traits>
5
7
9
11
13
16
17namespace storm {
18namespace utility {
19
20template<typename ValueType>
21ValueType one() {
22 return ValueType(1);
23}
24
25template<typename ValueType>
26ValueType zero() {
27 return ValueType(0);
28}
29
30template<typename ValueType>
31ValueType infinity() {
32 return std::numeric_limits<ValueType>::infinity();
33}
34
35template<typename ValueType>
36bool isOne(ValueType const& a) {
37 return a == one<ValueType>();
38}
39
40template<typename ValueType>
41bool isZero(ValueType const& a) {
42 return a == zero<ValueType>();
43}
44
45template<typename ValueType>
46bool isNan(ValueType const&) {
47 return false;
48}
49
50template<>
51bool isNan(double const& value) {
52 return std::isnan(value);
53}
54
55template<typename ValueType>
56bool isAlmostZero(ValueType const& a) {
57 return a < convertNumber<ValueType>(1e-12) && a > -convertNumber<ValueType>(1e-12);
58}
59
60template<typename ValueType>
61bool isAlmostOne(ValueType const& a) {
62 return a < convertNumber<ValueType>(1.0 + 1e-12) && a > convertNumber<ValueType>(1.0 - 1e-12);
63}
64
65template<typename ValueType>
66bool isConstant(ValueType const&) {
67 return true;
68}
69
70template<typename ValueType>
71bool isInfinity(ValueType const& a) {
72 return a == infinity<ValueType>();
73}
74
75template<typename ValueType>
76bool isInteger(ValueType const& number) {
77 ValueType iPart;
78 ValueType result = std::modf(number, &iPart);
79 return result == zero<ValueType>();
80}
81
82template<>
83bool isInteger(int const&) {
84 return true;
85}
86
87template<>
88bool isInteger(uint32_t const&) {
89 return true;
90}
91
92template<>
94 return true;
95}
96
97template<typename TargetType, typename SourceType>
98TargetType convertNumber(SourceType const& number) {
99 return static_cast<TargetType>(number);
100}
101
102template<>
103uint_fast64_t convertNumber(double const& number) {
104 return std::llround(number);
105}
106
107template<>
108int_fast64_t convertNumber(double const& number) {
109 return std::llround(number);
110}
111
112template<>
113double convertNumber(uint_fast64_t const& number) {
114 return number;
115}
116
117template<>
118double convertNumber(double const& number) {
119 return number;
120}
121
122template<>
123double convertNumber(long long const& number) {
124 return static_cast<double>(number);
125}
126
127template<>
129 return static_cast<storm::storage::sparse::state_type>(number);
130}
131
132template<typename ValueType>
133ValueType simplify(ValueType value) {
134 // In the general case, we don't do anything here, but merely return the value. If something else is
135 // supposed to happen here, the templated function can be specialized for this particular type.
136 return value;
137}
138
139template<typename ValueType>
140std::pair<ValueType, ValueType> minmax(std::vector<ValueType> const& values) {
141 assert(!values.empty());
142 ValueType min = values.front();
143 ValueType max = values.front();
144 for (auto const& vt : values) {
145 if (vt < min) {
146 min = vt;
147 }
148 if (vt > max) {
149 max = vt;
150 }
151 }
152 return std::make_pair(min, max);
153}
154
155template<typename ValueType>
156ValueType minimum(std::vector<ValueType> const& values) {
157 assert(!values.empty());
158 ValueType min = values.front();
159 for (auto const& vt : values) {
160 if (vt < min) {
161 min = vt;
162 }
163 }
164 return min;
165}
166
167template<typename ValueType>
168ValueType maximum(std::vector<ValueType> const& values) {
169 assert(!values.empty());
170 ValueType max = values.front();
171 for (auto const& vt : values) {
172 if (vt > max) {
173 max = vt;
174 }
175 }
176 return max;
177}
178
179template<typename K, typename ValueType>
180std::pair<ValueType, ValueType> minmax(std::map<K, ValueType> const& values) {
181 assert(!values.empty());
182 ValueType min = values.begin()->second;
183 ValueType max = values.begin()->second;
184 for (auto const& vt : values) {
185 if (vt.second < min) {
186 min = vt.second;
187 }
188 if (vt.second > max) {
189 max = vt.second;
190 }
191 }
192 return std::make_pair(min, max);
193}
194
195template<typename K, typename ValueType>
196ValueType minimum(std::map<K, ValueType> const& values) {
197 return minmax(values).first;
198}
199
200template<typename K, typename ValueType>
201ValueType maximum(std::map<K, ValueType> const& values) {
202 return minmax(values).second;
203}
204
205template<typename ValueType>
206ValueType pow(ValueType const& value, int_fast64_t exponent) {
207 return std::pow(value, exponent);
208}
209
210template<typename ValueType>
211ValueType max(ValueType const& first, ValueType const& second) {
212 return std::max(first, second);
213}
214
215template<typename ValueType>
216ValueType min(ValueType const& first, ValueType const& second) {
217 return std::min(first, second);
218}
219
220template<typename ValueType>
221ValueType sqrt(ValueType const& number) {
222 return std::sqrt(number);
223}
224
225template<typename ValueType>
226ValueType abs(ValueType const& number) {
227 return std::fabs(number);
228}
229
230template<typename ValueType>
231ValueType floor(ValueType const& number) {
232 return std::floor(number);
233}
234
235template<typename ValueType>
236ValueType ceil(ValueType const& number) {
237 return std::ceil(number);
238}
239
240template<typename ValueType>
241ValueType round(ValueType const& number) {
242 // Rounding towards infinity
243 return floor<ValueType>(number + storm::utility::convertNumber<ValueType>(0.5));
244}
245
246template<typename ValueType>
247ValueType log(ValueType const& number) {
248 return std::log(number);
249}
250
251template<typename ValueType>
252ValueType log10(ValueType const& number) {
253 return std::log10(number);
254}
255
256template<typename ValueType>
257ValueType cos(ValueType const& number) {
258 return std::cos(number);
259}
260
261template<typename ValueType>
262ValueType sin(ValueType const& number) {
263 return std::sin(number);
264}
265
266template<typename ValueType>
267typename NumberTraits<ValueType>::IntegerType trunc(ValueType const& number) {
268 return static_cast<typename NumberTraits<ValueType>::IntegerType>(std::trunc(number));
269}
270
271template<typename IntegerType>
272IntegerType mod(IntegerType const& first, IntegerType const& second) {
273 return std::fmod(first, second);
274}
275
276template<typename IntegerType>
277std::pair<IntegerType, IntegerType> divide(IntegerType const& dividend, IntegerType const& divisor) {
278 return std::make_pair(dividend / divisor, mod(dividend, divisor));
279}
280
281template<typename ValueType>
282std::string to_string(ValueType const& value) {
283 std::stringstream ss;
284 ss.precision(std::numeric_limits<ValueType>::max_digits10 + 2);
285 ss << value;
286 return ss.str();
287}
288
289#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_CLN)
290template<>
291storm::ClnRationalNumber infinity() {
292 // FIXME: this should be treated more properly.
293 return storm::ClnRationalNumber(100000000000);
294}
295
296template<>
297bool isOne(storm::ClnRationalNumber const& a) {
298 return carl::isOne(a);
299}
300
301template<>
302bool isZero(storm::ClnRationalNumber const& a) {
303 return carl::isZero(a);
304}
305
306template<>
307bool isInteger(storm::ClnRationalNumber const& number) {
308 return carl::isInteger(number);
309}
310
311template<>
312std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber> minmax(std::vector<storm::ClnRationalNumber> const& values) {
313 assert(!values.empty());
314 storm::ClnRationalNumber min = values.front();
315 storm::ClnRationalNumber max = values.front();
316 for (auto const& vt : values) {
317 if (vt == storm::utility::infinity<storm::ClnRationalNumber>()) {
318 max = vt;
319 } else {
320 if (vt < min) {
321 min = vt;
322 }
323 if (vt > max) {
324 max = vt;
325 }
326 }
327 }
328 return std::make_pair(min, max);
329}
330
331template<>
332uint_fast64_t convertNumber(ClnRationalNumber const& number) {
333 return carl::toInt<carl::uint>(number);
334}
335
336template<>
337int_fast64_t convertNumber(ClnRationalNumber const& number) {
338 return carl::toInt<carl::sint>(number);
339}
340
341template<>
342ClnRationalNumber convertNumber(double const& number) {
343 return carl::rationalize<ClnRationalNumber>(number);
344}
345
346template<>
347ClnRationalNumber convertNumber(int const& number) {
348 return carl::rationalize<ClnRationalNumber>(number);
349}
350
351template<>
352ClnRationalNumber convertNumber(NumberTraits<ClnRationalNumber>::IntegerType const& number) {
353 return ClnRationalNumber(number);
354}
355
356template<>
357ClnRationalNumber convertNumber(uint_fast64_t const& number) {
358 STORM_LOG_ASSERT(static_cast<carl::uint>(number) == number, "Rationalizing failed, because the number is too large.");
359 return carl::rationalize<ClnRationalNumber>(static_cast<carl::uint>(number));
360}
361
362template<>
363typename NumberTraits<ClnRationalNumber>::IntegerType convertNumber(uint_fast64_t const& number) {
364 STORM_LOG_ASSERT(static_cast<unsigned long int>(number) == number, "Conversion failed, because the number is too large.");
365 return NumberTraits<ClnRationalNumber>::IntegerType(static_cast<unsigned long int>(number));
366}
367
368template<>
369typename NumberTraits<ClnRationalNumber>::IntegerType convertNumber(double const& number) {
370 if (number < static_cast<double>(std::numeric_limits<uint64_t>::max())) {
371 return NumberTraits<ClnRationalNumber>::IntegerType(static_cast<uint64_t>(number));
372 } else {
373 return carl::round(carl::rationalize<ClnRationalNumber>(number));
374 }
375}
376
377template<>
378ClnRationalNumber convertNumber(int_fast64_t const& number) {
379 STORM_LOG_ASSERT(static_cast<carl::sint>(number) == number, "Rationalizing failed, because the number is too large.");
380 return carl::rationalize<ClnRationalNumber>(static_cast<carl::sint>(number));
381}
382
383template<>
384double convertNumber(ClnRationalNumber const& number) {
385 return carl::toDouble(number);
386}
387
388template<>
389ClnRationalNumber convertNumber(std::string const& number) {
390 ClnRationalNumber result;
391 if (carl::try_parse<ClnRationalNumber>(number, result)) {
392 return result;
393 }
394 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Unable to parse '" << number << "' as a rational number.");
395}
396
397template<>
398std::pair<ClnRationalNumber, ClnRationalNumber> asFraction(ClnRationalNumber const& number) {
399 return std::make_pair(carl::getNum(number), carl::getDenom(number));
400}
401
402template<>
403ClnRationalNumber sqrt(ClnRationalNumber const& number) {
404 return carl::sqrt(number);
405}
406
407template<>
408ClnRationalNumber abs(storm::ClnRationalNumber const& number) {
409 return carl::abs(number);
410}
411
412template<>
413ClnRationalNumber floor(storm::ClnRationalNumber const& number) {
414 return carl::floor(number);
415}
416
417template<>
418ClnRationalNumber ceil(storm::ClnRationalNumber const& number) {
419 return carl::ceil(number);
420}
421
422template<>
423ClnRationalNumber log(ClnRationalNumber const& number) {
424 return carl::log(number);
425}
426
427template<>
428ClnRationalNumber log10(ClnRationalNumber const& number) {
429 return carl::log10(number);
430}
431
432template<>
433ClnRationalNumber cos(ClnRationalNumber const& number) {
434 return carl::cos(number);
435}
436
437template<>
438ClnRationalNumber sin(ClnRationalNumber const& number) {
439 return carl::sin(number);
440}
441
442template<>
443typename NumberTraits<ClnRationalNumber>::IntegerType trunc(ClnRationalNumber const& number) {
444 return cln::truncate1(number);
445}
446
447template<>
448typename NumberTraits<ClnRationalNumber>::IntegerType mod(NumberTraits<ClnRationalNumber>::IntegerType const& first,
449 NumberTraits<ClnRationalNumber>::IntegerType const& second) {
450 return carl::mod(first, second);
451}
452
453template<>
454std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType, typename NumberTraits<ClnRationalNumber>::IntegerType> divide(
455 typename NumberTraits<ClnRationalNumber>::IntegerType const& dividend, typename NumberTraits<ClnRationalNumber>::IntegerType const& divisor) {
456 std::pair<typename NumberTraits<ClnRationalNumber>::IntegerType, typename NumberTraits<ClnRationalNumber>::IntegerType> result;
457 carl::divide(dividend, divisor, result.first, result.second);
458 return result;
459}
460
461template<>
462typename NumberTraits<ClnRationalNumber>::IntegerType pow(typename NumberTraits<ClnRationalNumber>::IntegerType const& value, int_fast64_t exponent) {
463 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
464 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
465 return carl::pow(value, exponent);
466}
467
468template<>
469ClnRationalNumber pow(ClnRationalNumber const& value, int_fast64_t exponent) {
470 if (exponent >= 0) {
471 return carl::pow(value, exponent);
472 } else {
473 return storm::utility::one<ClnRationalNumber>() / carl::pow(value, -exponent);
474 }
475}
476
477template<>
478NumberTraits<ClnRationalNumber>::IntegerType numerator(ClnRationalNumber const& number) {
479 return carl::getNum(number);
480}
481
482template<>
483NumberTraits<ClnRationalNumber>::IntegerType denominator(ClnRationalNumber const& number) {
484 return carl::getDenom(number);
485}
486#endif
487
488#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP)
489template<>
490storm::GmpRationalNumber infinity() {
491 // FIXME: this should be treated more properly.
492 return storm::GmpRationalNumber(100000000000);
493}
494
495template<>
496bool isOne(storm::GmpRationalNumber const& a) {
497 return carl::isOne(a);
498}
499
500template<>
501bool isZero(storm::GmpRationalNumber const& a) {
502 return carl::isZero(a);
503}
504
505template<>
506bool isInteger(storm::GmpRationalNumber const& number) {
507 return carl::isInteger(number);
508}
509
510template<>
511std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber> minmax(std::vector<storm::GmpRationalNumber> const& values) {
512 assert(!values.empty());
513 storm::GmpRationalNumber min = values.front();
514 storm::GmpRationalNumber max = values.front();
515 for (auto const& vt : values) {
516 if (vt == storm::utility::infinity<storm::GmpRationalNumber>()) {
517 max = vt;
518 } else {
519 if (vt < min) {
520 min = vt;
521 }
522 if (vt > max) {
523 max = vt;
524 }
525 }
526 }
527 return std::make_pair(min, max);
528}
529
530template<>
531std::pair<storm::GmpRationalNumber, storm::GmpRationalNumber> minmax(std::map<uint64_t, storm::GmpRationalNumber> const& values) {
532 assert(!values.empty());
533 storm::GmpRationalNumber min = values.begin()->second;
534 storm::GmpRationalNumber max = values.begin()->second;
535 for (auto const& vt : values) {
536 if (vt.second == storm::utility::infinity<storm::GmpRationalNumber>()) {
537 max = vt.second;
538 } else {
539 if (vt.second < min) {
540 min = vt.second;
541 }
542 if (vt.second > max) {
543 max = vt.second;
544 }
545 }
546 }
547 return std::make_pair(min, max);
548}
549
550template<>
551uint_fast64_t convertNumber(GmpRationalNumber const& number) {
552 return carl::toInt<carl::uint>(number);
553}
554
555template<>
556int_fast64_t convertNumber(GmpRationalNumber const& number) {
557 return carl::toInt<carl::sint>(number);
558}
559
560template<>
561GmpRationalNumber convertNumber(double const& number) {
562 return carl::rationalize<GmpRationalNumber>(number);
563}
564
565template<>
566GmpRationalNumber convertNumber(int const& number) {
567 return carl::rationalize<GmpRationalNumber>(number);
568}
569
570template<>
571GmpRationalNumber convertNumber(uint_fast64_t const& number) {
572 STORM_LOG_ASSERT(static_cast<carl::uint>(number) == number, "Rationalizing failed, because the number is too large.");
573 return carl::rationalize<GmpRationalNumber>(static_cast<carl::uint>(number));
574}
575
576template<>
577GmpRationalNumber convertNumber(NumberTraits<GmpRationalNumber>::IntegerType const& number) {
578 return GmpRationalNumber(number);
579}
580
581template<>
582typename NumberTraits<GmpRationalNumber>::IntegerType convertNumber(uint_fast64_t const& number) {
583 STORM_LOG_ASSERT(static_cast<unsigned long int>(number) == number, "Conversion failed, because the number is too large.");
584 return NumberTraits<GmpRationalNumber>::IntegerType(static_cast<unsigned long int>(number));
585}
586
587template<>
588typename NumberTraits<GmpRationalNumber>::IntegerType convertNumber(double const& number) {
589 return NumberTraits<GmpRationalNumber>::IntegerType(number);
590}
591
592template<>
593GmpRationalNumber convertNumber(int_fast64_t const& number) {
594 STORM_LOG_ASSERT(static_cast<carl::sint>(number) == number, "Rationalizing failed, because the number is too large.");
595 return carl::rationalize<GmpRationalNumber>(static_cast<carl::sint>(number));
596}
597
598template<>
599double convertNumber(GmpRationalNumber const& number) {
600 return carl::toDouble(number);
601}
602
603template<>
604GmpRationalNumber convertNumber(std::string const& number) {
605 GmpRationalNumber result;
606 if (carl::try_parse<GmpRationalNumber>(number, result)) {
607 return result;
608 }
609 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Unable to parse '" << number << "' as a rational number.");
610}
611
612template<>
613std::pair<GmpRationalNumber, GmpRationalNumber> asFraction(GmpRationalNumber const& number) {
614 return std::make_pair(carl::getNum(number), carl::getDenom(number));
615}
616
617template<>
618GmpRationalNumber sqrt(GmpRationalNumber const& number) {
619 return carl::sqrt(number);
620}
621
622template<>
623GmpRationalNumber abs(storm::GmpRationalNumber const& number) {
624 return carl::abs(number);
625}
626
627template<>
628GmpRationalNumber floor(storm::GmpRationalNumber const& number) {
629 return carl::floor(number);
630}
631
632template<>
633GmpRationalNumber ceil(storm::GmpRationalNumber const& number) {
634 return carl::ceil(number);
635}
636
637template<>
638GmpRationalNumber log(GmpRationalNumber const& number) {
639 return carl::log(number);
640}
641
642template<>
643GmpRationalNumber log10(GmpRationalNumber const& number) {
644 return carl::log10(number);
645}
646
647template<>
648GmpRationalNumber cos(GmpRationalNumber const& number) {
649 return carl::cos(number);
650}
651
652template<>
653GmpRationalNumber sin(GmpRationalNumber const& number) {
654 return carl::sin(number);
655}
656
657template<>
658typename NumberTraits<GmpRationalNumber>::IntegerType trunc(GmpRationalNumber const& number) {
659 return carl::getNum(number) / carl::getDenom(number);
660}
661
662template<>
663typename NumberTraits<GmpRationalNumber>::IntegerType mod(typename NumberTraits<GmpRationalNumber>::IntegerType const& first,
664 typename NumberTraits<GmpRationalNumber>::IntegerType const& second) {
665 return carl::mod(first, second);
666}
667
668template<>
669std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType, typename NumberTraits<GmpRationalNumber>::IntegerType> divide(
670 typename NumberTraits<GmpRationalNumber>::IntegerType const& dividend, typename NumberTraits<GmpRationalNumber>::IntegerType const& divisor) {
671 std::pair<typename NumberTraits<GmpRationalNumber>::IntegerType, typename NumberTraits<GmpRationalNumber>::IntegerType> result;
672 carl::divide(dividend, divisor, result.first, result.second);
673 return result;
674}
675
676template<>
677typename NumberTraits<GmpRationalNumber>::IntegerType pow(typename NumberTraits<GmpRationalNumber>::IntegerType const& value, int_fast64_t exponent) {
678 STORM_LOG_THROW(exponent >= 0, storm::exceptions::InvalidArgumentException,
679 "Tried to compute the power 'x^y' as an integer, but the exponent 'y' is negative.");
680 return carl::pow(value, exponent);
681}
682
683template<>
684GmpRationalNumber pow(GmpRationalNumber const& value, int_fast64_t exponent) {
685 if (exponent >= 0) {
686 return carl::pow(value, exponent);
687 } else {
688 return storm::utility::one<GmpRationalNumber>() / carl::pow(value, -exponent);
689 }
690}
691
692template<>
693typename NumberTraits<GmpRationalNumber>::IntegerType numerator(GmpRationalNumber const& number) {
694 return carl::getNum(number);
695}
696
697template<>
698typename NumberTraits<GmpRationalNumber>::IntegerType denominator(GmpRationalNumber const& number) {
699 return carl::getDenom(number);
700}
701#endif
702
703#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
704template<>
705storm::GmpRationalNumber convertNumber(storm::ClnRationalNumber const& number) {
706 return carl::parse<storm::GmpRationalNumber>(to_string(number));
707}
708
709template<>
710storm::ClnRationalNumber convertNumber(storm::GmpRationalNumber const& number) {
711 return carl::parse<storm::ClnRationalNumber>(to_string(number));
712}
713#endif
714
715#ifdef STORM_HAVE_CARL
716template<>
718 // FIXME: this should be treated more properly.
719 return storm::RationalFunction(convertNumber<RationalFunctionCoefficient>(100000000000));
720}
721
722template<>
723bool isOne(storm::RationalFunction const& a) {
724 return a.isOne();
725}
726
727template<>
728bool isOne(storm::Polynomial const& a) {
729 return a.isOne();
730}
731
732template<>
733bool isZero(storm::RationalFunction const& a) {
734 return a.isZero();
735}
736
737template<>
738bool isZero(storm::Polynomial const& a) {
739 return a.isZero();
740}
741
742template<>
743bool isConstant(storm::RationalFunction const& a) {
744 return a.isConstant();
745}
746
747template<>
748bool isConstant(storm::Polynomial const& a) {
749 return a.isConstant();
750}
751
752template<>
753bool isConstant(storm::Interval const& a) {
754 return a.isPointInterval();
755}
756
757template<>
758bool isInfinity(storm::RationalFunction const& a) {
759 // FIXME: this should be treated more properly.
760 return a == infinity<storm::RationalFunction>();
761}
762
763template<>
764bool isInteger(storm::RationalFunction const& func) {
765 return storm::utility::isConstant(func) && storm::utility::isOne(func.denominator());
766}
767
768template<>
769RationalFunction convertNumber(double const& number) {
770 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(number));
771}
772
773template<>
774RationalFunction convertNumber(int_fast64_t const& number) {
775 STORM_LOG_ASSERT(static_cast<carl::sint>(number) == number, "Rationalizing failed, because the number is too large.");
776 return RationalFunction(carl::rationalize<RationalFunctionCoefficient>(static_cast<carl::sint>(number)));
777}
778
779#if defined(STORM_HAVE_CLN)
780template<>
781RationalFunction convertNumber(ClnRationalNumber const& number) {
782 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
783}
784
785template<>
786ClnRationalNumber convertNumber(RationalFunction const& number) {
787 storm::RationalFunctionCoefficient tmp = number.nominatorAsNumber() / number.denominatorAsNumber();
788 return convertNumber<ClnRationalNumber>(tmp);
789}
790#endif
791
792#if defined(STORM_HAVE_GMP)
793template<>
794RationalFunction convertNumber(GmpRationalNumber const& number) {
795 return RationalFunction(convertNumber<storm::RationalFunctionCoefficient>(number));
796}
797
798template<>
799GmpRationalNumber convertNumber(RationalFunction const& number) {
800 return convertNumber<GmpRationalNumber>(number.nominatorAsNumber() / number.denominatorAsNumber());
801}
802#endif
803
804template<>
805carl::uint convertNumber(RationalFunction const& func) {
806 return carl::toInt<carl::uint>(convertNumber<RationalFunctionCoefficient>(func));
807}
808
809template<>
810carl::sint convertNumber(RationalFunction const& func) {
811 return carl::toInt<carl::sint>(convertNumber<RationalFunctionCoefficient>(func));
812}
813
814template<>
815double convertNumber(RationalFunction const& func) {
816 return carl::toDouble(convertNumber<RationalFunctionCoefficient>(func));
817}
818
819template<>
821 return number;
822}
823
824template<>
825RationalFunction convertNumber(std::string const& number) {
826 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
827}
828
829template<>
831 return RationalFunction(convertNumber<RationalFunctionCoefficient>(number));
832}
833
834template<>
836
837template<>
839
840template<>
842 value.simplify();
843 return value;
844}
845
846template<>
848 value.simplify();
849 return value;
850}
851
852template<>
854 value.simplify();
855 return std::move(value);
856}
857
858template<>
860 return a.isConstant() && isAlmostZero(convertNumber<RationalFunctionCoefficient>(a));
861}
862
863template<>
865 return a.isConstant() && isAlmostOne(convertNumber<RationalFunctionCoefficient>(a));
866}
867
868template<>
869std::pair<storm::RationalFunction, storm::RationalFunction> minmax(std::vector<storm::RationalFunction> const&) {
870 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Minimum/maximum for rational functions is not defined.");
871}
872
873template<>
874storm::RationalFunction minimum(std::vector<storm::RationalFunction> const&) {
875 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Minimum for rational functions is not defined.");
876}
877
878template<>
879storm::RationalFunction maximum(std::vector<storm::RationalFunction> const&) {
880 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Maximum for rational functions is not defined.");
881}
882
883template<>
884std::pair<storm::RationalFunction, storm::RationalFunction> minmax(std::map<uint64_t, storm::RationalFunction> const&) {
885 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Maximum/maximum for rational functions is not defined.");
886}
887
888template<>
889storm::RationalFunction minimum(std::map<uint64_t, storm::RationalFunction> const&) {
890 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Minimum for rational functions is not defined.");
891}
892
893template<>
894storm::RationalFunction maximum(std::map<uint64_t, storm::RationalFunction> const&) {
895 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "Maximum for rational functions is not defined");
896}
897
898template<>
899RationalFunction pow(RationalFunction const& value, int_fast64_t exponent) {
900 if (exponent >= 0) {
901 return carl::pow(value, exponent);
902 } else {
903 return storm::utility::one<RationalFunction>() / carl::pow(value, -exponent);
904 }
905}
906
907template<>
908std::string to_string(RationalFunction const& f) {
909 std::stringstream ss;
910 if (f.isConstant()) {
911 if (f.denominator().isOne()) {
912 ss << f.nominatorAsNumber();
913 } else {
914 ss << f.nominatorAsNumber() << "/" << f.denominatorAsNumber();
915 }
916 } else if (f.denominator().isOne()) {
917 ss << f.nominatorAsPolynomial().coefficient() * f.nominatorAsPolynomial().polynomial();
918 } else {
919 ss << "(" << f.nominatorAsPolynomial() << ")/(" << f.denominatorAsPolynomial() << ")";
920 }
921 return ss.str();
922}
923
924#endif
925
926template<>
927double convertNumber(std::string const& value) {
928 return convertNumber<double>(convertNumber<storm::RationalNumber>(value));
929}
930
931template<>
932storm::Interval convertNumber(double const& number) {
933 return storm::Interval(number);
934}
935
936template<>
937storm::Interval convertNumber(storm::RationalNumber const& n) {
938 return storm::Interval(convertNumber<double>(n));
939}
940
941template<>
942storm::RationalNumber convertNumber(storm::Interval const& number) {
943 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert");
944 return convertNumber<storm::RationalNumber>(number.lower());
945}
946
947template<>
948double convertNumber(storm::Interval const& number) {
949 STORM_LOG_ASSERT(number.isPointInterval(), "Interval must be a point interval to convert");
950 return number.lower();
951}
952
953template<>
955 return interval.abs();
956}
957
958// Explicit instantiations.
959
960// double
961template double one();
962template double zero();
963template double infinity();
964template bool isOne(double const& value);
965template bool isZero(double const& value);
966template bool isAlmostZero(double const& value);
967template bool isAlmostOne(double const& value);
968template bool isConstant(double const& value);
969template bool isInfinity(double const& value);
970template bool isInteger(double const& number);
971template double simplify(double value);
972template std::pair<double, double> minmax(std::vector<double> const&);
973template double minimum(std::vector<double> const&);
974template double maximum(std::vector<double> const&);
975template std::pair<double, double> minmax(std::map<uint64_t, double> const&);
976template double minimum(std::map<uint64_t, double> const&);
977template double maximum(std::map<uint64_t, double> const&);
978template double pow(double const& value, int_fast64_t exponent);
979template double max(double const& first, double const& second);
980template double min(double const& first, double const& second);
981template double sqrt(double const& number);
982template double abs(double const& number);
983template double floor(double const& number);
984template double ceil(double const& number);
985template double round(double const& number);
986template double log(double const& number);
987template double log10(double const& number);
988template double cos(double const& number);
989template double sin(double const& number);
990template typename NumberTraits<double>::IntegerType trunc(double const& number);
991template double mod(double const& first, double const& second);
992template std::string to_string(double const& value);
993
994// int
995template int one();
996template int zero();
997template int infinity();
998template bool isOne(int const& value);
999template bool isZero(int const& value);
1000template bool isConstant(int const& value);
1001template bool isInfinity(int const& value);
1002
1003// uint32_t
1004template uint32_t one();
1005template uint32_t zero();
1006template uint32_t infinity();
1007template bool isOne(uint32_t const& value);
1008template bool isZero(uint32_t const& value);
1009template bool isConstant(uint32_t const& value);
1010template bool isInfinity(uint32_t const& value);
1011
1012// storm::storage::sparse::state_type
1016template bool isOne(storm::storage::sparse::state_type const& value);
1017template bool isZero(storm::storage::sparse::state_type const& value);
1020
1021// other instantiations
1022template unsigned long convertNumber(long const&);
1023template double convertNumber(long const&);
1024
1025#if defined(STORM_HAVE_CLN)
1026// Instantiations for (CLN) rational number.
1027template storm::ClnRationalNumber one();
1029template storm::ClnRationalNumber zero();
1031template bool isConstant(storm::ClnRationalNumber const& value);
1032template bool isInfinity(storm::ClnRationalNumber const& value);
1033template bool isNan(storm::ClnRationalNumber const& value);
1034template bool isAlmostZero(storm::ClnRationalNumber const& value);
1035template bool isAlmostOne(storm::ClnRationalNumber const& value);
1037template storm::ClnRationalNumber convertNumber(storm::ClnRationalNumber const& number);
1038template storm::ClnRationalNumber simplify(storm::ClnRationalNumber value);
1039template std::pair<storm::ClnRationalNumber, storm::ClnRationalNumber> minmax(std::map<uint64_t, storm::ClnRationalNumber> const&);
1040template storm::ClnRationalNumber minimum(std::map<uint64_t, storm::ClnRationalNumber> const&);
1041template storm::ClnRationalNumber maximum(std::map<uint64_t, storm::ClnRationalNumber> const&);
1042template storm::ClnRationalNumber minimum(std::vector<storm::ClnRationalNumber> const&);
1043template storm::ClnRationalNumber maximum(std::vector<storm::ClnRationalNumber> const&);
1044template storm::ClnRationalNumber max(storm::ClnRationalNumber const& first, storm::ClnRationalNumber const& second);
1045template storm::ClnRationalNumber min(storm::ClnRationalNumber const& first, storm::ClnRationalNumber const& second);
1046template storm::ClnRationalNumber round(storm::ClnRationalNumber const& number);
1047template std::string to_string(storm::ClnRationalNumber const& value);
1048#endif
1049
1050#if defined(STORM_HAVE_GMP)
1051// Instantiations for (GMP) rational number.
1052template storm::GmpRationalNumber one();
1054template storm::GmpRationalNumber zero();
1056template bool isConstant(storm::GmpRationalNumber const& value);
1057template bool isInfinity(storm::GmpRationalNumber const& value);
1058template bool isNan(storm::GmpRationalNumber const& value);
1059template bool isAlmostZero(storm::GmpRationalNumber const& value);
1060template bool isAlmostOne(storm::GmpRationalNumber const& value);
1062template storm::GmpRationalNumber convertNumber(storm::GmpRationalNumber const& number);
1063template storm::GmpRationalNumber simplify(storm::GmpRationalNumber value);
1064template storm::GmpRationalNumber minimum(std::map<uint64_t, storm::GmpRationalNumber> const&);
1065template storm::GmpRationalNumber maximum(std::map<uint64_t, storm::GmpRationalNumber> const&);
1066template storm::GmpRationalNumber minimum(std::vector<storm::GmpRationalNumber> const&);
1067template storm::GmpRationalNumber maximum(std::vector<storm::GmpRationalNumber> const&);
1068template storm::GmpRationalNumber max(storm::GmpRationalNumber const& first, storm::GmpRationalNumber const& second);
1069template storm::GmpRationalNumber min(storm::GmpRationalNumber const& first, storm::GmpRationalNumber const& second);
1070template storm::GmpRationalNumber round(storm::GmpRationalNumber const& number);
1071template std::string to_string(storm::GmpRationalNumber const& value);
1072#endif
1073
1074#if defined(STORM_HAVE_CARL) && defined(STORM_HAVE_GMP) && defined(STORM_HAVE_CLN)
1075#endif
1076
1077#ifdef STORM_HAVE_CARL
1078// Instantiations for rational function.
1079template RationalFunction one();
1080template RationalFunction zero();
1081
1082template bool isNan(RationalFunction const&);
1083
1084// Instantiations for polynomials.
1085template Polynomial one();
1086template Polynomial zero();
1087
1088// Instantiations for intervals.
1089template Interval one();
1090template Interval zero();
1091template bool isOne(Interval const& value);
1092template bool isZero(Interval const& value);
1093template bool isInfinity(Interval const& value);
1094template bool isAlmostZero(Interval const& value);
1095
1096template std::string to_string(storm::Interval const& value);
1097#endif
1098
1099} // namespace utility
1100} // namespace storm
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:11
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
ValueType max(ValueType const &first, ValueType const &second)
bool isOne(ValueType const &a)
Definition constants.cpp:36
NumberTraits< RationalType >::IntegerType denominator(RationalType const &number)
NumberTraits< RationalType >::IntegerType numerator(RationalType const &number)
bool isConstant(ValueType const &)
Definition constants.cpp:66
ValueType simplify(ValueType value)
ValueType min(ValueType const &first, ValueType const &second)
ValueType sin(ValueType const &number)
bool isAlmostZero(ValueType const &a)
Definition constants.cpp:56
bool isAlmostOne(ValueType const &a)
Definition constants.cpp:61
ValueType floor(ValueType const &number)
std::pair< ValueType, ValueType > asFraction(ValueType const &number)
bool isZero(ValueType const &a)
Definition constants.cpp:41
ValueType minimum(std::vector< ValueType > const &values)
ValueType ceil(ValueType const &number)
bool isInteger(ValueType const &number)
Definition constants.cpp:76
ValueType abs(ValueType const &number)
ValueType zero()
Definition constants.cpp:26
ValueType infinity()
Definition constants.cpp:31
bool isNan(ValueType const &)
Definition constants.cpp:46
std::string to_string(ValueType const &value)
std::pair< ValueType, ValueType > minmax(std::vector< ValueType > const &values)
NumberTraits< ValueType >::IntegerType trunc(ValueType const &number)
std::pair< IntegerType, IntegerType > divide(IntegerType const &dividend, IntegerType const &divisor)
(Integer-)Divides the dividend by the divisor and returns the result plus the remainder.
IntegerType mod(IntegerType const &first, IntegerType const &second)
ValueType pow(ValueType const &value, int_fast64_t exponent)
ValueType one()
Definition constants.cpp:21
ValueType log(ValueType const &number)
ValueType maximum(std::vector< ValueType > const &values)
ValueType cos(ValueType const &number)
ValueType sqrt(ValueType const &number)
bool isInfinity(ValueType const &a)
Definition constants.cpp:71
ValueType log10(ValueType const &number)
ValueType round(ValueType const &number)
TargetType convertNumber(SourceType const &number)
Definition constants.cpp:98
LabParser.cpp.
Definition cli.cpp:18
carl::Interval< double > Interval
carl::RationalFunction< Polynomial, true > RationalFunction