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, 2006 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 34namespace Gecode { namespace Int { namespace Count { 35 36 template<class VX, class VY> 37 forceinline 38 LqInt<VX,VY>::LqInt(Home home, ViewArray<VX>& x, int n_s, VY y, int c) 39 : IntBase<VX,VY>(home,x,n_s,y,c) {} 40 41 template<class VX, class VY> 42 ExecStatus 43 LqInt<VX,VY>::post(Home home, ViewArray<VX>& x, VY y, int c) { 44 // Eliminate decided views 45 int n_x = x.size(); 46 for (int i=n_x; i--; ) 47 switch (holds(x[i],y)) { 48 case RT_FALSE: 49 x[i] = x[--n_x]; break; 50 case RT_TRUE: 51 x[i] = x[--n_x]; c--; break; 52 case RT_MAYBE: 53 break; 54 default: 55 GECODE_NEVER; 56 } 57 x.size(n_x); 58 if (c < 0) 59 return ES_FAILED; 60 if (c >= n_x) 61 return ES_OK; 62 // All views must be different 63 if (c == 0) 64 return post_false(home,x,y); 65 (void) new (home) LqInt<VX,VY>(home,x,n_x-c+1,y,c); 66 return ES_OK; 67 } 68 69 template<class VX, class VY> 70 forceinline 71 LqInt<VX,VY>::LqInt(Space& home, LqInt<VX,VY>& p) 72 : IntBase<VX,VY>(home,p) {} 73 74 template<class VX, class VY> 75 Actor* 76 LqInt<VX,VY>::copy(Space& home) { 77 return new (home) LqInt<VX,VY>(home,*this); 78 } 79 80 template<class VX, class VY> 81 ExecStatus 82 LqInt<VX,VY>::propagate(Space& home, const ModEventDelta&) { 83 // Eliminate decided views from subscribed views 84 int n_x = x.size(); 85 for (int i=n_s; i--; ) 86 switch (holds(x[i],y)) { 87 case RT_FALSE: 88 x[i].cancel(home,*this,PC_INT_DOM); 89 x[i]=x[--n_s]; x[n_s]=x[--n_x]; 90 break; 91 case RT_TRUE: 92 x[i].cancel(home,*this,PC_INT_DOM); 93 x[i]=x[--n_s]; x[n_s]=x[--n_x]; c--; 94 break; 95 case RT_MAYBE: 96 break; 97 default: 98 GECODE_NEVER; 99 } 100 x.size(n_x); 101 if (c < 0) 102 return ES_FAILED; 103 if (c >= n_x) 104 return home.ES_SUBSUMED(*this); 105 // Eliminate decided views from unsubscribed views 106 for (int i=n_x; i-- > n_s; ) 107 switch (holds(x[i],y)) { 108 case RT_FALSE: x[i]=x[--n_x]; break; 109 case RT_TRUE: x[i]=x[--n_x]; c--; break; 110 case RT_MAYBE: break; 111 default: GECODE_NEVER; 112 } 113 x.size(n_x); 114 if (c < 0) 115 return ES_FAILED; 116 if (c >= n_x) 117 return home.ES_SUBSUMED(*this); 118 if (c == 0) { 119 // All views must be different 120 GECODE_ES_CHECK(post_false(home,x,y)); 121 return home.ES_SUBSUMED(*this); 122 } 123 // Now, there must be new subscriptions from x[n_s] up to x[n_x-c+1] 124 int m = n_x-c; 125 while (n_s <= m) 126 x[n_s++].subscribe(home,*this,PC_INT_DOM,false); 127 return ES_FIX; 128 } 129 130}}} 131 132// STATISTICS: int-prop