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 _SEARCH_NODE_H_
00029 #define _SEARCH_NODE_H_
00030
00031 #include <iostream>
00032 #include <coconut_config.h>
00033 #include <interval.h>
00034 #include <model.h>
00035 #include <annotation.h>
00036 #include <map>
00037 #include <set>
00038 #include <list>
00039 #include <string>
00040 #include <gptr.h>
00041 #include <stdint.h>
00042 #include <database>
00043 #include <viewdbase>
00044 #include <db_alltype>
00045 #include <api_debug.h>
00046 #include <datamap.h>
00047
00048 using namespace vgtl;
00049
00050 #include <api_deltabase.h>
00051 #include <api_certbase.h>
00052
00053 namespace coco {
00054
00056
00061 typedef enum {
00062 snr_root,
00063 snr_reduction,
00064 snr_relaxation,
00065 snr_split,
00066 snr_glue,
00067 snr_worknode,
00068 snr_virtual,
00069 } search_node_relation;
00070
00072
00077 typedef uint32_t search_node_id;
00078
00080
00088 class search_node
00089 {
00090 protected:
00093 gptr<search_node>* __global_model;
00096 gptr<vdbl::database>* __dbase;
00099 vdbl::userid _dbuser;
00102 search_node_relation _snr;
00104 search_node_id _id;
00108 std::vector<annotation> _keep;
00112 vdbl::rowid _rid;
00113
00114 protected:
00117 search_node_relation parent_relation() const { return _snr; }
00118
00119 public:
00122 virtual bool is_delta() const { return false; }
00123
00128 search_node(const search_node_id& _i, const vdbl::userid& _dui,
00129 gptr<search_node>& _gm, gptr<vdbl::database>& _db,
00130 search_node_relation __snr = snr_reduction);
00131
00136 search_node(const search_node_id& _i, const vdbl::userid& _dui,
00137 gptr<search_node>* _gm, gptr<vdbl::database>& _db,
00138 search_node_relation __snr = snr_reduction);
00139
00141 search_node(const search_node& __sn);
00142
00148 search_node(const search_node_id& _i, const vdbl::userid& _dui,
00149 gptr<vdbl::database>& _db, search_node_relation __snr = snr_root);
00150
00152 virtual ~search_node();
00153
00155 search_node& operator=(const search_node& __w);
00156
00158 vdbl::userid get_dbuserid() const { return _dbuser; }
00159
00161 gptr<search_node>* global_model() const { return __global_model; }
00162
00164 gptr<vdbl::database>* database() const { return __dbase; }
00165
00167 search_node_id get_id() const { return _id; }
00168
00170 void set_id(const search_node_id& i) { _id = i; }
00171
00173 vdbl::rowid get_rowid() const { return _rid; }
00174
00176 void set_rowid(const vdbl::rowid& i) { _rid = i; }
00177
00180 void keep(const annotation& _an) { _keep.push_back(_an); }
00181
00184 void keep(const std::vector<annotation>& _anv)
00185 { _keep.insert(_keep.end(), _anv.begin(), _anv.end()); }
00186
00189 void unkeep(const annotation& _an);
00190
00193 void unkeep(const std::vector<annotation>& _anv);
00194
00195 friend class search_graph;
00196
00197 #if DEBUG_SEARCH_NODE
00198
00199 search_node_id test() const { return _id; }
00200 #endif
00201 };
00202
00204
00210 class delta_node : public search_node
00211 {
00212 private:
00213 typedef search_node _DBase;
00214
00215 private:
00219 std::vector<delta_id> di;
00220
00221 public:
00227 delta_node(const search_node_id& _i, const vdbl::userid& _dui,
00228 std::vector<delta_id>& __d, gptr<search_node>& _gm,
00229 gptr<vdbl::database>& _db,
00230 search_node_relation _snr = snr_reduction)
00231 : search_node(_i, _dui, _gm, _db, _snr), di(__d)
00232 {}
00233
00235 virtual ~delta_node() {}
00236
00238 delta_node& operator=(const delta_node& __w);
00239
00243 bool is_delta() const { return true; }
00244
00246 unsigned int n_deltas() const { return (unsigned int)di.size(); }
00247
00249 delta_id get_delta_id(unsigned int i) const { return di[i]; }
00250
00252 delta get_delta(unsigned int i);
00253
00255 const delta& get_delta(unsigned int i) const;
00256
00260 template <class _Iterator>
00261 void add_deltas(_Iterator _f, _Iterator _l)
00262 { std::copy(_f, _l, back_inserter(di)); }
00263
00266 template <class _SeqContainer>
00267 void get_deltas(_SeqContainer& _c)
00268 { std::copy(di.begin(), di.end(), back_inserter(_c)); }
00269 };
00270
00272
00278 class full_node : public search_node
00279 {
00280 private:
00281 typedef search_node _FBase;
00282
00283 protected:
00286 gptr<model>* _m;
00287
00288 public:
00290 std::vector<annotation> _ann;
00291
00292 protected:
00299 full_node(const search_node_id& _i, const vdbl::userid& _dui,
00300 gptr<model>& __mod, gptr<search_node>* _gm,
00301 gptr<vdbl::database>& _db,
00302 search_node_relation _snr = snr_reduction)
00303 : search_node(_i, _dui, _gm, _db, _snr), _ann()
00304 { _m = new ptr<model>(*__mod); }
00305
00312 full_node(const search_node_id& _i, const vdbl::userid& _dui,
00313 gptr<model>& __mod, gptr<search_node>* _gm,
00314 gptr<vdbl::database>& _db, const std::vector<annotation>& _a,
00315 search_node_relation _snr = snr_reduction)
00316 : search_node(_i, _dui, _gm, _db, _snr), _ann(_a)
00317 { _m = new ptr<model>(*__mod); }
00318
00319 public:
00320
00327 full_node(const search_node_id& _i, const vdbl::userid& _dui,
00328 gptr<model>& __mod, gptr<search_node>& _gm,
00329 gptr<vdbl::database>& _db,
00330 search_node_relation _snr = snr_reduction)
00331 : search_node(_i, _dui, _gm, _db, _snr), _ann()
00332 { _m = new ptr<model>(*__mod); }
00333
00340 full_node(const search_node_id& _i, const vdbl::userid& _dui,
00341 gptr<model>& __mod, gptr<search_node>& _gm,
00342 gptr<vdbl::database>& _db, const std::vector<annotation>& _a,
00343 search_node_relation _snr = snr_reduction)
00344 : search_node(_i, _dui, _gm, _db, _snr), _ann(_a)
00345 { _m = new ptr<model>(*__mod); }
00346
00348 full_node(const full_node& _i)
00349 : _FBase(_i), _m(new ptr<model>(**_i._m)), _ann(_i._ann)
00350 { }
00351
00353 virtual ~full_node() { if(_m) delete _m; _m = NULL; }
00354
00356 full_node& operator=(const full_node& __w);
00357
00361 bool is_delta() const
00362 { return false; }
00363
00365 unsigned int n_annotations() const { return (unsigned int)_ann.size(); }
00366
00369 const annotation& get_annotation(unsigned int i) const
00370 { return _ann[i]; }
00371
00374 const std::vector<annotation>& get_annotations() const
00375 { return _ann; }
00376
00379 const model* get_model() const
00380 { return (*_m).get_local_copy(); }
00381
00385 const vdbl::database* get_database() const
00386 { return (*database()).get_local_copy(); }
00387
00390 model* get_model_ptr() const
00391 { return (*_m).get_local_copy(); }
00392
00396 vdbl::database* get_database_ptr() const
00397 { return (*database()).get_local_copy(); }
00398
00399 friend class delta_base;
00400 friend class certificate_base;
00401 friend class dag_delta;
00402 friend class dag_undelta;
00403 };
00404
00405 class work_node_context;
00406
00408
00417 class work_node : public full_node
00418 {
00419 private:
00421 typedef full_node _Base;
00422
00423 public:
00424 template <class _TW, class _TV, class _VR, class _TP, class _TR, class _TI>
00425 class constraint_iterator_base;
00426
00429 typedef constraint_iterator_base<expression_walker,
00430 const std::vector<expression_walker>*,
00431 const std::vector<expression_walker>&,const expression_walker*,
00432 const expression_walker&,
00433 std::vector<expression_walker>::const_iterator> constraint_const_iterator;
00436 typedef constraint_iterator_base<expression_walker,
00437 std::vector<expression_walker>*,
00438 std::vector<expression_walker>&,expression_walker*,expression_walker&,
00439 std::vector<expression_walker>::iterator> constraint_iterator;
00440
00441 public:
00447 std::list<delta_id> deltas;
00448
00450 std::list<delta_id>::iterator deltanew_it;
00451
00453 std::set<search_node_id> parents_in_graph;
00454
00457 std::map<delta_id,undelta> undeltas;
00459 vdbl::standard_table *dtable;
00462 vdbl::tableid dtable_id;
00464 vdbl::standard_table *gitable;
00467 vdbl::tableid gitable_id;
00468
00469
00471 work_node_context* wnc;
00474 vdbl::viewdbase* __vdb;
00477 vdbl::viewdbase* __vdbf;
00478
00479 public:
00487 std::vector<interval> node_ranges;
00492 std::vector<unsigned int> node_order;
00495 bool infeasible;
00496
00499 double log_vol;
00502 double gain_factor;
00504 datamap globalinfo;
00506
00507 public:
00511 typedef uint32_t transaction_number;
00512
00513 private:
00517 transaction_number _tnum;
00518
00519 public:
00521 transaction_number get_transaction_number()
00522 { return ++_tnum; }
00523
00524 public:
00534 std::map<transaction_number,std::list<std::vector<delta> > > proposed_splits;
00537 std::map<delta_id, transaction_number> split_delta_ids;
00538
00539 private:
00541 unsigned int n_bds;
00544 unsigned int n_lin;
00546 unsigned int n_quad;
00548 unsigned int n_poly;
00550 unsigned int n_other;
00551
00552 public:
00555 void init_cnumbers();
00557 void reset_node_ranges();
00559 void make_node_ranges(bool keep_old_ranges);
00562 void make_node_order();
00567 double compute_log_volume(const std::vector<interval>& _r) const;
00570 void set_globalinfo();
00571
00572 private:
00575 void init_all();
00576
00581 void set_deltanew_it(const work_node& __w);
00582
00583 public:
00585 work_node(const work_node& __w);
00586
00588 work_node(const full_node& __f, const std::list<delta_id>& __de,
00589 vdbl::viewdbase* vdbf = NULL);
00590
00598 work_node(const search_node_id& _i, const vdbl::userid& _dui,
00599 gptr<model>& __m, gptr<vdbl::database>& __d,
00600 const std::vector<annotation>& __an,
00601 const std::list<delta_id>& __de, gptr<search_node>* _gm,
00602 search_node_relation snr = snr_worknode,
00603 vdbl::viewdbase* vdbf = NULL);
00604
00606 virtual ~work_node();
00607
00610 const model* get_model() const
00611 { return (*_m).get_local_copy(); }
00614 model* get_model()
00615 { return (*_m).get_local_copy(); }
00616
00618 work_node_context* get_work_node_context() { return wnc; }
00619
00621 const work_node_context* get_work_node_context() const { return wnc; }
00622
00624 vdbl::viewdbase& get_viewdbase() { return *__vdb; }
00625
00627 const vdbl::viewdbase& get_viewdbase() const { return *__vdb; }
00628
00630 vdbl::viewdbase& get_fullviewdbase() { if(__vdbf) return *__vdbf; else return *__vdb; }
00631
00633 const vdbl::viewdbase& get_fullviewdbase() const { if(__vdbf) return *__vdbf; else return *__vdb; }
00634
00635 public:
00645
00646
00653 model get(unsigned int __type)
00654 { throw nyi_exception("work_node: get(type) method"); }
00655
00657
00672 constraint_const_iterator get_begin(unsigned int __type) const;
00674
00689 constraint_const_iterator get_end(unsigned int __type) const;
00690
00692
00707 constraint_iterator get_begin(unsigned int __type);
00709
00724 constraint_iterator get_end(unsigned int __type);
00725
00733 unsigned int n(unsigned int __type) const;
00735
00737 delta get_delta(const delta_id& _id);
00738
00740 const delta& get_delta(const delta_id& _id) const;
00741
00744 certificate get_certificate(const delta_id& _id);
00745
00748 const certificate& get_certificate(const delta_id& _id) const;
00749
00752 double log_volume() const
00753 { return log_vol; }
00755 double gain() const
00756 { return gain_factor; }
00758 const datamap& global_info() const
00759 { return globalinfo; }
00761
00764 bool global_info(basic_alltype& b, const std::string& i) const;
00765 bool global_info(basic_alltype& b, const char* i) const
00766 { return global_info(b, std::string(i)); }
00768
00769
00771 basic_alltype global_info(const std::string& i) const;
00772 basic_alltype global_info(const char* i) const
00773 { return global_info(std::string(i)); }
00775
00777 double reset_gain()
00778 { double ret = gain_factor; gain_factor = 1.; return ret; }
00779
00780 public:
00782 work_node& operator=(const work_node& __w);
00783
00785 work_node& operator=(const full_node& __f);
00786
00787 friend work_node operator+(const work_node& _w, const delta_id& _d);
00788 friend work_node operator-(const work_node& _w, const delta_id& _d);
00789 friend work_node& operator+=(work_node& _w, const delta_id& _d);
00790 friend work_node& operator-=(work_node& _w, const delta_id& _d);
00791
00792 template <template <class _Tp, class _TA> class _Ctr, class _Al>
00793 friend work_node operator+(const work_node& _w, const _Ctr<delta_id,_Al>& _d);
00794
00795 template <template <class _Tp, class _TA> class _Ctr, class _Al>
00796 friend work_node operator-(const work_node& _w, const _Ctr<delta_id,_Al>& _d);
00797
00798 template <template <class _Tp, class _TA> class _Ctr, class _Al>
00799 friend work_node& operator+=(work_node& _w, const _Ctr<delta_id,_Al>& _d);
00800
00801 template <template <class _Tp, class _TA> class _Ctr, class _Al>
00802 friend work_node& operator-=(work_node& _w, const _Ctr<delta_id,_Al>& _d);
00803
00804 friend class delta;
00805 friend class undelta;
00806 friend class certificate;
00807 friend class wnc_hook_base;
00808 };
00809
00811
00816 template <class _TW, class _TV, class _VR, class _TP, class _TR, class _TI>
00817 class work_node::constraint_iterator_base
00818 {
00819 private:
00820 typedef constraint_iterator_base<_TW,_TV,_VR,_TP,_TR,_TI> _Self;
00821
00822 private:
00824 _TV __cs;
00827 _TI __c_cur;
00830 unsigned int __tp;
00831
00832 private:
00833 typedef _TV _Vector;
00834 typedef _TI _Iterator;
00835 typedef _VR _Reference;
00836
00837 public:
00839
00840 typedef std::bidirectional_iterator_tag iterator_category;
00841
00842 typedef _TW value_type;
00843 typedef _TR reference;
00844 typedef _TP pointer;
00845
00846 typedef size_t size_type;
00847 typedef ptrdiff_t difference_type;
00849
00850 public:
00852 constraint_iterator_base() : __cs(NULL), __c_cur() {}
00855 constraint_iterator_base(_Reference cs, unsigned int tp)
00856 : __cs(&cs), __tp(tp) {}
00858 constraint_iterator_base(const _Self& __c)
00859 : __cs(__c.__cs), __c_cur(__c.__c_cur), __tp(__c.__tp) {}
00860
00862 ~constraint_iterator_base() {}
00863
00865 reference operator*() const { return *__c_cur; }
00867 pointer operator->() const { return &(operator*()); }
00868
00870 bool operator==(const _Self& _c)
00871 { return __cs == _c.__cs && __c_cur == _c.__c_cur; }
00872
00874 bool operator!=(const _Self& _c)
00875 { return __cs != _c.__cs || __c_cur != _c.__c_cur; }
00876
00879 _Self& set(const _Iterator& _c);
00881 _Self& operator++();
00883 _Self operator++(int);
00885 _Self& operator--();
00887 _Self operator--(int);
00889 _Self& operator=(const _Self& _c);
00890 };
00891
00892 }
00893
00894 #include <search_node.hpp>
00895
00896 #endif // _SEARCH_NODE_H_