Gather data

This commit is contained in:
mike
2026-01-06 00:41:42 +01:00
parent 7154ee757c
commit 42a69235d2
2 changed files with 27 additions and 31 deletions

View File

@@ -259,7 +259,7 @@ public class Main {
completionService.submit(() -> {
var threadRng = new Rng(opts.seed + attempt);
var mask = generateMask(threadRng, dict.lenCounts(), opts.pop, opts.gens, false);
var filled = fillMask(threadRng, mask, dict.index(), dict.words(), 200, fillTimeout, false);
var filled = fillMask(threadRng, mask, dict.index(), 200, fillTimeout, false);
if (filled.ok && (opts.minSimplicity <= 0 || filled.simplicity >= opts.minSimplicity)) {
return new PuzzleResult(dict, mask, filled);
@@ -284,7 +284,7 @@ public class Main {
completionService.submit(() -> {
var threadRng = new Rng(opts.seed + attempt);
var mask = generateMask(threadRng, dict.lenCounts(), opts.pop, opts.gens, false);
var filled = fillMask(threadRng, mask, dict.index(), dict.words(), 200, fillTimeout, false);
var filled = fillMask(threadRng, mask, dict.index(), 200, fillTimeout, false);
if (filled.ok && (opts.minSimplicity <= 0 || filled.simplicity >= opts.minSimplicity)) {
return new PuzzleResult(dict, mask, filled);
@@ -314,7 +314,7 @@ public class Main {
info("try : " + attempt + " (remaining: " + (deadline - System.currentTimeMillis()) / 1000 + "s)");
var mask = generateMask(rng, dict.lenCounts(), opts.pop, opts.gens, true);
var filled = fillMask(rng, mask, dict.index(), dict.words(), 200, fillTimeout, true);
var filled = fillMask(rng, mask, dict.index(), 200, fillTimeout, true);
if (filled.ok && (opts.minSimplicity <= 0 || filled.simplicity >= opts.minSimplicity)) {
info("status : SOLVED");

View File

@@ -167,8 +167,8 @@ public class SwedishGenerator {
}
public static record Dict(Map<String, Lemma> words,
HashMap<Integer, DictEntry> index,
HashMap<Integer, Integer> lenCounts) { }
DictEntry[] index,
int[] lenCounts) { }
static Dict loadWords(String wordsPath) {
String raw;
try {
@@ -213,19 +213,16 @@ public class SwedishGenerator {
// Sort words by difficulty in ascending order
words.sort(Comparator.comparingInt(wd -> wd.simpel));
var index = new HashMap<Integer, DictEntry>();
var lenCounts = new HashMap<Integer, Integer>();
var lenCounts = new int[12];
var index = new DictEntry[12];
Arrays.setAll(index, i -> new DictEntry(i));
int maxLength = -1;
for (var w : words) {
var L = w.length();
lenCounts.put(L, lenCounts.getOrDefault(L, 0) + 1);
var entry = index.get(L);
if (entry == null) {
entry = new DictEntry(L);
index.put(L, entry);
}
if (L > maxLength) maxLength = L;
lenCounts[L]++;
var entry = index[L];
var idx = entry.words.size();
entry.words.add(w);
@@ -349,7 +346,7 @@ public class SwedishGenerator {
// ---------------- FAST mask fitness ----------------
static long maskFitness(char[][] grid, HashMap<Integer, Integer> lenCounts) {
static long maskFitness(char[][] grid, int[] lenCounts) {
long penalty = 0;
var clueCount = 0;
@@ -371,7 +368,7 @@ public class SwedishGenerator {
if (s.len > MAX_LEN) penalty += 8000 + (long) (s.len - MAX_LEN) * 500L;
if (s.len >= MIN_LEN && s.len <= MAX_LEN) {
if (!lenCounts.containsKey(s.len)) penalty += 12000;
if (lenCounts[s.len]<=0) penalty += 12000;
}
for (var i = 0; i < s.len; i++) {
@@ -514,7 +511,7 @@ public class SwedishGenerator {
return out;
}
static char[][] hillclimb(Rng rng, char[][] start, HashMap<Integer, Integer> lenCounts, int limit) {
static char[][] hillclimb(Rng rng, char[][] start, int[] lenCounts, int limit) {
var best = deepCopyGrid(start);
var bestF = maskFitness(best, lenCounts);
var fails = 0;
@@ -539,7 +536,7 @@ public class SwedishGenerator {
return same / (double) (W * H);
}
static char[][] generateMask(Rng rng, HashMap<Integer, Integer> lenCounts, int popSize, int gens, boolean verbose) {
static char[][] generateMask(Rng rng, int[] lenCounts, int popSize, int gens, boolean verbose) {
if (verbose) System.out.println("generateMask init pop: " + popSize);
var pop = new ArrayList<char[][]>();
@@ -653,8 +650,7 @@ public class SwedishGenerator {
for (var i = 0; i < u.n; i++) grid[u.rs[i]][u.cs[i]] = u.prev[i];
}
static FillResult fillMask(Rng rng, char[][] mask, HashMap<Integer, DictEntry> dictIndex,
Map<String, Lemma> llmScores,
static FillResult fillMask(Rng rng, char[][] mask, DictEntry[] dictIndex,
int logEveryMs, int timeLimitMs, boolean verbose) {
var grid = deepCopyGrid(mask);
@@ -710,7 +706,7 @@ public class SwedishGenerator {
var k = s.key();
if (assigned.containsKey(k)) continue;
var entry = dictIndex.get(s.len);
var entry = dictIndex[s.len];
if (entry == null) {
return new Pick(null, null, false);
}
@@ -760,7 +756,7 @@ public class SwedishGenerator {
var s = pick.slot;
var k = s.key();
var entry = dictIndex.get(s.len);
var entry = dictIndex[s.len];
var pat = patternForSlot(grid, s);
Predicate<Lemma> tryWord = (Lemma w) -> {