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_Linear_Expression_defs_hh
00025 #define PPL_Linear_Expression_defs_hh 1
00026
00027 #include "Linear_Expression.types.hh"
00028 #include "Scalar_Products.types.hh"
00029 #include "Constraint.types.hh"
00030 #include "Generator.types.hh"
00031 #include "Congruence.types.hh"
00032 #include "Grid_Generator.types.hh"
00033 #include "Linear_Row.defs.hh"
00034 #include "Coefficient.types.hh"
00035 #include "Variable.defs.hh"
00036 #include "Constraint_System.types.hh"
00037 #include "Generator_System.types.hh"
00038 #include "Congruence_System.types.hh"
00039 #include "Grid_Generator_System.types.hh"
00040 #include "Polyhedron.types.hh"
00041 #include "Grid.types.hh"
00042 #include <cstddef>
00043
00044 namespace Parma_Polyhedra_Library {
00045
00046
00048
00049 Linear_Expression
00050 operator+(const Linear_Expression& e1, const Linear_Expression& e2);
00051
00053
00054 Linear_Expression
00055 operator+(Variable v, Variable w);
00056
00058
00059 Linear_Expression
00060 operator+(Variable v, const Linear_Expression& e);
00061
00063
00064 Linear_Expression
00065 operator+(const Linear_Expression& e, Variable v);
00066
00068
00069 Linear_Expression
00070 operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
00071
00073
00074 Linear_Expression
00075 operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
00076
00078
00079 Linear_Expression
00080 operator+(const Linear_Expression& e);
00081
00083
00084 Linear_Expression
00085 operator-(const Linear_Expression& e);
00086
00088
00089 Linear_Expression
00090 operator-(const Linear_Expression& e1, const Linear_Expression& e2);
00091
00093
00094 Linear_Expression
00095 operator-(Variable v, Variable w);
00096
00098
00099 Linear_Expression
00100 operator-(Variable v, const Linear_Expression& e);
00101
00103
00104 Linear_Expression
00105 operator-(const Linear_Expression& e, Variable v);
00106
00108
00109 Linear_Expression
00110 operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
00111
00113
00114 Linear_Expression
00115 operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
00116
00118
00119 Linear_Expression
00120 operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
00121
00123
00124 Linear_Expression
00125 operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
00126
00128
00129 Linear_Expression&
00130 operator+=(Linear_Expression& e1, const Linear_Expression& e2);
00131
00133
00138 Linear_Expression&
00139 operator+=(Linear_Expression& e, Variable v);
00140
00142
00143 Linear_Expression&
00144 operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
00145
00147
00148 Linear_Expression&
00149 operator-=(Linear_Expression& e1, const Linear_Expression& e2);
00150
00152
00157 Linear_Expression&
00158 operator-=(Linear_Expression& e, Variable v);
00159
00161
00162 Linear_Expression&
00163 operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
00164
00166
00167 Linear_Expression&
00168 operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
00169
00171
00172 Linear_Expression&
00173 add_mul_assign(Linear_Expression& e,
00174 Coefficient_traits::const_reference n, Variable v);
00175
00177
00178 Linear_Expression&
00179 sub_mul_assign(Linear_Expression& e,
00180 Coefficient_traits::const_reference n, Variable v);
00181
00182 namespace IO_Operators {
00183
00185
00186 std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
00187
00188 }
00189
00190 }
00191
00192
00193 namespace std {
00194
00196
00197 void swap(Parma_Polyhedra_Library::Linear_Expression& x,
00198 Parma_Polyhedra_Library::Linear_Expression& y);
00199
00200 }
00201
00203
00249 class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row {
00250 public:
00252 Linear_Expression();
00253
00255 Linear_Expression(const Linear_Expression& e);
00256
00258 ~Linear_Expression();
00259
00264 explicit Linear_Expression(Coefficient_traits::const_reference n);
00265
00267
00272 Linear_Expression(Variable v);
00273
00275
00284 explicit Linear_Expression(const Constraint& c);
00285
00299 explicit Linear_Expression(const Generator& g);
00300
00310 explicit Linear_Expression(const Grid_Generator& g);
00311
00313
00318 explicit Linear_Expression(const Congruence& cg);
00319
00321 static dimension_type max_space_dimension();
00322
00324 dimension_type space_dimension() const;
00325
00327 Coefficient_traits::const_reference coefficient(Variable v) const;
00328
00330 Coefficient_traits::const_reference inhomogeneous_term() const;
00331
00333 bool is_zero() const;
00334
00339 bool all_homogeneous_terms_are_zero() const;
00340
00342 static void initialize();
00343
00345 static void finalize();
00346
00348 static const Linear_Expression& zero();
00349
00354 memory_size_type total_memory_in_bytes() const;
00355
00357 memory_size_type external_memory_in_bytes() const;
00358
00359 PPL_OUTPUT_DECLARATIONS
00360
00366 bool ascii_load(std::istream& s);
00367
00369 bool OK() const;
00370
00372 void swap(Linear_Expression& y);
00373
00374 private:
00379 static const Linear_Expression* zero_p;
00380
00381 friend class Parma_Polyhedra_Library::Scalar_Products;
00382 friend class Parma_Polyhedra_Library::Constraint;
00383 friend class Parma_Polyhedra_Library::Generator;
00384
00385 friend class Parma_Polyhedra_Library::Grid_Generator;
00386 friend class Parma_Polyhedra_Library::Congruence;
00387
00388 friend class Parma_Polyhedra_Library::Polyhedron;
00389 friend class Parma_Polyhedra_Library::Grid;
00390
00391
00392
00393 friend class Parma_Polyhedra_Library::Constraint_System;
00394
00395
00396
00397 friend class Parma_Polyhedra_Library::Generator_System;
00398
00399
00400
00401 friend class Parma_Polyhedra_Library::Congruence_System;
00402
00403
00404
00405 friend class Parma_Polyhedra_Library::Grid_Generator_System;
00406
00408 Linear_Expression(const Linear_Expression& e, dimension_type sz);
00409
00411
00415 Linear_Expression(dimension_type sz, bool);
00416
00425 Linear_Expression(Variable v, Variable w);
00426
00427 friend Linear_Expression
00428 operator+(const Linear_Expression& e1, const Linear_Expression& e2);
00429 friend Linear_Expression
00430 operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
00431 friend Linear_Expression
00432 operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
00433 friend Linear_Expression
00434 operator+(Variable v, const Linear_Expression& e);
00435 friend Linear_Expression
00436 operator+(Variable v, Variable w);
00437
00438 friend Linear_Expression
00439 operator-(const Linear_Expression& e);
00440
00441 friend Linear_Expression
00442 operator-(const Linear_Expression& e1, const Linear_Expression& e2);
00443 friend Linear_Expression
00444 operator-(Variable v, Variable w);
00445 friend Linear_Expression
00446 operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
00447 friend Linear_Expression
00448 operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
00449 friend Linear_Expression
00450 operator-(Variable v, const Linear_Expression& e);
00451 friend Linear_Expression
00452 operator-(const Linear_Expression& e, Variable v);
00453
00454 friend Linear_Expression
00455 operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
00456 friend Linear_Expression
00457 operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
00458
00459 friend Linear_Expression&
00460 operator+=(Linear_Expression& e1, const Linear_Expression& e2);
00461 friend Linear_Expression&
00462 operator+=(Linear_Expression& e, Variable v);
00463 friend Linear_Expression&
00464 operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
00465
00466 friend Linear_Expression&
00467 operator-=(Linear_Expression& e1, const Linear_Expression& e2);
00468 friend Linear_Expression&
00469 operator-=(Linear_Expression& e, Variable v);
00470 friend Linear_Expression&
00471 operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
00472
00473 friend Linear_Expression&
00474 operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
00475
00476 friend Linear_Expression&
00477 add_mul_assign(Linear_Expression& e,
00478 Coefficient_traits::const_reference n, Variable v);
00479 friend Linear_Expression&
00480 sub_mul_assign(Linear_Expression& e,
00481 Coefficient_traits::const_reference n, Variable v);
00482
00483 friend std::ostream&
00484 Parma_Polyhedra_Library::IO_Operators
00485 ::operator<<(std::ostream& s, const Linear_Expression& e);
00486 };
00487
00488 #include "Linear_Expression.inlines.hh"
00489
00490 #endif // !defined(PPL_Linear_Expression_defs_hh)