/*** * Look for the values of ?? and fills it with the relevant data * Suggestion: ?<index>{lower,upper} * */ inline void concrete(Agent_params& ap,double* paramptr){ FILE_LOG(logDEBUG) << "starting concrete " << std::endl; for (properties::iterator i = ap.m_properties.begin(); i != ap.m_properties.end(); ++i) { if(is_concrete_param(i->second)){ FILE_LOG(logDEBUG) << "need to concrete: ["<<i->first << "] with value:" << i->second<< std::endl; ap.m_properties[i->first]=assigned_val(i->second,paramptr); FILE_LOG(logDEBUG) << " concrete-assgined ("<< ap.m_properties[i->first]<<")"<< std::endl; } } }
ExecStatus Int<V0,V1,Idx,Val>::post(Home home, IntSharedArray& c, V0 x0, V1 x1) { if (x0.assigned()) { GECODE_ME_CHECK(x1.eq(home,c[x0.val()])); } else if (x1.assigned()) { GECODE_ES_CHECK(assigned_val(home,c,x0,x1)); } else { (void) new (home) Int<V0,V1,Idx,Val>(home,c,x0,x1); } return ES_OK; }
ExecStatus Int<V0,V1,Idx,Val>::propagate(Space& home, const ModEventDelta&) { if (x0.assigned()) { GECODE_ME_CHECK(x1.eq(home,c[x0.val()])); return home.ES_SUBSUMED(*this); } if (x1.assigned() && (iv == NULL)) { GECODE_ES_CHECK(assigned_val(home,c,x0,x1)); return home.ES_SUBSUMED(*this); } if ((static_cast<ValSize>(x1.size()) == s1) && (static_cast<IdxSize>(x0.size()) != s0)) { assert(iv != NULL); assert(!shared(x0,x1)); prune_idx(); IterValUnmark v(iv); GECODE_ME_CHECK(x1.narrow_v(home,v,false)); s1=static_cast<ValSize>(x1.size()); assert(!x0.assigned()); return x1.assigned() ? home.ES_SUBSUMED(*this) : ES_FIX; } if ((static_cast<IdxSize>(x0.size()) == s0) && (static_cast<ValSize>(x1.size()) != s1)) { assert(iv != NULL); assert(!shared(x0,x1)); prune_val(); IterIdxUnmark i(iv); GECODE_ME_CHECK(x0.narrow_v(home,i,false)); s0=static_cast<IdxSize>(x0.size()); return (x0.assigned() || x1.assigned()) ? home.ES_SUBSUMED(*this) : ES_FIX; } bool assigned = x0.assigned() && x1.assigned(); if (iv == NULL) { // Initialize data structure iv = home.alloc<IdxVal>(x0.size() + 1); // The first element in iv[0] is used as sentinel // Enter information sorted by idx IdxVal* by_idx = &iv[1]; Idx size = 0; for (ViewValues<V0> v(x0); v(); ++v) if ((x1.min() <= c[v.val()]) && (x1.max() >= c[v.val()])) { by_idx[size].idx = static_cast<Idx>(v.val()); by_idx[size].val = static_cast<Val>(c[v.val()]); size++; } if (size == 0) return ES_FAILED; // Create val links sorted by val Region r(home); Idx* by_val = r.alloc<Idx>(size); if (x1.width() <= 128) { int n_buckets = static_cast<int>(x1.width()); int* pos = r.alloc<int>(n_buckets); int* buckets = pos - x1.min(); for (int i=n_buckets; i--; ) pos[i]=0; for (Idx i=size; i--; ) buckets[by_idx[i].val]++; int p=0; for (int i=0; i<n_buckets; i++) { int n=pos[i]; pos[i]=p; p+=n; } assert(p == size); for (Idx i=size; i--; ) by_val[buckets[by_idx[i].val]++] = i+1; } else { for (Idx i = size; i--; ) by_val[i] = i+1; ByVal less(iv); Support::quicksort<Idx>(by_val,size,less); } // Create val links for (Idx i = size-1; i--; ) { by_idx[i].idx_next = i+2; iv[by_val[i]].val_next = by_val[i+1]; } by_idx[size-1].idx_next = 0; iv[by_val[size-1]].val_next = 0; // Set up sentinel element: iv[0] iv[0].idx_next = 1; iv[0].val_next = by_val[0]; } else { prune_idx(); } // Prune values prune_val(); // Peform tell { IterIdxUnmark i(iv); GECODE_ME_CHECK(x0.narrow_v(home,i,false)); IterVal v(iv); if (shared(x0,x1)) { GECODE_ME_CHECK(x1.inter_v(home,v,false)); s0=static_cast<IdxSize>(x0.size()); s1=static_cast<ValSize>(x1.size()); return assigned ? home.ES_SUBSUMED(*this) : ES_NOFIX; } else { GECODE_ME_CHECK(x1.narrow_v(home,v,false)); s0=static_cast<IdxSize>(x0.size()); s1=static_cast<ValSize>(x1.size()); return (x0.assigned() || x1.assigned()) ? home.ES_SUBSUMED(*this) : ES_FIX; } } }