sym-imp.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <gecode/int/ldsb.hh>
00039 #include <gecode/int/branch.hh>
00040
00041 namespace Gecode { namespace Int { namespace LDSB {
00043 template <>
00044 ArgArray<Literal>
00045 VariableSymmetryImp<IntView>
00046 ::symmetric(Literal l, const ViewArray<IntView>& x) const {
00047 (void) x;
00048 if (indices.valid(l._variable) && indices.get(l._variable)) {
00049 int n = 0;
00050 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(indices) ; i() ; ++i)
00051 n++;
00052 ArgArray<Literal> lits(n);
00053 int j = 0;
00054 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(indices) ; i() ; ++i)
00055 lits[j++] = Literal(i.val(), l._value);
00056 return lits;
00057 } else {
00058 return ArgArray<Literal>(0);
00059 }
00060 }
00062 template <>
00063 ArgArray<Literal>
00064 VariableSymmetryImp<BoolView>
00065 ::symmetric(Literal l, const ViewArray<BoolView>& x) const {
00066 (void) x;
00067 if (indices.valid(l._variable) && indices.get(l._variable)) {
00068 int n = 0;
00069 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(indices) ; i() ; ++i)
00070 n++;
00071 ArgArray<Literal> lits(n);
00072 int j = 0;
00073 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(indices) ; i() ; ++i)
00074 lits[j++] = Literal(i.val(), l._value);
00075 return lits;
00076 } else {
00077 return ArgArray<Literal>(0);
00078 }
00079 }
00080
00082 template <>
00083 ArgArray<Literal>
00084 ValueSymmetryImp<IntView>
00085 ::symmetric(Literal l, const ViewArray<IntView>& x) const {
00086 (void) x;
00087 if (values.valid(l._value) && values.get(l._value)) {
00088 int n = 0;
00089 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(values) ; i() ; ++i)
00090 n++;
00091 ArgArray<Literal> lits(n);
00092 int j = 0;
00093 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(values) ; i() ; ++i)
00094 lits[j++] = Literal(l._variable, i.val());
00095 return lits;
00096 } else {
00097 return ArgArray<Literal>(0);
00098 }
00099 }
00101 template <>
00102 ArgArray<Literal>
00103 ValueSymmetryImp<BoolView>
00104 ::symmetric(Literal l, const ViewArray<BoolView>& x) const {
00105 (void) x;
00106 if (values.valid(l._value) && values.get(l._value)) {
00107 int n = 0;
00108 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(values) ; i() ; ++i)
00109 n++;
00110 ArgArray<Literal> lits(n);
00111 int j = 0;
00112 for (Iter::Values::BitSetOffset<Support::BitSetOffset<Space> > i(values) ; i() ; ++i)
00113 lits[j++] = Literal(l._variable, i.val());
00114 return lits;
00115 } else {
00116 return ArgArray<Literal>(0);
00117 }
00118 }
00119
00121 template <>
00122 ArgArray<Literal>
00123 ValueSequenceSymmetryImp<Int::IntView>
00124 ::symmetric(Literal l, const ViewArray<IntView>& x) const {
00125 (void) x;
00126 Support::DynamicStack<Literal, Heap> s(heap);
00127 std::pair<int,int> location = findVar(values, n_values, seq_size, l._value);
00128 if (location.first == -1) return dynamicStackToArgArray(s);
00129 unsigned int seqNum = location.first;
00130 unsigned int seqPos = location.second;
00131 if (! dead_sequences.get(seqNum)) {
00132 for (unsigned int seq = 0 ; seq < n_seqs ; seq++) {
00133 if (seq == seqNum) continue;
00134 if (dead_sequences.get(seq)) continue;
00135 s.push(Literal(l._variable, getVal(seq,seqPos)));
00136 }
00137 }
00138 return dynamicStackToArgArray(s);
00139 }
00141 template <>
00142 ArgArray<Literal>
00143 ValueSequenceSymmetryImp<BoolView>
00144 ::symmetric(Literal l, const ViewArray<BoolView>& x) const {
00145 (void) x;
00146 Support::DynamicStack<Literal, Heap> s(heap);
00147 std::pair<int,int> location = findVar(values, n_values, seq_size, l._value);
00148 if (location.first == -1) return dynamicStackToArgArray(s);
00149 unsigned int seqNum = location.first;
00150 unsigned int seqPos = location.second;
00151 if (! dead_sequences.get(seqNum)) {
00152 for (unsigned int seq = 0 ; seq < n_seqs ; seq++) {
00153 if (seq == seqNum) continue;
00154 if (dead_sequences.get(seq)) continue;
00155 s.push(Literal(l._variable, getVal(seq,seqPos)));
00156 }
00157 }
00158 return dynamicStackToArgArray(s);
00159 }
00160
00161 }}}
00162
00163