00001 
00002 
00003 #ifndef _BCP_OBJ_CHANGE_H
00004 #define _BCP_OBJ_CHANGE_H
00005 
00006 
00007 
00008 #include "BCP_enum.hpp"
00009 #include "BCP_vector.hpp"
00010 
00011 
00012 
00013 class BCP_var;
00014 class BCP_cut;
00015 
00016 class BCP_cut_set;
00017 class BCP_var_set;
00018 
00019 
00020 
00021 class BCP_obj_change {
00022 public:
00023    double lb;
00024    double ub;
00025    BCP_obj_status stat;
00026 public:
00027    BCP_obj_change(const double lower, const double upper,
00028                   const BCP_obj_status status) :
00029       lb(lower), ub(upper), stat(status) {}
00030    BCP_obj_change() : lb(0), ub(0), stat(BCP_ObjNoInfo) {}
00031    ~BCP_obj_change() {}
00032    
00033 
00034    static inline int pack_size() {
00035       return 2 * sizeof(double) + sizeof(BCP_obj_status);
00036    }
00037 };
00038 
00039 inline bool operator==(const BCP_obj_change& ch0, const BCP_obj_change& ch1)
00040 {
00041    return ch0.lb == ch1.lb && ch0.ub == ch1.ub && ch0.stat == ch1.stat;
00042 }
00043 
00044 inline bool operator!=(const BCP_obj_change& ch0, const BCP_obj_change& ch1)
00045 {
00046    return ch0.lb != ch1.lb || ch0.ub != ch1.ub || ch0.stat != ch1.stat;
00047 }
00048 
00049 
00050 
00051 
00052 class BCP_var_set_change {
00053    
00054    
00055    
00056    
00057    
00058    
00059    
00060 private:
00061    
00062    BCP_var_set_change(const BCP_var_set_change&);
00063    BCP_var_set_change& operator=(const BCP_var_set_change&);
00064 public:
00065    BCP_storage_t           _storage;
00066    int                     _deleted_num;
00067    BCP_vec<int>            _del_change_pos;
00068    BCP_vec<BCP_obj_change> _change;
00069    BCP_vec<BCP_var*>       _new_vars;
00070 public:
00071    BCP_var_set_change() :
00072       _storage(BCP_Storage_Explicit), _deleted_num(0),
00073       _del_change_pos(), _change(), _new_vars() {}
00074    BCP_var_set_change(BCP_vec<BCP_var*>::const_iterator firstvar,
00075                       BCP_vec<BCP_var*>::const_iterator lastvar);
00076    BCP_var_set_change(BCP_vec<BCP_var*>::const_iterator firstvar,
00077                       BCP_vec<BCP_var*>::const_iterator lastvar,
00078                       const BCP_vec<int>& added_index,
00079                       const BCP_vec<BCP_obj_change>& added_desc);
00080    ~BCP_var_set_change() {}
00081 
00082    void swap(BCP_var_set_change& x);    
00083 
00084    inline BCP_storage_t storage() const { return _storage; }
00085 
00086    inline int deleted_num() const { return _deleted_num; }
00087    inline int changed_num() const { return _change.size(); }
00088    inline int added_num() const { return _new_vars.size(); }
00089 
00090    int pack_size() const;
00091 
00092    void update(const BCP_var_set_change& vars_change);
00093 };
00094 
00095 
00096 
00097 class BCP_cut_set_change {
00098    
00099    
00100    
00101    
00102    
00103    
00104    
00105 private:
00106    
00107    BCP_cut_set_change(const BCP_cut_set_change&);
00108    BCP_cut_set_change& operator=(const BCP_cut_set_change&);
00109 public:
00110    BCP_storage_t        _storage;
00111    int                     _deleted_num;
00112    BCP_vec<int>            _del_change_pos;
00113    BCP_vec<BCP_obj_change> _change;
00114    BCP_vec<BCP_cut*>       _new_cuts;
00115 public:
00116    BCP_cut_set_change() :
00117       _storage(BCP_Storage_Explicit), _deleted_num(0),
00118       _del_change_pos(), _change(), _new_cuts() {}
00119    BCP_cut_set_change(BCP_vec<BCP_cut*>::const_iterator firstcut,
00120                       BCP_vec<BCP_cut*>::const_iterator lastcut);
00121    BCP_cut_set_change(BCP_vec<BCP_cut*>::const_iterator firstcut,
00122                       BCP_vec<BCP_cut*>::const_iterator lastcut,
00123                       const BCP_vec<int>& added_index,
00124                       const BCP_vec<BCP_obj_change>& added_desc);
00125    ~BCP_cut_set_change() {}
00126 
00127    void swap(BCP_cut_set_change& x);    
00128 
00129    inline BCP_storage_t storage() const { return _storage; }
00130 
00131    inline int deleted_num() const { return _deleted_num; }
00132    inline int changed_num() const { return _change.size(); }
00133    inline int added_num() const { return _new_cuts.size(); }
00134    
00135 
00136    int pack_size() const;
00137 
00138    void update(const BCP_cut_set_change& cuts_change);
00139 };
00140 
00141 
00142 
00143 #endif