Create a boolean symmetry implementation from a symmetry handle
| 195 | |
| 196 | /// Create a boolean symmetry implementation from a symmetry handle |
| 197 | SymmetryImp<BoolView>* createBoolSym(Space& home, const SymmetryHandle& s, |
| 198 | VariableMap variableMap) { |
| 199 | VariableSymmetryObject* varref = |
| 200 | dynamic_cast<VariableSymmetryObject*>(s.ref); |
| 201 | ValueSymmetryObject* valref = |
| 202 | dynamic_cast<ValueSymmetryObject*>(s.ref); |
| 203 | VariableSequenceSymmetryObject* varseqref = |
| 204 | dynamic_cast<VariableSequenceSymmetryObject*>(s.ref); |
| 205 | ValueSequenceSymmetryObject* valseqref = |
| 206 | dynamic_cast<ValueSequenceSymmetryObject*>(s.ref); |
| 207 | if (varref) { |
| 208 | int n = varref->nxs; |
| 209 | int* indices = home.alloc<int>(n); |
| 210 | for (int i = 0 ; i < n ; i++) { |
| 211 | VariableMap::const_iterator index = variableMap.find(varref->xs[i]); |
| 212 | if (index == variableMap.end()) |
| 213 | throw LDSBUnbranchedVariable("VariableSymmetryObject::createBool"); |
| 214 | indices[i] = index->second; |
| 215 | } |
| 216 | return new (home) VariableSymmetryImp<BoolView>(home, indices, n); |
| 217 | } |
| 218 | if (valref) { |
| 219 | int n = valref->values.size(); |
| 220 | int *vs = home.alloc<int>(n); |
| 221 | int i = 0; |
| 222 | for (IntSetValues v(valref->values) ; v() ; ++v) { |
| 223 | vs[i] = v.val(); |
| 224 | i++; |
| 225 | } |
| 226 | return new (home) ValueSymmetryImp<BoolView>(home, vs, n); |
| 227 | } |
| 228 | if (varseqref) { |
| 229 | int n = varseqref->nxs; |
| 230 | int* indices = home.alloc<int>(n); |
| 231 | for (int i = 0 ; i < n ; i++) { |
| 232 | VariableMap::const_iterator index = |
| 233 | variableMap.find(varseqref->xs[i]); |
| 234 | if (index == variableMap.end()) |
| 235 | throw LDSBUnbranchedVariable("VariableSequenceSymmetryObject::createBool"); |
| 236 | indices[i] = index->second; |
| 237 | } |
| 238 | return new (home) VariableSequenceSymmetryImp<BoolView>(home, indices, |
| 239 | n, varseqref->seq_size); |
| 240 | } |
| 241 | if (valseqref) { |
| 242 | unsigned int n = valseqref->values.size(); |
| 243 | int *vs = home.alloc<int>(n); |
| 244 | for (unsigned int i = 0 ; i < n ; i++) |
| 245 | vs[i] = valseqref->values[i]; |
| 246 | return new (home) ValueSequenceSymmetryImp<BoolView>(home, vs, n, |
| 247 | valseqref->seq_size); |
| 248 | } |
| 249 | GECODE_NEVER; |
| 250 | return nullptr; |
| 251 | } |
| 252 | }}} |
| 253 | |
| 254 | namespace Gecode { |