MCPcopy Create free account
hub / github.com/Gecode/gecode / propagateSeqUnion

Method propagateSeqUnion

gecode/set/sequence/seq-u.cpp:54–100  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

52 }
53
54 ExecStatus
55 SeqU::propagateSeqUnion(Space& home,
56 bool& modified, ViewArray<SetView>& x,
57 SetView& y) {
58 Region r;
59 GlbRanges<SetView>* XLBs = r.alloc<GlbRanges<SetView> >(x.size());
60 for (int i=x.size(); i--; ) {
61 GlbRanges<SetView> lb(x[i]);
62 XLBs[i]=lb;
63 }
64 Iter::Ranges::NaryAppend<GlbRanges<SetView> > u(XLBs,x.size());
65 GECODE_ME_CHECK_MODIFIED(modified, y.includeI(home,u));
66
67 GLBndSet before(home);
68 for (int i=0; i<x.size(); i++) {
69 LubRanges<SetView> xiub(x[i]);
70 before.includeI(home, xiub);
71 BndSetRanges beforeR(before);
72 GlbRanges<SetView> ylb(y);
73 Iter::Ranges::Diff<GlbRanges<SetView>, BndSetRanges> diff(ylb, beforeR);
74 if (diff()) {
75 GECODE_ME_CHECK_MODIFIED(modified, x[i].exclude(home, diff.min(),
76 Limits::max));
77 }
78 }
79 before.dispose(home);
80
81 GLBndSet after(home);
82 for (int i=x.size(); i--; ) {
83 LubRanges<SetView> xiub(x[i]);
84 after.includeI(home, xiub);
85 BndSetRanges afterR(after);
86 GlbRanges<SetView> ylb(y);
87 Iter::Ranges::Diff<GlbRanges<SetView>, BndSetRanges> diff(ylb, afterR);
88 if (diff()) {
89 int max = diff.max();
90 for (; diff(); ++diff)
91 max = diff.max();
92 GECODE_ME_CHECK_MODIFIED(modified, x[i].exclude(home,
93 Limits::min,
94 max));
95 }
96 }
97 after.dispose(home);
98
99 return ES_FIX;
100 }
101
102 //Enforces sequentiality and ensures y contains union of Xi lower bounds.
103 ExecStatus

Callers

nothing calls this directly

Calls 6

sizeMethod · 0.45
includeIMethod · 0.45
excludeMethod · 0.45
minMethod · 0.45
disposeMethod · 0.45
maxMethod · 0.45

Tested by

no test coverage detected