introduce bitloops
This commit is contained in:
@@ -75,7 +75,7 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
grid.forEachSlot((key, lo, hi) -> slots[N[0]++] = Slot.from(key, lo, hi, index[Slot.length(lo, hi)]));
|
||||
return slots;
|
||||
}
|
||||
public static Slotinfo[] scoreSlots(int[] slotScores, Slot[] slots) {
|
||||
public static Slotinfo[] scoreSlots(Slot[] slots) {
|
||||
val count = new byte[SwedishGenerator.SIZE];
|
||||
Slotinfo[] slotInfo = new Slotinfo[slots.length];
|
||||
for (var s : slots) {
|
||||
@@ -84,8 +84,7 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
}
|
||||
for (int i = 0; i < slots.length; i++) {
|
||||
var slot = slots[i];
|
||||
slotScores[i] = slotScore(count, slot.lo, slot.hi);
|
||||
slotInfo[i] = new Slotinfo(slot.key, slot.lo, slot.hi, slotScores[i], new Assign(), slot.entry);
|
||||
slotInfo[i] = new Slotinfo(slot.key, slot.lo, slot.hi, slotScore(count, slot.lo, slot.hi), new Assign(), slot.entry);
|
||||
}
|
||||
return slotInfo;
|
||||
}
|
||||
@@ -115,16 +114,14 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
if (hLo != X) {
|
||||
rLo &= ((1L << numberOfTrailingZeros(hLo)) - 1);
|
||||
rHi = 0;
|
||||
} else if (hHi != X) { rHi &= ((1L << numberOfTrailingZeros(hHi)) - 1); }
|
||||
} else {
|
||||
if (hHi != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hHi);
|
||||
rHi &= -(1L << msb << 1);
|
||||
rLo = 0;
|
||||
} else if (hLo != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hLo);
|
||||
rLo &= -(1L << msb << 1);
|
||||
}
|
||||
} else if (hHi != X) rHi &= ((1L << numberOfTrailingZeros(hHi)) - 1);
|
||||
} else if (hHi != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hHi);
|
||||
rHi &= -(1L << msb << 1);
|
||||
rLo = 0;
|
||||
} else if (hLo != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hLo);
|
||||
rLo &= -(1L << msb << 1);
|
||||
}
|
||||
if ((rLo | rHi) != X) {
|
||||
hasSlots = true;
|
||||
@@ -136,9 +133,7 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
cVHi |= rHi;
|
||||
}
|
||||
if ((bitCount(rLo) + bitCount(rHi)) < MIN_LEN) penalty += 8000;
|
||||
} else {
|
||||
penalty += 25000;
|
||||
}
|
||||
} else penalty += 25000;
|
||||
}
|
||||
for (long bits = hi_cl; bits != X; bits &= bits - 1) {
|
||||
long lsb = bits & -bits;
|
||||
@@ -152,16 +147,14 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
if (hLo != X) {
|
||||
rLo &= ((1L << numberOfTrailingZeros(hLo)) - 1);
|
||||
rHi = 0;
|
||||
} else if (hHi != X) { rHi &= ((1L << numberOfTrailingZeros(hHi)) - 1); }
|
||||
} else {
|
||||
if (hHi != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hHi);
|
||||
rHi &= -(1L << msb << 1);
|
||||
rLo = 0;
|
||||
} else if (hLo != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hLo);
|
||||
rLo &= -(1L << msb << 1);
|
||||
}
|
||||
} else if (hHi != X) rHi &= ((1L << numberOfTrailingZeros(hHi)) - 1);
|
||||
} else if (hHi != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hHi);
|
||||
rHi &= -(1L << msb << 1);
|
||||
rLo = 0;
|
||||
} else if (hLo != X) {
|
||||
int msb = 63 - numberOfLeadingZeros(hLo);
|
||||
rLo &= -(1L << msb << 1);
|
||||
}
|
||||
if ((rLo | rHi) != X) {
|
||||
hasSlots = true;
|
||||
@@ -173,9 +166,7 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
cVHi |= rHi;
|
||||
}
|
||||
if ((bitCount(rLo) + bitCount(rHi)) < MIN_LEN) penalty += 8000;
|
||||
} else {
|
||||
penalty += 25000;
|
||||
}
|
||||
} else penalty += 25000;
|
||||
}
|
||||
|
||||
if (!hasSlots) return 1_000_000_000L;
|
||||
@@ -297,11 +288,9 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
var d_idx = rng.randint2bitByte();
|
||||
if (c.hasRoomForClue(OFFSETS_D_IDX[Slot.packSlotKey(ri, d_idx)])) c.setClueLo(1L << ri, d_idx);
|
||||
}
|
||||
} else {
|
||||
if (!c.cluelessHi(ri)) {
|
||||
var d_idx = rng.randint2bitByte();
|
||||
if (c.hasRoomForClue(OFFSETS_D_IDX[Slot.packSlotKey(ri, d_idx)])) c.setClueHi(1L << (ri & 63), d_idx);
|
||||
}
|
||||
} else if (!c.cluelessHi(ri)) {
|
||||
var d_idx = rng.randint2bitByte();
|
||||
if (c.hasRoomForClue(OFFSETS_D_IDX[Slot.packSlotKey(ri, d_idx)])) c.setClueHi(1L << (ri & 63), d_idx);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -315,13 +304,12 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
var nr = Math.sin(theta);
|
||||
|
||||
long maskLo = 0, maskHi = 0;
|
||||
for (var rci : IT) {
|
||||
for (var rci : IT)
|
||||
if ((rci.cross_r()) * nc + (rci.cross_c()) * nr < 0) {
|
||||
int i = rci.i();
|
||||
if ((i & 64) == 0) maskLo |= (1L << i);
|
||||
else maskHi |= (1L << (i - 64));
|
||||
}
|
||||
}
|
||||
var c = new Clues(
|
||||
(a.lo & ~maskLo) | (other.lo & maskLo),
|
||||
(a.hi & ~maskHi) | (other.hi & maskHi),
|
||||
@@ -403,12 +391,11 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
for (var cand : pop) {
|
||||
if (next.size() >= offspring) break;
|
||||
var ok = true;
|
||||
for (var kept : next) {
|
||||
for (var kept : next)
|
||||
if (cand.grid.similarity(kept.grid) > 0.92) {
|
||||
ok = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ok) next.add(cand);
|
||||
}
|
||||
pop = next;
|
||||
@@ -428,12 +415,6 @@ public record Masker(Rng rng, int[] stack, Clues cache) {
|
||||
public static class Clues {
|
||||
|
||||
long lo, hi, vlo, vhi, rlo, rhi;
|
||||
public long lo() { return lo; }
|
||||
public long hi() { return hi; }
|
||||
public long vlo() { return vlo; }
|
||||
public long vhi() { return vhi; }
|
||||
public long rlo() { return rlo; }
|
||||
public long rhi() { return rhi; }
|
||||
|
||||
public static Clues createEmpty() { return new Clues(0, 0, 0, 0, 0, 0); }
|
||||
public static Clues parse(String s) {
|
||||
|
||||
Reference in New Issue
Block a user