Create an integer symmetry implementation from a symmetry handle
| 137 | |
| 138 | /// Create an integer symmetry implementation from a symmetry handle |
| 139 | SymmetryImp<IntView>* |
| 140 | createIntSym(Space& home, const SymmetryHandle& s, |
| 141 | VariableMap variableMap) { |
| 142 | VariableSymmetryObject* varref = |
| 143 | dynamic_cast<VariableSymmetryObject*>(s.ref); |
| 144 | ValueSymmetryObject* valref = |
| 145 | dynamic_cast<ValueSymmetryObject*>(s.ref); |
| 146 | VariableSequenceSymmetryObject* varseqref = |
| 147 | dynamic_cast<VariableSequenceSymmetryObject*>(s.ref); |
| 148 | ValueSequenceSymmetryObject* valseqref = |
| 149 | dynamic_cast<ValueSequenceSymmetryObject*>(s.ref); |
| 150 | if (varref) { |
| 151 | int n = varref->nxs; |
| 152 | int* indices = home.alloc<int>(n); |
| 153 | for (int i = 0 ; i < n ; i++) { |
| 154 | VariableMap::const_iterator index = variableMap.find(varref->xs[i]); |
| 155 | if (index == variableMap.end()) |
| 156 | throw LDSBUnbranchedVariable("VariableSymmetryObject::createInt"); |
| 157 | indices[i] = index->second; |
| 158 | } |
| 159 | return new (home) VariableSymmetryImp<IntView>(home, indices, n); |
| 160 | } |
| 161 | if (valref) { |
| 162 | int n = valref->values.size(); |
| 163 | int *vs = home.alloc<int>(n); |
| 164 | int i = 0; |
| 165 | for (IntSetValues v(valref->values) ; v() ; ++v) { |
| 166 | vs[i] = v.val(); |
| 167 | i++; |
| 168 | } |
| 169 | return new (home) ValueSymmetryImp<IntView>(home, vs, n); |
| 170 | } |
| 171 | if (varseqref) { |
| 172 | int n = varseqref->nxs; |
| 173 | int* indices = home.alloc<int>(n); |
| 174 | for (int i = 0 ; i < n ; i++) { |
| 175 | VariableMap::const_iterator index = |
| 176 | variableMap.find(varseqref->xs[i]); |
| 177 | if (index == variableMap.end()) |
| 178 | throw LDSBUnbranchedVariable("VariableSequenceSymmetryObject::createInt"); |
| 179 | indices[i] = index->second; |
| 180 | } |
| 181 | return new (home) VariableSequenceSymmetryImp<IntView>(home, indices, n, |
| 182 | varseqref->seq_size); |
| 183 | } |
| 184 | if (valseqref) { |
| 185 | unsigned int n = valseqref->values.size(); |
| 186 | int *vs = home.alloc<int>(n); |
| 187 | for (unsigned int i = 0 ; i < n ; i++) |
| 188 | vs[i] = valseqref->values[i]; |
| 189 | return new (home) ValueSequenceSymmetryImp<IntView>(home, vs, n, |
| 190 | valseqref->seq_size); |
| 191 | } |
| 192 | GECODE_NEVER; |
| 193 | return nullptr; |
| 194 | } |
| 195 | |
| 196 | /// Create a boolean symmetry implementation from a symmetry handle |