Gather data
This commit is contained in:
@@ -7,7 +7,9 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.function.Supplier;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,11 +124,10 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
Grid deepCopyGrid() { return new Grid(g.clone(), W); }
|
Grid deepCopyGrid() { return new Grid(g.clone(), W); }
|
||||||
private int offset(int r, int c) { return r * W + c; }
|
private int offset(int r, int c) { return r * W + c; }
|
||||||
boolean isLettercell(int r, int c) { return !isDigitAt(r, c); }
|
boolean isLettercell(int r, int c) { return !isDigitAt(r, c); }
|
||||||
char getCharAt(int r, int c) { return (char) (g[offset(r, c)] & 0xFF); }
|
char getCharAt(int r, int c) { return (char) (g[offset(r, c)]); }
|
||||||
int digitAt(int r, int c) { return g[offset(r, c)] - 48; }
|
int digitAt(int r, int c) { return g[offset(r, c)] - 48; }
|
||||||
byte byteAt(int r, int c) { return g[offset(r, c)]; }
|
byte byteAt(int r, int c) { return g[offset(r, c)]; }
|
||||||
void setCharAt(int r, int c, char ch) { g[offset(r, c)] = (byte) ch; }
|
void setCharAt(int r, int c, char ch) { g[offset(r, c)] = (byte) ch; }
|
||||||
void setCharAt(UndoPlace pl) { g[offset(pl.ur, pl.uc)] = (byte) pl.up; }
|
|
||||||
boolean isLetterAt(int r, int c) { return ((g[offset(r, c)] & 64) != 0); }
|
boolean isLetterAt(int r, int c) { return ((g[offset(r, c)] & 64) != 0); }
|
||||||
boolean isDigitAt(int r, int c) { return (g[offset(r, c)] & 48) == 48; }
|
boolean isDigitAt(int r, int c) { return (g[offset(r, c)] & 48) == 48; }
|
||||||
public int H() {
|
public int H() {
|
||||||
@@ -312,7 +313,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
var curLen = first.size();
|
var curLen = first.size();
|
||||||
|
|
||||||
for (var k = 1; k < listCount; k++) {
|
for (var k = 1; k < listCount; k++) {
|
||||||
var nxt = listBuffer[k];
|
var nxt = listBuffer[k];
|
||||||
cur = intersectSorted(buff, cur, curLen, nxt.data(), nxt.size());
|
cur = intersectSorted(buff, cur, curLen, nxt.data(), nxt.size());
|
||||||
curLen = cur.length;
|
curLen = cur.length;
|
||||||
if (curLen == 0) break;
|
if (curLen == 0) break;
|
||||||
@@ -320,15 +321,15 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
|
|
||||||
return new CandidateInfo(cur, curLen);
|
return new CandidateInfo(cur, curLen);
|
||||||
}
|
}
|
||||||
static record Slot(int key, long rs, long cs ,int len) {
|
static record Slot(int key, long rs, long cs, int len) {
|
||||||
|
|
||||||
//public int len() { return (int) (Long.highestOneBit(rs | cs) >> 2); }
|
//public int len() { return (int) (Long.highestOneBit(rs | cs) >> 2); }
|
||||||
public int clueR() { return (key >> 8) & 15; }
|
public int clueR() { return (key >> 8) & 15; }
|
||||||
public int clueC() { return (key >> 4) & 15; }
|
public int clueC() { return (key >> 4) & 15; }
|
||||||
public int dir() { return key & 15; }
|
public int dir() { return key & 15; }
|
||||||
public boolean horiz() { return horiz(key); }
|
public boolean horiz() { return horiz(key); }
|
||||||
public int r(int i) { return r(rs, i); }
|
public int r(int i) { return r(rs, i); }
|
||||||
public int c(int i) { return c(cs, i); }
|
public int c(int i) { return c(cs, i); }
|
||||||
|
|
||||||
public static boolean horiz(int key) { return ((key & 15) & 1) == 0; }
|
public static boolean horiz(int key) { return ((key & 15) & 1) == 0; }
|
||||||
public static int r(long rs, int i) { return (int) ((rs >> (i << 2)) & 15); }
|
public static int r(long rs, int i) { return (int) ((rs >> (i << 2)) & 15); }
|
||||||
@@ -663,6 +664,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
return pop.get(0);
|
return pop.get(0);
|
||||||
}
|
}
|
||||||
record UndoPlace(int ur, int uc, char up) { }
|
record UndoPlace(int ur, int uc, char up) { }
|
||||||
|
|
||||||
// ---------------- Fill (CSP) ----------------
|
// ---------------- Fill (CSP) ----------------
|
||||||
record Undo(UndoPlace[] ur, int n) { }
|
record Undo(UndoPlace[] ur, int n) { }
|
||||||
|
|
||||||
@@ -730,32 +732,6 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
}
|
}
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
static Undo placeWord(Grid grid, Slot s, Lemma w) {
|
|
||||||
var ur = new UndoPlace[s.len()];
|
|
||||||
var n = 0;
|
|
||||||
for (var i = 0; i < s.len(); i++) {
|
|
||||||
int r = s.r(i), c = s.c(i);
|
|
||||||
char cur = grid.getCharAt(r, c);
|
|
||||||
var ch = w.charAt(i);
|
|
||||||
if (cur == C_DASH) {
|
|
||||||
ur[n] = new UndoPlace(r, c, C_DASH);
|
|
||||||
n++;
|
|
||||||
grid.setCharAt(r, c, ch);
|
|
||||||
} else {
|
|
||||||
if (cur != ch) {
|
|
||||||
// rollback immediate changes
|
|
||||||
for (var j = 0; j < n; j++) grid.setCharAt(ur[j]);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new Undo(ur, n);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
static void undoPlace(Grid grid, Undo u) {
|
|
||||||
for (var i = 0; i < u.n; i++) grid.setCharAt(u.ur[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public FillResult fillMask(Rng rng, Grid mask, DictEntry[] dictIndex,
|
public FillResult fillMask(Rng rng, Grid mask, DictEntry[] dictIndex,
|
||||||
int logEveryMs, int timeLimitMs, boolean verbose) {
|
int logEveryMs, int timeLimitMs, boolean verbose) {
|
||||||
@@ -772,7 +748,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
for (var s : slots) for (var i = 0; i < s.len(); i++) cellCount[grid.offset(s.r(i), s.c(i))]++;
|
for (var s : slots) for (var i = 0; i < s.len(); i++) cellCount[grid.offset(s.r(i), s.c(i))]++;
|
||||||
|
|
||||||
var t0 = System.currentTimeMillis();
|
var t0 = System.currentTimeMillis();
|
||||||
final var lastLog = new java.util.concurrent.atomic.AtomicLong(t0);
|
final var lastLog = new AtomicLong(t0);
|
||||||
|
|
||||||
var stats = new FillStats();
|
var stats = new FillStats();
|
||||||
final var TOTAL = slots.size();
|
final var TOTAL = slots.size();
|
||||||
@@ -799,7 +775,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
System.out.flush();
|
System.out.flush();
|
||||||
};
|
};
|
||||||
|
|
||||||
java.util.function.Supplier<Pick> chooseMRV = () -> {
|
Supplier<Pick> chooseMRV = () -> {
|
||||||
Slot best = null;
|
Slot best = null;
|
||||||
CandidateInfo bestInfo = null;
|
CandidateInfo bestInfo = null;
|
||||||
|
|
||||||
@@ -853,11 +829,10 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
stats.lastMRV = pick.info.count;
|
stats.lastMRV = pick.info.count;
|
||||||
renderProgress.run();
|
renderProgress.run();
|
||||||
|
|
||||||
|
|
||||||
var s = pick.slot;
|
var s = pick.slot;
|
||||||
var k = s.key();
|
var k = s.key();
|
||||||
var entry = dictIndex[s.len()];
|
var entry = dictIndex[s.len()];
|
||||||
var pat = new char[s.len()];
|
var pat = new char[s.len()];
|
||||||
int patLen = patternForSlot(grid, s, pat);
|
int patLen = patternForSlot(grid, s, pat);
|
||||||
int undoOffset = depth * SIZE;
|
int undoOffset = depth * SIZE;
|
||||||
if (pick.info.indices != null && pick.info.indices.length > 0) {
|
if (pick.info.indices != null && pick.info.indices.length > 0) {
|
||||||
@@ -888,7 +863,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
used.set(w.index());
|
used.set(w.index());
|
||||||
assigned.put(k, w);
|
assigned.put(k, w);
|
||||||
|
|
||||||
if (backtrack(depth+1)) return true;
|
if (backtrack(depth + 1)) return true;
|
||||||
|
|
||||||
assigned.remove(k);
|
assigned.remove(k);
|
||||||
used.set(w.index, false);
|
used.set(w.index, false);
|
||||||
@@ -927,7 +902,7 @@ public record SwedishGenerator(int W, int H, int SIZE, int MAX_LEN, int[] buff)
|
|||||||
used.set(w.index());
|
used.set(w.index());
|
||||||
assigned.put(k, w);
|
assigned.put(k, w);
|
||||||
|
|
||||||
if (backtrack(depth+1)) return true;
|
if (backtrack(depth + 1)) return true;
|
||||||
|
|
||||||
assigned.remove(k);
|
assigned.remove(k);
|
||||||
used.set(w.index, false);
|
used.set(w.index, false);
|
||||||
|
|||||||
Reference in New Issue
Block a user