int-trace-view.hpp
Go to the documentation of this file.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
00026
00027
00028
00029
00030
00031
00032
00033
00034 namespace Gecode { namespace Int {
00035
00037 class IntTraceView {
00038 protected:
00040 RangeList* dom;
00041 public:
00043 IntTraceView(void);
00045 IntTraceView(Space& home, IntView y);
00047 RangeList* ranges(void) const;
00049 void prune(Space& home, IntView y, const Delta& d);
00051 void update(Space& home, IntTraceView x);
00053 static unsigned long long int slack(IntView x);
00054 };
00055
00056 forceinline
00057 IntTraceView::IntTraceView(void) {}
00058
00059 forceinline
00060 IntTraceView::IntTraceView(Space& home, IntView y) {
00061 ViewRanges<IntView> yr(y);
00062 RangeList::copy(home, dom, yr);
00063 }
00064
00065 forceinline RangeList*
00066 IntTraceView::ranges(void) const {
00067 return dom;
00068 }
00069
00070 forceinline void
00071 IntTraceView::prune(Space& home, IntView y, const Delta& d) {
00072 if (y.range() && (dom->next() == NULL)) {
00073 dom->min(y.min()); dom->max(y.max());
00074 } else if (!y.any(d) && (y.max(d)+1 == y.min())) {
00075
00076 if (y.min() > dom->max()) {
00077 RangeList* p = dom;
00078 RangeList* l = p->next();
00079 while ((l != NULL) && (l->max() < y.min())) {
00080 p=l; l=l->next();
00081 }
00082 dom->dispose(home,p);
00083 dom = l;
00084 }
00085 dom->min(y.min());
00086 } else if (!y.any(d) && (y.max()+1 == y.min(d))) {
00087
00088 if ((y.max() <= dom->max()) && (dom->next() == NULL)) {
00089 dom->max(y.max());
00090 } else {
00091 RangeList* p = dom;
00092 RangeList* l = p->next();
00093 while ((l != NULL) && (l->min() <= y.max())) {
00094 p=l; l=l->next();
00095 }
00096 p->max(y.max());
00097 if (p->next() != NULL)
00098 p->next()->dispose(home);
00099 p->next(NULL);
00100 }
00101 } else {
00102
00103 ViewRanges<IntView> yr(y);
00104 RangeList::overwrite(home,dom,yr);
00105 }
00106 }
00107
00108 forceinline void
00109 IntTraceView::update(Space& home, IntTraceView y) {
00110 Iter::Ranges::RangeList yr(y.dom);
00111 RangeList::copy(home,dom,yr);
00112 }
00113
00114 forceinline unsigned long long int
00115 IntTraceView::slack(IntView x) {
00116 return x.width()-1;
00117 }
00118
00119
00120 }}
00121
00122