00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PPL_Constraint_defs_hh
00025 #define PPL_Constraint_defs_hh 1
00026
00027 #include "Constraint.types.hh"
00028 #include "Scalar_Products.types.hh"
00029 #include "Linear_Row.defs.hh"
00030 #include "Variable.defs.hh"
00031 #include "Linear_Expression.defs.hh"
00032 #include "Constraint_System.defs.hh"
00033 #include "Polyhedron.types.hh"
00034 #include "Congruence.types.hh"
00035 #include <iosfwd>
00036
00037 namespace Parma_Polyhedra_Library {
00038
00039
00040
00042
00043 bool
00044 operator==(const Constraint& x, const Constraint& y);
00045
00047
00048 bool
00049 operator!=(const Constraint& x, const Constraint& y);
00050
00052
00053 Constraint
00054 operator==(const Linear_Expression& e1, const Linear_Expression& e2);
00055
00057
00058 Constraint
00059 operator==(Variable v1, Variable v2);
00060
00062
00063 Constraint
00064 operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
00065
00067
00068 Constraint
00069 operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
00070
00072
00073 Constraint
00074 operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
00075
00077
00078 Constraint
00079 operator<=(Variable v1, Variable v2);
00080
00082
00083 Constraint
00084 operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00085
00087
00088 Constraint
00089 operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00090
00092
00093 Constraint
00094 operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
00095
00097
00098 Constraint
00099 operator>=(Variable v1, Variable v2);
00100
00102
00103 Constraint
00104 operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00105
00107
00108 Constraint
00109 operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00110
00112
00113 Constraint
00114 operator<(const Linear_Expression& e1, const Linear_Expression& e2);
00115
00117
00118 Constraint
00119 operator<(Variable v1, Variable v2);
00120
00122
00123 Constraint
00124 operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
00125
00127
00128 Constraint
00129 operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
00130
00132
00133 Constraint
00134 operator>(const Linear_Expression& e1, const Linear_Expression& e2);
00135
00137
00138 Constraint
00139 operator>(Variable v1, Variable v2);
00140
00142
00143 Constraint
00144 operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
00145
00147
00148 Constraint
00149 operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
00150
00151 }
00152
00153
00154 namespace std {
00155
00157
00158 void swap(Parma_Polyhedra_Library::Constraint& x,
00159 Parma_Polyhedra_Library::Constraint& y);
00160
00161 }
00162
00164
00261 class Parma_Polyhedra_Library::Constraint : private Linear_Row {
00262 public:
00264 Constraint(const Constraint& c);
00265
00267
00271 explicit Constraint(const Congruence& cg);
00272
00274 ~Constraint();
00275
00277 Constraint& operator=(const Constraint& c);
00278
00280 static dimension_type max_space_dimension();
00281
00283 dimension_type space_dimension() const;
00284
00286 enum Type {
00288 EQUALITY,
00290 NONSTRICT_INEQUALITY,
00292 STRICT_INEQUALITY
00293 };
00294
00296 Type type() const;
00297
00302 bool is_equality() const;
00303
00308 bool is_inequality() const;
00309
00314 bool is_nonstrict_inequality() const;
00315
00320 bool is_strict_inequality() const;
00321
00323
00327 Coefficient_traits::const_reference coefficient(Variable v) const;
00328
00330 Coefficient_traits::const_reference inhomogeneous_term() const;
00331
00333 static void initialize();
00334
00336 static void finalize();
00337
00339 static const Constraint& zero_dim_false();
00340
00345 static const Constraint& zero_dim_positivity();
00346
00351 memory_size_type total_memory_in_bytes() const;
00352
00354 memory_size_type external_memory_in_bytes() const;
00355
00367 bool is_tautological() const;
00368
00381 bool is_inconsistent() const;
00382
00391 bool is_equivalent_to(const Constraint& y) const;
00392
00393 PPL_OUTPUT_DECLARATIONS
00394
00400 bool ascii_load(std::istream& s);
00401
00403 bool OK() const;
00404
00406 void swap(Constraint& y);
00407
00408 private:
00413 static const Constraint* zero_dim_false_p;
00414
00420 static const Constraint* zero_dim_positivity_p;
00421
00426 static const Constraint* epsilon_geq_zero_p;
00427
00433 static const Constraint* epsilon_leq_one_p;
00434
00435 friend class Parma_Polyhedra_Library::Congruence;
00436 friend class Parma_Polyhedra_Library::Scalar_Products;
00437 friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
00438 friend class Parma_Polyhedra_Library::Constraint_System;
00439 friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
00440
00441 friend class Parma_Polyhedra_Library::Polyhedron;
00442
00443 friend
00444 Parma_Polyhedra_Library
00445 ::Linear_Expression::Linear_Expression(const Constraint& c);
00446
00448 Constraint();
00449
00454 Constraint(Linear_Expression& e, Type type, Topology topology);
00455
00457 Constraint(const Congruence& cg, dimension_type sz, dimension_type capacity);
00458
00463 void
00464 throw_invalid_argument(const char* method, const char* message) const;
00465
00470 void
00471 throw_dimension_incompatible(const char* method,
00472 const char* name_var,
00473 Variable v) const;
00474
00475 friend Constraint
00476 operator==(const Linear_Expression& e1, const Linear_Expression& e2);
00477 friend Constraint
00478 operator==(Variable v1, Variable v2);
00479 friend Constraint
00480 operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
00481 friend Constraint
00482 operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
00483
00484 friend Constraint
00485 operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
00486 friend Constraint
00487 operator>=(Variable v1, Variable v2);
00488 friend Constraint
00489 operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00490 friend Constraint
00491 operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00492
00493 friend Constraint
00494 operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
00495 friend Constraint
00496 operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00497 friend Constraint
00498 operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
00499
00500 friend Constraint
00501 operator>(const Linear_Expression& e1, const Linear_Expression& e2);
00502 friend Constraint
00503 operator>(Variable v1, Variable v2);
00504 friend Constraint
00505 operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
00506 friend Constraint
00507 operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
00508
00509 friend Constraint
00510 operator<(const Linear_Expression& e1, const Linear_Expression& e2);
00511 friend Constraint
00512 operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
00513 friend Constraint
00514 operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
00515
00517 Constraint(const Constraint& c, dimension_type sz);
00518
00523 static Constraint construct_epsilon_geq_zero();
00524
00526 static const Constraint& epsilon_geq_zero();
00527
00532 static const Constraint& epsilon_leq_one();
00533
00535 void set_is_equality();
00536
00538
00543 void set_is_inequality();
00544 };
00545
00546 namespace Parma_Polyhedra_Library {
00547
00548 namespace IO_Operators {
00549
00551
00552 std::ostream& operator<<(std::ostream& s, const Constraint& c);
00553
00555
00556 std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
00557
00558 }
00559
00560 }
00561
00562 #include "Constraint.inlines.hh"
00563
00564 #endif // !defined(PPL_Constraint_defs_hh)