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_Linear_Expression_defs_hh
00024 #define PPL_Linear_Expression_defs_hh 1
00025
00026 #include "Linear_Expression.types.hh"
00027 #include "Scalar_Products.types.hh"
00028 #include "Constraint.types.hh"
00029 #include "Generator.types.hh"
00030 #include "Congruence.types.hh"
00031 #include "Grid_Generator.types.hh"
00032 #include "Linear_Row.defs.hh"
00033 #include "Coefficient.types.hh"
00034 #include "Variable.defs.hh"
00035 #include "Constraint_System.types.hh"
00036 #include "Generator_System.types.hh"
00037 #include "Congruence_System.types.hh"
00038 #include "Grid_Generator_System.types.hh"
00039 #include "Polyhedron.types.hh"
00040 #include "Grid.types.hh"
00041 #include "LP_Problem.types.hh"
00042 #include <cstddef>
00043
00044 namespace Parma_Polyhedra_Library {
00045
00046
00048
00049 Congruence
00050 operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
00051
00053
00054 Congruence
00055 operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
00056
00058
00059 Linear_Expression
00060 operator+(const Linear_Expression& e1, const Linear_Expression& e2);
00061
00063
00064 Linear_Expression
00065 operator+(Variable v, Variable w);
00066
00068
00069 Linear_Expression
00070 operator+(Variable v, const Linear_Expression& e);
00071
00073
00074 Linear_Expression
00075 operator+(const Linear_Expression& e, Variable v);
00076
00078
00079 Linear_Expression
00080 operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
00081
00083
00084 Linear_Expression
00085 operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
00086
00088
00089 Linear_Expression
00090 operator+(const Linear_Expression& e);
00091
00093
00094 Linear_Expression
00095 operator-(const Linear_Expression& e);
00096
00098
00099 Linear_Expression
00100 operator-(const Linear_Expression& e1, const Linear_Expression& e2);
00101
00103
00104 Linear_Expression
00105 operator-(Variable v, Variable w);
00106
00108
00109 Linear_Expression
00110 operator-(Variable v, const Linear_Expression& e);
00111
00113
00114 Linear_Expression
00115 operator-(const Linear_Expression& e, Variable v);
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*(Coefficient_traits::const_reference n, const Linear_Expression& e);
00131
00133
00134 Linear_Expression
00135 operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
00136
00138
00139 Linear_Expression&
00140 operator+=(Linear_Expression& e1, const Linear_Expression& e2);
00141
00143
00148 Linear_Expression&
00149 operator+=(Linear_Expression& e, Variable v);
00150
00152
00153 Linear_Expression&
00154 operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
00155
00157
00158 Linear_Expression&
00159 operator-=(Linear_Expression& e1, const Linear_Expression& e2);
00160
00162
00167 Linear_Expression&
00168 operator-=(Linear_Expression& e, Variable v);
00169
00171
00172 Linear_Expression&
00173 operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
00174
00176
00177 Linear_Expression&
00178 operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
00179
00180 namespace IO_Operators {
00181
00183
00184 std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
00185
00186 }
00187
00188 }
00189
00190
00191 namespace std {
00192
00194
00195 void swap(Parma_Polyhedra_Library::Linear_Expression& x,
00196 Parma_Polyhedra_Library::Linear_Expression& y);
00197
00198 }
00199
00201
00247 class Parma_Polyhedra_Library::Linear_Expression : private Linear_Row {
00248 public:
00250 Linear_Expression();
00251
00253 Linear_Expression(const Linear_Expression& e);
00254
00256 ~Linear_Expression();
00257
00262 explicit Linear_Expression(Coefficient_traits::const_reference n);
00263
00265
00270 Linear_Expression(Variable v);
00271
00273
00282 explicit Linear_Expression(const Constraint& c);
00283
00297 explicit Linear_Expression(const Generator& g);
00298
00300
00305 explicit Linear_Expression(const Congruence& cg);
00306
00308 static dimension_type max_space_dimension();
00309
00311 dimension_type space_dimension() const;
00312
00314 Coefficient_traits::const_reference coefficient(Variable v) const;
00315
00317 Coefficient_traits::const_reference inhomogeneous_term() const;
00318
00320 static const Linear_Expression& zero();
00321
00326 memory_size_type total_memory_in_bytes() const;
00327
00329 memory_size_type external_memory_in_bytes() const;
00330
00332 bool OK() const;
00333
00335 void swap(Linear_Expression& y);
00336
00337 private:
00338 friend class Parma_Polyhedra_Library::Scalar_Products;
00339 friend class Parma_Polyhedra_Library::Constraint;
00340 friend class Parma_Polyhedra_Library::Generator;
00341
00342 friend class Parma_Polyhedra_Library::Grid_Generator;
00343 friend class Parma_Polyhedra_Library::Congruence;
00344
00345 friend class Parma_Polyhedra_Library::Polyhedron;
00346 friend class Parma_Polyhedra_Library::Grid;
00347 friend class Parma_Polyhedra_Library::LP_Problem;
00348
00349
00350
00351 friend class Parma_Polyhedra_Library::Constraint_System;
00352
00353
00354
00355 friend class Parma_Polyhedra_Library::Generator_System;
00356
00357
00358
00359 friend class Parma_Polyhedra_Library::Congruence_System;
00360
00361
00362
00363 friend class Parma_Polyhedra_Library::Grid_Generator_System;
00364
00366 Linear_Expression(const Linear_Expression& e, dimension_type sz);
00367
00369
00373 Linear_Expression(dimension_type sz, bool);
00374
00375 friend Linear_Expression
00376 Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
00377 const Linear_Expression& e2);
00378 friend Linear_Expression
00379 Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
00380 const Linear_Expression& e);
00381 friend Linear_Expression
00382 Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
00383 Coefficient_traits::const_reference n);
00384
00385 friend Linear_Expression
00386 Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
00387
00388 friend Linear_Expression
00389 Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
00390 const Linear_Expression& e2);
00391 friend Linear_Expression
00392 Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
00393 const Linear_Expression& e);
00394 friend Linear_Expression
00395 Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
00396 Coefficient_traits::const_reference n);
00397
00398 friend Linear_Expression
00399 Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
00400 const Linear_Expression& e);
00401 friend Linear_Expression
00402 Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
00403 Coefficient_traits::const_reference n);
00404
00405 friend Linear_Expression&
00406 Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
00407 const Linear_Expression& e2);
00408 friend Linear_Expression&
00409 Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
00410 Variable v);
00411 friend Linear_Expression&
00412 Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
00413 Coefficient_traits::const_reference n);
00414
00415 friend Linear_Expression&
00416 Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
00417 const Linear_Expression& e2);
00418 friend Linear_Expression&
00419 Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
00420 Variable v);
00421 friend Linear_Expression&
00422 Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
00423 Coefficient_traits::const_reference n);
00424
00425 friend Linear_Expression&
00426 Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
00427 Coefficient_traits::const_reference n);
00428
00429 friend std::ostream&
00430 Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
00431 const Linear_Expression& e);
00432
00433 friend Congruence
00434 Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
00435 const Linear_Expression& e2);
00436
00437 friend Congruence
00438 Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
00439 Coefficient_traits::const_reference n);
00440 };
00441
00442 #include "Linear_Expression.inlines.hh"
00443
00444 #endif // !defined(PPL_Linear_Expression_defs_hh)