Skip to content

Commit 2b2ff8f

Browse files
committed
Initial support for right-turn-only metric (as would be appropriate for,
say, Topsy-Turvy).
1 parent e23d43b commit 2b2ff8f

File tree

3 files changed

+64
-12
lines changed

3 files changed

+64
-12
lines changed

src/canon.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,17 @@ void makecanonstates(puzdef &pd) {
121121
continue ;
122122
}
123123
if (ms == prevm) {
124-
if (2*(prevcnt+1)+(pd.moves[ms].twist != 1) >
125-
pd.basemoveorders[pd.moves[ms].base]) {
126-
canonmask[fromst] |= 1LL << m ;
127-
continue ;
124+
if (quarter == 1) {
125+
if (2*(prevcnt+1)+(pd.moves[ms].twist != 1) >
126+
pd.basemoveorders[pd.moves[ms].base]) {
127+
canonmask[fromst] |= 1LL << m ;
128+
continue ;
129+
}
130+
} else {
131+
if ((prevcnt+1) == pd.basemoveorders[pd.moves[ms].base]) {
132+
canonmask[fromst] |= 1LL << m ;
133+
continue ;
134+
}
128135
}
129136
}
130137
thism = ms ;

src/prunetable.cpp

+27-8
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,17 @@ void fillworker::init(const puzdef &pd, int d_) {
4444
delete looktmp ;
4545
looktmp = 0 ;
4646
}
47-
looktmp = new allocsetval(pd, pd.solved) ;
48-
while (posns.size() <= 100 || (int)posns.size() <= d_+1)
49-
posns.push_back(allocsetval(pd, pd.solved)) ;
50-
pd.assignpos(posns[0], pd.solved) ;
47+
if (quarter < 2) {
48+
looktmp = new allocsetval(pd, pd.solved) ;
49+
while (posns.size() <= 100 || (int)posns.size() <= d_+2)
50+
posns.push_back(allocsetval(pd, pd.solved)) ;
51+
pd.assignpos(posns[0], pd.solved) ;
52+
} else {
53+
looktmp = new allocsetval(pd, pd.id) ;
54+
while (posns.size() <= 100 || (int)posns.size() <= d_+2)
55+
posns.push_back(allocsetval(pd, pd.id)) ;
56+
pd.assignpos(posns[0], pd.id) ;
57+
}
5158
d = d_ ;
5259
for (int i=0; i<MEMSHARDS; i++)
5360
fillbufs[i].nchunks = 0 ;
@@ -118,11 +125,21 @@ ull fillworker::filltable(const puzdef &pd, prunetable &pt, int togo,
118125
ull r = 0 ;
119126
if (togo == 0) {
120127
ull h ;
121-
if ((int)pd.rotgroup.size() > 1) {
122-
slowmodm2(pd, posns[sp], *looktmp) ;
123-
h = pt.indexhash(pd.totsize, *looktmp) ;
128+
if (quarter >= 2) {
129+
pd.mulinv(pd.solved, posns[sp], posns[sp+1]) ;
130+
if ((int)pd.rotgroup.size() > 1) {
131+
slowmodm2(pd, posns[sp+1], *looktmp) ;
132+
h = pt.indexhash(pd.totsize, *looktmp) ;
133+
} else {
134+
h = pt.indexhash(pd.totsize, posns[sp+1]) ;
135+
}
124136
} else {
125-
h = pt.indexhash(pd.totsize, posns[sp]) ;
137+
if ((int)pd.rotgroup.size() > 1) {
138+
slowmodm2(pd, posns[sp], *looktmp) ;
139+
h = pt.indexhash(pd.totsize, *looktmp) ;
140+
} else {
141+
h = pt.indexhash(pd.totsize, posns[sp]) ;
142+
}
126143
}
127144
int shard = (h >> pt.shardshift) ;
128145
fillbuf &fb = fillbufs[shard] ;
@@ -363,6 +380,8 @@ void prunetable::addsumdat(const puzdef &pd, string &filename) const {
363380
}
364381
string prunetable::makefilename(const puzdef &pd) const {
365382
string filename = "tws5-" + inputbasename + "-" ;
383+
if (quarter > 1)
384+
filename += "q" ;
366385
if (quarter)
367386
filename += "q-" ;
368387
ull bytes = size >> 2 ;

src/puzdef.h

+26
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,32 @@ struct puzdef {
148148
cp += n ;
149149
}
150150
}
151+
void mulinv(const setval a, const setval b, setval c) const {
152+
const uchar *ap = a.dat ;
153+
const uchar *bp = b.dat ;
154+
uchar *cp = c.dat ;
155+
memset(cp, 0, totsize) ;
156+
for (int i=0; i<(int)setdefs.size(); i++) {
157+
const setdef &sd = setdefs[i] ;
158+
int n = sd.size ;
159+
for (int j=0; j<n; j++)
160+
cp[bp[j]] = ap[j] ;
161+
ap += n ;
162+
bp += n ;
163+
cp += n ;
164+
if (sd.omod > 1) {
165+
uchar *moda = gmoda[sd.omod] ;
166+
for (int j=0; j<n; j++)
167+
cp[bp[j-n]] = moda[ap[j]+sd.omod-bp[j]] ;
168+
} else {
169+
for (int j=0; j<n; j++)
170+
cp[j] = 0 ;
171+
}
172+
ap += n ;
173+
bp += n ;
174+
cp += n ;
175+
}
176+
}
151177
void mul3(const setval a, const setval b, const setval c, setval d) const {
152178
const uchar *ap = a.dat ;
153179
const uchar *bp = b.dat ;

0 commit comments

Comments
 (0)