Exemple #1
0
/***
 * 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;
	       	}

	}
}
Exemple #2
0
 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;
 }
Exemple #3
0
  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;
      }
    }
  }