00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef PPL_Constraint_defs_hh
00024 #define PPL_Constraint_defs_hh 1
00025
00026 #include "Constraint.types.hh"
00027 #include "Scalar_Products.types.hh"
00028 #include "Linear_Row.defs.hh"
00029 #include "Variable.defs.hh"
00030 #include "Linear_Expression.defs.hh"
00031 #include "Constraint_System.defs.hh"
00032 #include "Polyhedron.types.hh"
00033 #include "Congruence.types.hh"
00034 #include <iosfwd>
00035
00036 namespace Parma_Polyhedra_Library {
00037
00038
00039
00041
00042 bool
00043 operator==(const Constraint& x, const Constraint& y);
00044
00046
00047 bool
00048 operator!=(const Constraint& x, const Constraint& y);
00049
00051
00052 Constraint
00053 operator==(const Linear_Expression& e1, const Linear_Expression& e2);
00054
00056
00057 Constraint
00058 operator==(Variable v1, Variable v2);
00059
00061
00062 Constraint
00063 operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
00064
00066
00067 Constraint
00068 operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
00069
00071
00072 Constraint
00073 operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
00074
00076
00077 Constraint
00078 operator<=(Variable v1, Variable v2);
00079
00081
00082 Constraint
00083 operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00084
00086
00087 Constraint
00088 operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00089
00091
00092 Constraint
00093 operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
00094
00096
00097 Constraint
00098 operator>=(Variable v1, Variable v2);
00099
00101
00102 Constraint
00103 operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00104
00106
00107 Constraint
00108 operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00109
00111
00112 Constraint
00113 operator<(const Linear_Expression& e1, const Linear_Expression& e2);
00114
00116
00117 Constraint
00118 operator<(Variable v1, Variable v2);
00119
00121
00122 Constraint
00123 operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
00124
00126
00127 Constraint
00128 operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
00129
00131
00132 Constraint
00133 operator>(const Linear_Expression& e1, const Linear_Expression& e2);
00134
00136
00137 Constraint
00138 operator>(Variable v1, Variable v2);
00139
00141
00142 Constraint
00143 operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
00144
00146
00147 Constraint
00148 operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
00149
00150 }
00151
00152
00153 namespace std {
00154
00156
00157 void swap(Parma_Polyhedra_Library::Constraint& x,
00158 Parma_Polyhedra_Library::Constraint& y);
00159
00160 }
00161
00163
00260 class Parma_Polyhedra_Library::Constraint : private Linear_Row {
00261 public:
00263 Constraint(const Constraint& c);
00264
00266
00270 explicit Constraint(const Congruence& cg);
00271
00273 ~Constraint();
00274
00276 Constraint& operator=(const Constraint& c);
00277
00279 static dimension_type max_space_dimension();
00280
00282 dimension_type space_dimension() const;
00283
00285 enum Type {
00287 EQUALITY,
00289 NONSTRICT_INEQUALITY,
00291 STRICT_INEQUALITY
00292 };
00293
00295 Type type() const;
00296
00301 bool is_equality() const;
00302
00307 bool is_inequality() const;
00308
00313 bool is_nonstrict_inequality() const;
00314
00319 bool is_strict_inequality() const;
00320
00322
00326 Coefficient_traits::const_reference coefficient(Variable v) const;
00327
00329 Coefficient_traits::const_reference inhomogeneous_term() const;
00330
00332 static void initialize();
00333
00335 static void finalize();
00336
00338 static const Constraint& zero_dim_false();
00339
00344 static const Constraint& zero_dim_positivity();
00345
00350 memory_size_type total_memory_in_bytes() const;
00351
00353 memory_size_type external_memory_in_bytes() const;
00354
00366 bool is_tautological() const;
00367
00380 bool is_inconsistent() const;
00381
00390 bool is_equivalent_to(const Constraint& y) const;
00391
00392 PPL_OUTPUT_DECLARATIONS
00393
00394 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
00395
00400 #endif
00401 bool ascii_load(std::istream& s);
00402
00404 bool OK() const;
00405
00407 void swap(Constraint& y);
00408
00409 private:
00414 static const Constraint* zero_dim_false_p;
00415
00421 static const Constraint* zero_dim_positivity_p;
00422
00427 static const Constraint* epsilon_geq_zero_p;
00428
00434 static const Constraint* epsilon_leq_one_p;
00435
00436 friend class Parma_Polyhedra_Library::Congruence;
00437 friend class Parma_Polyhedra_Library::Scalar_Products;
00438 friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
00439 friend class Parma_Polyhedra_Library::Constraint_System;
00440 friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
00441
00442 friend class Parma_Polyhedra_Library::Polyhedron;
00443
00444 friend
00445 Parma_Polyhedra_Library
00446 ::Linear_Expression::Linear_Expression(const Constraint& c);
00447
00449 Constraint();
00450
00455 Constraint(Linear_Expression& e, Type type, Topology topology);
00456
00458 Constraint(const Congruence& cg, dimension_type sz, dimension_type capacity);
00459
00464 void
00465 throw_invalid_argument(const char* method, const char* message) const;
00466
00471 void
00472 throw_dimension_incompatible(const char* method,
00473 const char* name_var,
00474 Variable v) const;
00475
00476 friend Constraint
00477 operator==(const Linear_Expression& e1, const Linear_Expression& e2);
00478 friend Constraint
00479 operator==(Variable v1, Variable v2);
00480 friend Constraint
00481 operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
00482 friend Constraint
00483 operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
00484
00485 friend Constraint
00486 operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
00487 friend Constraint
00488 operator>=(Variable v1, Variable v2);
00489 friend Constraint
00490 operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00491 friend Constraint
00492 operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00493
00494 friend Constraint
00495 operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
00496 friend Constraint
00497 operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00498 friend Constraint
00499 operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00500
00501 friend Constraint
00502 operator>(const Linear_Expression& e1, const Linear_Expression& e2);
00503 friend Constraint
00504 operator>(Variable v1, Variable v2);
00505 friend Constraint
00506 operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
00507 friend Constraint
00508 operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
00509
00510 friend Constraint
00511 operator<(const Linear_Expression& e1, const Linear_Expression& e2);
00512 friend Constraint
00513 operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
00514 friend Constraint
00515 operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
00516
00518 Constraint(const Constraint& c, dimension_type sz);
00519
00524 static Constraint construct_epsilon_geq_zero();
00525
00527 static const Constraint& epsilon_geq_zero();
00528
00533 static const Constraint& epsilon_leq_one();
00534
00536 void set_is_equality();
00537
00539
00544 void set_is_inequality();
00545 };
00546
00547 namespace Parma_Polyhedra_Library {
00548
00549 namespace IO_Operators {
00550
00552
00553 std::ostream& operator<<(std::ostream& s, const Constraint& c);
00554
00556
00557 std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
00558
00559 }
00560
00561 }
00562
00563 #include "Constraint.inlines.hh"
00564
00565 #endif // !defined(PPL_Constraint_defs_hh)