23class IndexBackedPermutation {
31 IndexBackedPermutation(
int * arr,
int n_) {
34 inverseIndexes =
new int[n];
36 for(
int i = 0; i < n; i++) {
37 inverseIndexes[array[i]] = i;
43 ~IndexBackedPermutation() {
44 delete [] inverseIndexes;
48 void setIndexForValue(
int value,
int index) {
49 inverseIndexes[value] = index;
53 int getIndexForValue(
int value) {
54 return inverseIndexes[value];
60 void remove(
int* size,
int pos) {
65 array[*size] = array[pos];
69 t = inverseIndexes[array[pos]];
70 inverseIndexes[array[pos]] = inverseIndexes[array[*size]];
71 inverseIndexes[array[*size]] = t;
78 int t = p->variables[pos1];
79 p->variables[pos1] = p->variables[pos2];
80 p->variables[pos2] = t;
83 t = inverseIndexes[p->variables[pos1]];
84 inverseIndexes[p->variables[pos1]] = inverseIndexes[p->variables[pos2]];
85 inverseIndexes[p->variables[pos2]] = t;
96 int capacity = (int) p1->getSize();
101 int * legalPositions =
new int[capacity];
102 for(
int i = 0; i < capacity; i++) {
103 legalPositions[i] = i;
114 for(
int i = 0; i < capacity; i++) {
115 ch->variables[i] = p1->variables[i];
116 idxCh.setIndexForValue(p1->variables[i], i);
117 idxP2.setIndexForValue(p2->variables[i], i);
121 int attempts = capacity / 3;
124 int legalsCount = capacity;
127 for(
int attempt = 0; attempt < attempts; attempt++) {
129 int rand = state_->getRandomizer()->getRandomInteger(legalsCount);
130 int pos1 = legalPositions[rand];
131 idxLegal.remove(&legalsCount, rand);
134 int value1 = ch->variables[pos1];
135 int pos2 = idxP2.getIndexForValue(value1);
138 idxCh.swap(ch, pos1, pos2);
141 if(idxLegal.getIndexForValue(pos2) < legalsCount) {
142 idxLegal.remove(&legalsCount, idxLegal.getIndexForValue(pos2));
146 delete [] legalPositions;