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_PIP_Tree_defs_hh
00025 #define PPL_PIP_Tree_defs_hh 1
00026
00027 #include "PIP_Tree.types.hh"
00028 #include "Variable.defs.hh"
00029 #include "Linear_Expression.types.hh"
00030 #include "Constraint_System.defs.hh"
00031 #include "Constraint_System.inlines.hh"
00032 #include "Constraint.defs.hh"
00033 #include "Matrix.defs.hh"
00034 #include "Variables_Set.defs.hh"
00035 #include "globals.defs.hh"
00036 #include "PIP_Problem.defs.hh"
00037
00038 namespace Parma_Polyhedra_Library {
00039
00041
00047 class PIP_Tree_Node {
00048 protected:
00050 explicit PIP_Tree_Node(const PIP_Problem* owner);
00051
00053 PIP_Tree_Node(const PIP_Tree_Node& y);
00054
00056 const PIP_Problem* get_owner() const;
00057
00059 virtual void set_owner(const PIP_Problem* owner) = 0;
00060
00065 virtual bool check_ownership(const PIP_Problem* owner) const = 0;
00066
00067 public:
00069 virtual PIP_Tree_Node* clone() const = 0;
00070
00072 virtual ~PIP_Tree_Node();
00073
00075 virtual bool OK() const;
00076
00078 virtual const PIP_Solution_Node* as_solution() const;
00079
00081 virtual const PIP_Decision_Node* as_decision() const;
00082
00090 const Constraint_System& constraints() const;
00091
00092 class Artificial_Parameter;
00093
00095 typedef std::vector<Artificial_Parameter> Artificial_Parameter_Sequence;
00096
00098 Artificial_Parameter_Sequence::const_iterator art_parameter_begin() const;
00099
00101 Artificial_Parameter_Sequence::const_iterator art_parameter_end() const;
00102
00104 dimension_type art_parameter_count() const;
00105
00107
00114 void print(std::ostream& s, unsigned indent = 0) const;
00115
00117 void ascii_dump(std::ostream& s) const;
00118
00124 bool ascii_load(std::istream& s);
00125
00127 virtual memory_size_type total_memory_in_bytes() const = 0;
00129 virtual memory_size_type external_memory_in_bytes() const = 0;
00130
00131 protected:
00133 typedef std::vector<Constraint> Constraint_Sequence;
00134
00135
00136
00137 friend class PIP_Problem;
00138 friend class PIP_Decision_Node;
00139 friend class PIP_Solution_Node;
00140
00142 const PIP_Problem* owner_;
00143
00145 const PIP_Decision_Node* parent_;
00146
00148 Constraint_System constraints_;
00149
00151 Artificial_Parameter_Sequence artificial_parameters;
00152
00154 const PIP_Decision_Node* parent() const;
00155
00157 void set_parent(const PIP_Decision_Node* p);
00158
00179 virtual void update_tableau(const PIP_Problem& pip,
00180 dimension_type external_space_dim,
00181 dimension_type first_pending_constraint,
00182 const Constraint_Sequence& input_cs,
00183 const Variables_Set& parameters) = 0;
00184
00210 virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
00211 bool check_feasible_context,
00212 const Matrix& context,
00213 const Variables_Set& params,
00214 dimension_type space_dim,
00215 unsigned indent_level) = 0;
00216
00218 void add_constraint(const Row& x, const Variables_Set& parameters);
00219
00221 void parent_merge();
00222
00224
00240 virtual void print_tree(std::ostream& s,
00241 unsigned indent,
00242 const std::vector<bool>& pip_dim_is_param,
00243 dimension_type first_art_dim) const;
00244
00246 static void
00247 indent_and_print(std::ostream& s, unsigned indent, const char* str);
00248
00257 static bool compatibility_check(Matrix& s);
00258
00263 static bool compatibility_check(const Matrix& context, const Row& row);
00264
00265 };
00266
00267
00276 class PIP_Tree_Node::Artificial_Parameter
00277 : public Linear_Expression {
00278 public:
00280 Artificial_Parameter();
00281
00283
00299 Artificial_Parameter(const Linear_Expression& expr,
00300 Coefficient_traits::const_reference den);
00301
00303 Artificial_Parameter(const Artificial_Parameter& y);
00304
00306 Coefficient_traits::const_reference denominator() const;
00307
00309 void swap(Artificial_Parameter& y);
00310
00312
00316 bool operator==(const Artificial_Parameter& y) const;
00318 bool operator!=(const Artificial_Parameter& y) const;
00319
00320 PPL_OUTPUT_DECLARATIONS
00321
00327 bool ascii_load(std::istream& s);
00328
00330 memory_size_type total_memory_in_bytes() const;
00332 memory_size_type external_memory_in_bytes() const;
00333
00335 bool OK() const;
00336
00337 private:
00339 Coefficient denom;
00340 };
00341
00342
00344 class PIP_Solution_Node : public PIP_Tree_Node {
00345 public:
00347 explicit PIP_Solution_Node(const PIP_Problem* owner);
00348
00350 virtual PIP_Tree_Node* clone() const;
00351
00353 virtual ~PIP_Solution_Node();
00354
00356 virtual bool OK() const;
00357
00359 virtual const PIP_Solution_Node* as_solution() const;
00360
00374 const Linear_Expression& parametric_values(Variable var) const;
00375
00377 void ascii_dump(std::ostream& s) const;
00378
00384 bool ascii_load(std::istream& s);
00385
00387 virtual memory_size_type total_memory_in_bytes() const;
00389 virtual memory_size_type external_memory_in_bytes() const;
00390
00391 private:
00393 struct Tableau {
00395 Matrix s;
00397 Matrix t;
00399 Coefficient denom;
00400
00402 Tableau();
00404 Tableau(const Tableau& y);
00406 ~Tableau();
00407
00409 bool is_integer() const;
00410
00412 void scale(Coefficient_traits::const_reference ratio);
00413
00415
00419 void normalize();
00420
00470 bool is_better_pivot(const std::vector<dimension_type>& mapping,
00471 const std::vector<bool>& basis,
00472 const dimension_type i,
00473 const dimension_type j,
00474 const dimension_type i_,
00475 const dimension_type j_) const;
00476
00478 Coefficient_traits::const_reference denominator() const;
00479
00481 void ascii_dump(std::ostream& s) const;
00482
00488 bool ascii_load(std::istream& s);
00489
00491
00496 memory_size_type external_memory_in_bytes() const;
00497
00499 bool OK() const;
00500 };
00501
00503 Tableau tableau;
00504
00523 std::vector<bool> basis;
00524
00535 std::vector<dimension_type> mapping;
00536
00540 std::vector<dimension_type> var_row;
00541
00545 std::vector<dimension_type> var_column;
00546
00564 dimension_type special_equality_row;
00565
00570 dimension_type big_dimension;
00571
00573 enum Row_Sign {
00575 UNKNOWN,
00577 ZERO,
00579 POSITIVE,
00581 NEGATIVE,
00583 MIXED
00584 };
00585
00587 std::vector<Row_Sign> sign;
00588
00590 std::vector<Linear_Expression> solution;
00591
00593 bool solution_valid;
00594
00596 static Row_Sign row_sign(const Row& x, dimension_type big_dimension);
00597
00598 protected:
00600 PIP_Solution_Node(const PIP_Solution_Node& y);
00601
00603 struct No_Constraints {};
00604
00606
00610 PIP_Solution_Node(const PIP_Solution_Node& y, No_Constraints);
00611
00612
00613 friend bool PIP_Problem::ascii_load(std::istream& s);
00614
00616 virtual void set_owner(const PIP_Problem* owner);
00617
00622 virtual bool check_ownership(const PIP_Problem* owner) const;
00623
00625 virtual void update_tableau(const PIP_Problem& pip,
00626 dimension_type external_space_dim,
00627 dimension_type first_pending_constraint,
00628 const Constraint_Sequence& input_cs,
00629 const Variables_Set& parameters);
00630
00639 void update_solution(const std::vector<bool>& pip_dim_is_param) const;
00640
00642 void update_solution() const;
00643
00645 virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
00646 bool check_feasible_context,
00647 const Matrix& context,
00648 const Variables_Set& params,
00649 dimension_type space_dim,
00650 unsigned indent_level);
00651
00673 void generate_cut(dimension_type i,
00674 Variables_Set& parameters,
00675 Matrix& context,
00676 dimension_type& space_dimension,
00677 unsigned indent_level);
00678
00680 virtual void print_tree(std::ostream& s,
00681 unsigned indent,
00682 const std::vector<bool>& pip_dim_is_param,
00683 dimension_type first_art_dim) const;
00684
00685 };
00686
00687
00689 class PIP_Decision_Node : public PIP_Tree_Node {
00690 public:
00692 virtual PIP_Tree_Node* clone() const;
00693
00695 virtual ~PIP_Decision_Node();
00696
00698 virtual bool OK() const;
00699
00701 virtual const PIP_Decision_Node* as_decision() const;
00702
00704 const PIP_Tree_Node* child_node(bool b) const;
00705
00707 PIP_Tree_Node* child_node(bool b);
00708
00710 void ascii_dump(std::ostream& s) const;
00711
00717 bool ascii_load(std::istream& s);
00718
00720 virtual memory_size_type total_memory_in_bytes() const;
00722 virtual memory_size_type external_memory_in_bytes() const;
00723
00724 private:
00725
00726 friend class PIP_Solution_Node;
00727
00728
00729 friend bool PIP_Problem::ascii_load(std::istream& s);
00730
00732 PIP_Tree_Node* false_child;
00733
00735 PIP_Tree_Node* true_child;
00736
00759 explicit PIP_Decision_Node(const PIP_Problem* owner,
00760 PIP_Tree_Node* fcp,
00761 PIP_Tree_Node* tcp);
00762
00764 virtual void set_owner(const PIP_Problem* owner);
00765
00770 virtual bool check_ownership(const PIP_Problem* owner) const;
00771
00772 protected:
00774 PIP_Decision_Node(const PIP_Decision_Node& y);
00775
00777 virtual void update_tableau(const PIP_Problem& pip,
00778 dimension_type external_space_dim,
00779 dimension_type first_pending_constraint,
00780 const Constraint_Sequence& input_cs,
00781 const Variables_Set& parameters);
00782
00784 virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
00785 bool check_feasible_context,
00786 const Matrix& context,
00787 const Variables_Set& params,
00788 dimension_type space_dim,
00789 unsigned indent_level);
00790
00792 virtual void print_tree(std::ostream& s,
00793 unsigned indent,
00794 const std::vector<bool>& pip_dim_is_param,
00795 dimension_type first_art_dim) const;
00796
00797 };
00798
00799 namespace IO_Operators {
00800
00802
00803 std::ostream& operator<<(std::ostream& os, const PIP_Tree_Node& x);
00804
00806
00807 std::ostream& operator<<(std::ostream& os,
00808 const PIP_Tree_Node::Artificial_Parameter& x);
00809
00810 }
00811
00812 }
00813
00814 #include "PIP_Tree.inlines.hh"
00815
00816 #endif // !defined(PPL_PIP_Tree_defs_hh)