1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2 /* 3 * Main authors: 4 * Guido Tack <tack@gecode.org> 5 * 6 * Contributing authors: 7 * Gabor Szokoli <szokoli@gecode.org> 8 * 9 * Copyright: 10 * Guido Tack, 2004, 2005 11 * 12 * This file is part of Gecode, the generic constraint 13 * development environment: 14 * http://www.gecode.org 15 * 16 * Permission is hereby granted, free of charge, to any person obtaining 17 * a copy of this software and associated documentation files (the 18 * "Software"), to deal in the Software without restriction, including 19 * without limitation the rights to use, copy, modify, merge, publish, 20 * distribute, sublicense, and/or sell copies of the Software, and to 21 * permit persons to whom the Software is furnished to do so, subject to 22 * the following conditions: 23 * 24 * The above copyright notice and this permission notice shall be 25 * included in all copies or substantial portions of the Software. 26 * 27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 28 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 29 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 30 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 31 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 32 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 33 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 34 * 35 */ 36 37 #include <gecode/set.hh> 38 #include <gecode/set/rel.hh> 39 #include <gecode/set/rel-op.hh> 40 41 namespace Gecode { 42 using namespace Gecode::Set; 43 using namespace Gecode::Set::Rel; 44 using namespace Gecode::Set::RelOp; 45 46 void rel(Home home,SetVar x,SetOpType op,const IntSet & y,SetRelType r,SetVar z)47 rel(Home home, SetVar x, SetOpType op, const IntSet& y, SetRelType r, 48 SetVar z) { 49 Set::Limits::check(y, "Set::rel"); 50 ConstSetView yv(home, y); 51 52 if (op==SOT_MINUS) { 53 switch (r) { 54 case SRT_EQ: 55 { 56 GlbRanges<ConstSetView> yr(yv); 57 RangesCompl<GlbRanges<ConstSetView> > yrc(yr); 58 IntSet yc(yrc); 59 ConstSetView cy(home, yc); 60 GECODE_ES_FAIL( 61 (Intersection<ConstSetView, 62 SetView,SetView> 63 ::post(home,cy,x,z))); 64 } 65 break; 66 case SRT_LQ: case SRT_LE: case SRT_GQ: case SRT_GR: 67 { 68 GlbRanges<ConstSetView> yr(yv); 69 RangesCompl<GlbRanges<ConstSetView> > yrc(yr); 70 IntSet yc(yrc); 71 ConstSetView cy(home, yc); 72 SetVar tmp(home,IntSet::empty,Set::Limits::min,Set::Limits::max); 73 GECODE_ES_FAIL( 74 (Intersection<ConstSetView, 75 SetView,SetView> 76 ::post(home,cy,x,tmp))); 77 rel(home,tmp,r,z); 78 } 79 break; 80 case SRT_NQ: 81 { 82 SetVar tmp(home); 83 GECODE_ES_FAIL( 84 (Distinct<SetView,SetView> 85 ::post(home,z,tmp))); 86 GlbRanges<ConstSetView> yr(yv); 87 RangesCompl<GlbRanges<ConstSetView> > yrc(yr); 88 IntSet yc(yrc); 89 ConstSetView cy(home, yc); 90 GECODE_ES_FAIL( 91 (Intersection<ConstSetView, 92 SetView,SetView> 93 ::post(home,cy,x,tmp))); 94 } 95 break; 96 case SRT_SUB: 97 { 98 GlbRanges<ConstSetView> yr(yv); 99 RangesCompl<GlbRanges<ConstSetView> > yrc(yr); 100 IntSet yc(yrc); 101 ConstSetView cy(home, yc); 102 GECODE_ES_FAIL( 103 (SuperOfInter<ConstSetView,SetView,SetView> 104 ::post(home,cy,x,z))); 105 106 } 107 break; 108 case SRT_SUP: 109 { 110 SetVar tmp(home); 111 GECODE_ES_FAIL( 112 (Subset<SetView,SetView>::post(home,z,tmp))); 113 114 GlbRanges<ConstSetView> yr(yv); 115 RangesCompl<GlbRanges<ConstSetView> > yrc(yr); 116 IntSet yc(yrc); 117 ConstSetView cy(home, yc); 118 119 SetView xv(x); 120 GECODE_ES_FAIL( 121 (Intersection<ConstSetView, 122 SetView,SetView> 123 ::post(home,cy,xv,tmp))); 124 } 125 break; 126 case SRT_DISJ: 127 { 128 SetVar tmp(home); 129 EmptyView emptyset; 130 GECODE_ES_FAIL((SuperOfInter<SetView,SetView,EmptyView> 131 ::post(home, z, tmp, emptyset))); 132 133 GlbRanges<ConstSetView> yr(yv); 134 RangesCompl<GlbRanges<ConstSetView> > yrc(yr); 135 IntSet yc(yrc); 136 ConstSetView cy(home, yc); 137 GECODE_ES_FAIL( 138 (Intersection<ConstSetView, 139 SetView,SetView> 140 ::post(home,cy,x,tmp))); 141 } 142 break; 143 case SRT_CMPL: 144 { 145 SetView xv(x); 146 ComplementView<SetView> cx(xv); 147 GECODE_ES_FAIL( 148 (Union<ConstSetView, 149 ComplementView<SetView>, 150 SetView>::post(home, yv, cx, z))); 151 } 152 break; 153 default: 154 throw UnknownRelation("Set::rel"); 155 } 156 } else { 157 rel(home, y, op, x, r, z); 158 } 159 } 160 } 161 162 // STATISTICS: set-post 163