00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #ifndef _MODEL_H_
00029 #define _MODEL_H_
00030
00031 #include <iostream>
00032 #include <coconut_config.h>
00033 #include <expression.h>
00034 #include <database>
00035 #include <annotation.h>
00036 #include <api_debug.h>
00037
00038 using namespace vgtl;
00039
00040 namespace coco {
00041
00042 class model_gid;
00043 class dag_delta;
00044
00046
00055 class model: public dag<expression_node>
00056 {
00057 private:
00059 typedef dag<expression_node> _Base;
00060
00061 public:
00063 typedef dag<expression_node>::walker walker;
00065 typedef dag<expression_node>::const_walker const_walker;
00066
00068 typedef std::vector<walker>::iterator ref_iterator;
00070 typedef std::vector<walker>::const_iterator const_ref_iterator;
00071
00072 private:
00074 std::vector<walker> node_ref;
00077 std::vector<walker> var_ref;
00080 std::vector<walker> ghost_ref;
00082 model_gid* gid;
00086 bool keep_gid;
00089 bool destroy_node_ref;
00090
00091 public:
00093 linalg::matrix<double> lin;
00095 std::vector<linalg::matrix<double> > matd;
00097 std::vector<linalg::matrix<interval> > mati;
00107 int ocoeff;
00109 walker objective;
00112 std::vector<walker> constraints;
00115 bool has_read_errors;
00116 public:
00121 model(model_gid* __id = NULL, bool clone = false);
00127 model(model_gid* __id, const erased_part& _ep, bool clone = false);
00130 model(int __num_of_vars);
00132 model(const model& __m);
00135 model(model_gid* __id, const model& __m);
00143 model(std::istream& inp, bool do_simplify = true, vdbl::database* _db = NULL,
00144 vdbl::userid _uid = vdbl::userid(), std::vector<annotation>* _la = NULL,
00145 std::string mname = std::string(), bool continue_on_errors = false);
00152 model(const char* name, bool do_simplify = true, vdbl::database* _db = NULL,
00153 vdbl::userid _uid = vdbl::userid(), std::vector<annotation>* _la = NULL,
00154 bool continue_on_errors = false);
00155
00157 ~model();
00158
00160 int next_num();
00162 int next_variable_num();
00164 int next_constraint_num();
00165
00173 unsigned int number_of_variables() const;
00176 unsigned int number_of_nodes() const;
00179 unsigned int number_of_constraints() const;
00182 unsigned int number_of_managed_nodes() const
00183 { return (unsigned int)node_ref.size(); }
00186 unsigned int number_of_managed_variables() const
00187 { return (unsigned int)var_ref.size(); }
00190 unsigned int number_of_managed_constraints() const
00191 { return (unsigned int)constraints.size(); }
00193 const walker& var(unsigned int i) const;
00195 const walker& node(unsigned int i) const;
00197 const walker& constraint(unsigned int i) const;
00199 model_gid* gid_data() const { return gid; }
00201
00204 void detach_gid();
00205
00210 void compress_numbers();
00214 void renumber_variables();
00218 void renumber_constraints();
00219
00220 private:
00221 struct __docompare_nodes;
00222 struct __docompare_variables;
00223 class sort_constraints;
00224 class simplify_visitor_0;
00225 class simplify_visitor_m;
00226 struct lincoeff_visitor_st;
00227 struct lincoeff_visitor_ret;
00228 class lincoeff_visitor;
00229 struct detect_0chain_visitor_st;
00230 class detect_0chain_visitor;
00231 #if 0
00232 class simplify_visitor_thin;
00233 #endif
00234
00237 interval read_interval(char *& cp, int ln);
00238
00243 template <typename _TT>
00244 void read_vector(std::vector<_TT>& hd, char *& cq, const char *format,
00245 const char* message, int ln);
00246
00250 void store_point_in_db(const std::vector<double>& pt, vdbl::database* _db,
00251 vdbl::userid _uid, unsigned int point_class,
00252 std::vector<annotation>* _la) const;
00253
00262 void model_read(std::istream& inp, bool do_simplify, vdbl::database* _db,
00263 vdbl::userid _uid, std::vector<annotation>* _la,
00264 std::string mname = std::string(),
00265 bool continue_on_errors = false);
00271 bool read(std::istream& __i, vdbl::database* _db, vdbl::userid _uid,
00272 std::vector<annotation>* _la, bool continue_on_errors = false);
00275 bool children_eq(walker __n1, walker __n2);
00276
00280 void del_nodes_and_edges(const std::vector<unsigned int>& delnodes,
00281 const std::vector<std::pair<unsigned int,unsigned int> >& deledges,
00282 const std::vector<unsigned int>& delghosts);
00286 bool exchange_ghost(walker prnt, walker gh_old, unsigned int _nnum);
00289 void safe_ghost(walker prnt, unsigned int _nnum);
00290
00293 bool basic_simplify_0();
00295 bool basic_simplify_1_merge(walker __s, std::list<walker>& _todo,
00296 std::vector<int>& _combined, std::vector<bool>& _fld,
00297 std::vector<int>& _sorted);
00299 void basic_simplify_1_flood(walker __s, std::vector<int>& _combined);
00302 bool basic_simplify_1_is_ready(walker __s, const std::vector<int>& _combined,
00303 bool all_finished);
00306 bool basic_simplify_1();
00309 bool basic_simplify_2(std::set<std::pair<unsigned int, unsigned int> >&
00310 trf_gh_set, std::map<unsigned int, unsigned int>& gh_new_map);
00311
00315 void fill_arrays(walker __w, std::vector<walker>& __n,
00316 std::vector<walker>& __v, std::vector<walker>& __g);
00319 void copy_contents(model_gid* gid, const model& __m);
00323 void prepare_after_read();
00324
00325 public:
00327 void prepare_kill() { keep_gid = destroy_node_ref = true; }
00330 bool micro_simplify();
00332 bool basic_simplify();
00335 void arrange_constraints();
00338 void detect_0chain();
00342 bool simplify_thin();
00345 void set_counters();
00348 void clr_sky_ground_link();
00349
00351 void write(std::ostream& __o = std::cout) const;
00352 #if MODEL_INLINE_DEBUG
00353
00354 void dbg_write() const;
00355 #endif
00356
00357 void check_counters(bool reset) const;
00358
00359 public:
00361 ref_iterator ghost_begin() { return ghost_ref.begin(); }
00363 const_ref_iterator ghost_begin() const { return ghost_ref.begin(); }
00365 ref_iterator ghost_end() { return ghost_ref.end(); }
00367 const_ref_iterator ghost_end() const { return ghost_ref.end(); }
00368
00370 walker store_node(const walker& _w);
00372 walker store_variable(const walker& _w);
00374 walker store_ghost(const walker& _w);
00376 walker store_constraint(const walker& _w);
00377
00379 void free_node_num(unsigned int _nnum);
00381 void free_var_num(int _vnum);
00384 void free_const_num(const walker& _w, unsigned int _cnum);
00387 void free_all();
00390 void free_nodes_on_destroy();
00393 void keep_nodes_on_destroy();
00394
00396
00398 void remove_node(const walker& _w, unsigned int _nnum);
00399 void remove_node(const walker& _w);
00400 void remove_node(unsigned int __node_num);
00402
00406 void new_variables(int _new_num_of_vars);
00407
00413 walker ghost(unsigned int _nnum);
00414
00416 walker constant(double _constant);
00418 walker constant(const std::vector<double>& _constant);
00419
00421 walker variable(unsigned int _vnum);
00422
00426 walker binary(const walker& _op1, const walker& _op2, int expr_type,
00427 double _coeff1 = 1.0, double _coeff2 = 1.0);
00432 walker binary(const walker& _op1, const walker& _op2, int expr_type,
00433 const basic_alltype& _params, double _coeff1 = 1.0,
00434 double _coeff2 = 1.0);
00435
00438 walker unary(const walker& _op1, int expr_type, double _coeff = 1.0);
00442 walker unary(const walker& _op1, int expr_type, const basic_alltype& _params,
00443 double _coeff = 1.0);
00444
00448 walker nary(const std::vector<walker>& _op, int expr_type,
00449 const std::vector<double>& _coeffs = std::vector<double>());
00453 walker nary(const std::vector<walker>& _op, int expr_type,
00454 const basic_alltype& _params,
00455 const std::vector<double>& _coeffs = std::vector<double>());
00456
00460 walker vnary(int expr_type, ...);
00466 walker vxnary(const basic_alltype& _params, int expr_type, ...);
00468
00470 bool is_empty(const walker& _w) const;
00472 walker empty_reference() const;
00473
00474 public:
00481 const std::string model_name() const;
00483 const std::string var_name(unsigned int n) const;
00485 const std::string const_name(unsigned int n) const;
00487 const std::string obj_name() const;
00489 double obj_adj() const;
00491 double obj_mult() const;
00493 size_t n_fixed_vars() const;
00495 std::pair<const std::string, double> fixed_var(unsigned int n) const;
00497 size_t n_unused_vars() const;
00499 const std::string& unused_var(unsigned int n) const;
00501 size_t n_unused_constrs() const;
00503 const std::string& unused_constr(unsigned int n) const;
00504
00507 const std::map<int, std::vector<double> >& trace_points() const;
00510 const std::map<int, std::vector<double> >& optima() const;
00511
00516 bool get_const_num(unsigned int node_num, unsigned int& const_num) const;
00518
00519 public:
00526 bool get_linear_coeffs(const const_walker& expr,
00527 linalg::sparse_vector<double>& coeffs, double& constant,
00528 const std::vector<interval>& _ranges);
00533 bool get_linear_coeffs(const const_walker& expr,
00534 linalg::sparse_vector<double>& coeffs, double& constant);
00535
00536 friend class dag_delta;
00537 friend class dag_undelta;
00538 };
00539
00541
00552 class model_iddata
00553 {
00554 private:
00558 unsigned int node_num_max;
00561 unsigned int var_num_max;
00564 unsigned int const_num_max;
00567 std::vector<unsigned int> node_free;
00570 std::vector<unsigned int> var_free;
00573 std::vector<unsigned int> const_free;
00574
00577 std::list<model_gid*> backref;
00578
00580 std::vector<std::string> var_names;
00583 std::vector<std::pair<std::string, double> > fixed_vars;
00585 std::string obj_names;
00588 double obj_adjs;
00590 double obj_mults;
00591
00594 std::vector<std::string> unused_vars;
00597 std::vector<std::string> unused_constrs;
00598
00600 std::vector<std::string> const_names;
00601
00603 std::map<int, std::vector<double> > trace_points;
00605 std::map<int, std::vector<double> > optima;
00606
00608 std::string mod_name;
00609
00610 public:
00612 model_iddata(unsigned int n = 0) : node_num_max(0), var_num_max(n),
00613 const_num_max(0), node_free(), var_free(),
00614 const_free(), backref(),
00615 var_names(n, std::string()), fixed_vars(),
00616 obj_names(), obj_adjs(0), obj_mults(1),
00617 unused_vars(), unused_constrs(),
00618 const_names(), trace_points(), optima(),
00619 mod_name()
00620 {}
00621
00623 ~model_iddata() {}
00624
00626 void new_ref(model_gid& __m) { backref.push_back(&__m); }
00628 bool delete_ref(model_gid& __m);
00629
00638 unsigned int number_of_nodes() const { return node_num_max; }
00642 unsigned int number_of_variables() const { return var_num_max; }
00646 unsigned int number_of_constraints() const { return const_num_max; }
00648 void number_of_nodes(unsigned int _n);
00650 void number_of_variables(unsigned int _n);
00652 void number_of_constraints(unsigned int _n);
00653
00656 unsigned int get_node_id();
00659 void remove_node_id(unsigned int n);
00662 unsigned int get_var_id();
00665 void remove_var_id(unsigned int n);
00668 unsigned int get_const_id();
00671 void remove_const_id(unsigned int n);
00673
00678 void compress_numbers(bool renum_vars, bool renum_consts = false);
00679
00680 public:
00687 const std::string model_name() const;
00689 void model_name(const std::string& n);
00690
00692 const std::string var_name(unsigned int n) const;
00694 void var_name(unsigned int n, const std::string& vn);
00695
00697 const std::string const_name(unsigned int n) const;
00699 void const_name(unsigned int n, const std::string& cn);
00700
00702 const std::string obj_name() const;
00704 void obj_name(const std::string& vn);
00706 double obj_adj() const;
00709 void obj_adj(double adj);
00711 double obj_mult() const;
00714 void obj_mult(double mult);
00715
00717 size_t n_fixed_vars() const { return fixed_vars.size(); }
00719 std::pair<const std::string, double> fixed_var(unsigned int n) const;
00721 void fixed_var(const std::string& vn, double val);
00722
00724 size_t n_unused_vars() const { return unused_vars.size(); }
00726 const std::string& unused_var(unsigned int n) const;
00728 void unused_var(const std::string& vn);
00729
00731 size_t n_unused_constrs() const { return unused_constrs.size(); }
00733 const std::string& unused_constr(unsigned int n) const;
00735 void unused_constr(const std::string& vn);
00737
00738 friend class model_gid;
00739 };
00740
00742
00750 class model_gid
00751 {
00752 private:
00754 model_iddata* _id;
00758 model& model_ref;
00762 std::vector<model::walker> glob_ref;
00765 std::vector<model::walker> gvar_ref;
00768 std::vector<model::walker> gconst_ref;
00771 std::map<unsigned int, unsigned int> const_back_ref;
00772
00773 #if MODEL_INLINE_DEBUG_SIMPLIFY
00774
00775 public:
00776 void print_const_back_ref()
00777 {
00778 std::cout << "begin const_back_ref:" << std::endl;
00779 std::map<unsigned int, unsigned int>::const_iterator it;
00780 for (it=const_back_ref.begin(); it!=const_back_ref.end(); ++it)
00781 std::cout << it->first << " , " << it->second << std::endl;
00782 std::cout << "end const_back_ref:" << std::endl;
00783 }
00784 #endif
00785
00786 private:
00791 void renumber_nodes(std::vector<std::pair<unsigned int,unsigned int> >& __v);
00796 void renumber_variables(std::vector<std::pair<unsigned int,unsigned int> >& __v);
00801 void renumber_constraints(
00802 std::vector<std::pair<unsigned int,unsigned int> >& __v);
00804 void upd_number_of_nodes(unsigned int _n);
00806 void upd_number_of_variables(unsigned int _n);
00808 void upd_number_of_constraints(unsigned int _n);
00809
00810 public:
00812 void remove_node_ref(unsigned int _n)
00813 { if(glob_ref.size() == _n) glob_ref.pop_back();
00814 else glob_ref[_n] = model_ref.ground(); }
00816 void remove_var_ref(unsigned int _n)
00817 { if(gvar_ref.size() == _n) gvar_ref.pop_back();
00818 else gvar_ref[_n] = model_ref.ground(); }
00820 void remove_const_ref(unsigned int _n);
00821
00824 model_gid(model& __m, model_iddata* __i=NULL);
00828 model_gid(model& __m, unsigned int n, model_iddata* __i = NULL);
00829
00832 model_gid(model& __mr, const model_gid& __m);
00833
00835 ~model_gid() { if(_id->delete_ref(*this)) delete _id; }
00836
00844 unsigned int number_of_nodes() const { return _id->number_of_nodes(); }
00847 unsigned int number_of_variables() const
00848 { return _id->number_of_variables(); }
00851 unsigned int number_of_constraints() const
00852 { return _id->number_of_constraints(); }
00855 void number_of_nodes(unsigned int _n) { _id->number_of_nodes(_n); }
00858 void number_of_variables(unsigned int _n) { _id->number_of_variables(_n); }
00861 void number_of_constraints(unsigned int _n) {_id->number_of_constraints(_n);}
00862
00865 void mk_globref(unsigned int n, const model::walker& __w);
00868 void mk_gvarref(unsigned int n, const model::walker& __w);
00871 void mk_gconstref(unsigned int n, const model::walker& __w);
00872
00875 void make_const_back_ref(unsigned int node, unsigned int cnum);
00876
00879 unsigned int get_node_id() { return _id->get_node_id(); }
00882 void remove_node_id(unsigned int n) { _id->remove_node_id(n); }
00885 unsigned int get_var_id() { return _id->get_var_id(); }
00888 void remove_var_id(unsigned int n) { _id->remove_var_id(n); }
00891 unsigned int get_const_id() { return _id->get_const_id(); }
00894 void remove_const_id(unsigned int n) { _id->remove_const_id(n); }
00895
00902 void compress_numbers(bool renumber_vars = false, bool renumber_const = false)
00903 { _id->compress_numbers(renumber_vars, renumber_const); }
00904
00906 const model::walker& node(unsigned int i) const { return glob_ref[i]; }
00908 const model::walker& variable(unsigned int i) const { return gvar_ref[i]; }
00910 const model::walker& constraint(unsigned int i) const
00911 { return gconst_ref[i]; }
00912
00915 bool empty(const model::walker& __x) const
00916 { return __x == model_ref.ground(); }
00919 bool its_me(const model& __m) const { return &__m == &model_ref; }
00922 model::walker empty_reference() const { return model_ref.ground(); }
00923
00926 bool have_glob_ref(unsigned int _nnum) const
00927 { return _nnum < glob_ref.size(); }
00930 bool have_gvar_ref(unsigned int _vnum) const
00931 { return _vnum < gvar_ref.size(); }
00934 bool have_gconst_ref(unsigned int _cnum) const
00935 { return _cnum < gconst_ref.size(); }
00936
00937 public:
00944 const std::string model_name() const { return _id->model_name(); }
00946 void model_name(const std::string& n) { _id->model_name(n); }
00948 void model_name(const char* n) { _id->model_name(std::string(n)); }
00949
00951 const std::string var_name(unsigned int n) const { return _id->var_name(n); }
00953 void var_name(unsigned int n, const std::string& vn) { _id->var_name(n, vn); }
00955 void var_name(unsigned int n, const char* vn)
00956 { _id->var_name(n, std::string(vn)); }
00957
00959 const std::string const_name(unsigned int n) const
00960 { return _id->const_name(n); }
00962 void const_name(unsigned int n, const std::string& vn)
00963 { _id->const_name(n, vn); }
00965 void const_name(unsigned int n, const char* vn)
00966 { _id->const_name(n, std::string(vn)); }
00971 bool get_const_num(unsigned int node_num, unsigned int& const_num);
00972
00974 const std::string obj_name() const { return _id->obj_name(); }
00976 void obj_name(const std::string& vn) { _id->obj_name(vn); }
00978 void obj_name(const char* vn) { _id->obj_name(std::string(vn)); }
00980 double obj_adj() const { return _id->obj_adj(); }
00983 void obj_adj(double adj) { _id->obj_adj(adj); }
00985 double obj_mult() const { return _id->obj_mult(); }
00988 void obj_mult(double mult) { _id->obj_mult(mult); }
00989
00991 size_t n_fixed_vars() const { return _id->n_fixed_vars(); }
00993 std::pair<const std::string, double> fixed_var(unsigned int n) const
00994 { return _id->fixed_var(n); }
00996 void fixed_var(const std::string& vn, double val) { _id->fixed_var(vn, val); }
00998 void fixed_var(const char* vn, double val)
00999 { _id->fixed_var(std::string(vn), val); }
01000
01002 size_t n_unused_vars() const { return _id->n_unused_vars(); }
01004 const std::string& unused_var(unsigned int n) const
01005 { return _id->unused_var(n); }
01007 void unused_var(const std::string& vn) { _id->unused_var(vn); }
01009 void unused_var(const char* vn) { _id->unused_var(std::string(vn)); }
01010
01012 size_t n_unused_constrs() const { return _id->n_unused_constrs(); }
01014 const std::string& unused_constr(unsigned int n) const
01015 { return _id->unused_constr(n); }
01017 void unused_constr(const std::string& vn) { _id->unused_constr(vn); }
01019 void unused_constr(const char* vn) { _id->unused_constr(std::string(vn)); }
01020
01023 const std::map<int, std::vector<double> >& trace_points() const;
01026 const std::map<int, std::vector<double> >& optima() const;
01029 void add_trace_point(int nr, const std::vector<double>& d)
01030 { _id->trace_points[nr] = d; }
01033 void add_optimum(int nr, const std::vector<double>& d)
01034 { _id->optima[nr] = d; }
01036
01037 friend class model_iddata;
01038 };
01039
01040 }
01041
01042 #include <model.hpp>
01043
01044 namespace coco {
01045
01047
01049 typedef model::walker expression_walker;
01051
01054 typedef model::const_walker expression_const_walker;
01055
01056 }
01057
01058 #endif