this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Christian Schulte <schulte@gecode.org> 5 * 6 * Copyright: 7 * Christian Schulte, 2011 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34#include <gecode/int/rel.hh> 35#include <gecode/int/distinct.hh> 36 37namespace Gecode { namespace Int { namespace NValues { 38 39 template<class VY> 40 forceinline 41 GqInt<VY>::GqInt(Home home, ValSet& vs, ViewArray<IntView>& x, VY y) 42 : IntBase<VY>(home,vs,x,y) {} 43 44 template<class VY> 45 inline ExecStatus 46 GqInt<VY>::post(Home home, ViewArray<IntView>& x, VY y) { 47 if (x.size() == 0) { 48 GECODE_ME_CHECK(y.lq(home,0)); 49 return ES_OK; 50 } 51 52 x.unique(); 53 54 if (x.size() == 1) { 55 GECODE_ME_CHECK(y.lq(home,1)); 56 return ES_OK; 57 } 58 59 GECODE_ME_CHECK(y.lq(home,x.size())); 60 61 if (y.max() <= 1) 62 return ES_OK; 63 64 if (y.min() == x.size()) { 65 assert(y.assigned()); 66 return Distinct::Dom<IntView>::post(home,x); 67 } 68 69 // Eliminate assigned views and store them into the value set 70 ValSet vs; 71 int n = x.size(); 72 for (int i=n; i--; ) 73 if (x[i].assigned()) { 74 vs.add(home, x[i].val()); 75 x[i] = x[--n]; 76 } 77 78 GECODE_ME_CHECK(y.lq(home,n + vs.size())); 79 80 if (n == 0) { 81 assert(vs.size() >= y.max()); 82 return ES_OK; 83 } 84 85 x.size(n); 86 87 (void) new (home) GqInt<VY>(home, vs, x, y); 88 return ES_OK; 89 } 90 91 template<class VY> 92 forceinline 93 GqInt<VY>::GqInt(Space& home, GqInt<VY>& p) 94 : IntBase<VY>(home, p) {} 95 96 template<class VY> 97 Propagator* 98 GqInt<VY>::copy(Space& home) { 99 return new (home) GqInt<VY>(home, *this); 100 } 101 102 template<class VY> 103 ExecStatus 104 GqInt<VY>::propagate(Space& home, const ModEventDelta& med) { 105 if (IntView::me(med) == ME_INT_VAL) 106 add(home); 107 108 // Eliminate subsumed views 109 eliminate(home); 110 111 GECODE_ME_CHECK(y.lq(home, x.size() + vs.size())); 112 113 if (x.size() == 0) 114 return home.ES_SUBSUMED(*this); 115 116 if (vs.size() >= y.max()) 117 return home.ES_SUBSUMED(*this); 118 119 GECODE_ES_CHECK(prune_upper(home,g)); 120 121 return ES_NOFIX; 122 } 123 124}}} 125 126// STATISTICS: int-prop