@logic-pad/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +19 -0
- package/assets/logic-core.global.d.ts +5865 -0
- package/assets/z3-built.js +14723 -0
- package/assets/z3-built.wasm +0 -0
- package/assets/z3-built.worker.js +206 -0
- package/dist/data/config.d.ts +101 -0
- package/dist/data/config.js +55 -0
- package/dist/data/configurable.d.ts +12 -0
- package/dist/data/configurable.js +26 -0
- package/dist/data/dataHelper.d.ts +77 -0
- package/dist/data/dataHelper.js +190 -0
- package/dist/data/events/eventHelper.d.ts +1 -0
- package/dist/data/events/eventHelper.js +6 -0
- package/dist/data/events/onFinalValidation.d.ts +14 -0
- package/dist/data/events/onFinalValidation.js +4 -0
- package/dist/data/events/onGridChange.d.ts +6 -0
- package/dist/data/events/onGridChange.js +4 -0
- package/dist/data/events/onGridResize.d.ts +9 -0
- package/dist/data/events/onGridResize.js +4 -0
- package/dist/data/events/onSetGrid.d.ts +6 -0
- package/dist/data/events/onSetGrid.js +4 -0
- package/dist/data/events/onSymbolValidation.d.ts +18 -0
- package/dist/data/events/onSymbolValidation.js +4 -0
- package/dist/data/grid.d.ts +362 -0
- package/dist/data/grid.js +886 -0
- package/dist/data/gridConnections.d.ts +38 -0
- package/dist/data/gridConnections.js +328 -0
- package/dist/data/instruction.d.ts +19 -0
- package/dist/data/instruction.js +23 -0
- package/dist/data/primitives.d.ts +85 -0
- package/dist/data/primitives.js +90 -0
- package/dist/data/puzzle.d.ts +86 -0
- package/dist/data/puzzle.js +22 -0
- package/dist/data/rules/banPatternRule.d.ts +29 -0
- package/dist/data/rules/banPatternRule.js +133 -0
- package/dist/data/rules/cellCountRule.d.ts +32 -0
- package/dist/data/rules/cellCountRule.js +166 -0
- package/dist/data/rules/completePatternRule.d.ts +22 -0
- package/dist/data/rules/completePatternRule.js +53 -0
- package/dist/data/rules/connectAllRule.d.ts +28 -0
- package/dist/data/rules/connectAllRule.js +113 -0
- package/dist/data/rules/customRule.d.ts +32 -0
- package/dist/data/rules/customRule.js +92 -0
- package/dist/data/rules/foresightRule.d.ts +30 -0
- package/dist/data/rules/foresightRule.js +107 -0
- package/dist/data/rules/index.d.ts +3 -0
- package/dist/data/rules/index.js +10 -0
- package/dist/data/rules/musicControlLine.d.ts +64 -0
- package/dist/data/rules/musicControlLine.js +178 -0
- package/dist/data/rules/musicGridRule.d.ts +46 -0
- package/dist/data/rules/musicGridRule.js +211 -0
- package/dist/data/rules/mysteryRule.d.ts +37 -0
- package/dist/data/rules/mysteryRule.js +164 -0
- package/dist/data/rules/offByXRule.d.ts +30 -0
- package/dist/data/rules/offByXRule.js +134 -0
- package/dist/data/rules/regionAreaRule.d.ts +33 -0
- package/dist/data/rules/regionAreaRule.js +182 -0
- package/dist/data/rules/regionShapeRule.d.ts +22 -0
- package/dist/data/rules/regionShapeRule.js +58 -0
- package/dist/data/rules/rule.d.ts +18 -0
- package/dist/data/rules/rule.js +19 -0
- package/dist/data/rules/rules.gen.d.ts +14 -0
- package/dist/data/rules/rules.gen.js +18 -0
- package/dist/data/rules/sameShapeRule.d.ts +27 -0
- package/dist/data/rules/sameShapeRule.js +88 -0
- package/dist/data/rules/symbolsPerRegionRule.d.ts +37 -0
- package/dist/data/rules/symbolsPerRegionRule.js +211 -0
- package/dist/data/rules/undercluedRule.d.ts +22 -0
- package/dist/data/rules/undercluedRule.js +60 -0
- package/dist/data/rules/uniqueShapeRule.d.ts +27 -0
- package/dist/data/rules/uniqueShapeRule.js +85 -0
- package/dist/data/serializer/allSerializers.d.ts +30 -0
- package/dist/data/serializer/allSerializers.js +64 -0
- package/dist/data/serializer/compressor/allCompressors.d.ts +14 -0
- package/dist/data/serializer/compressor/allCompressors.js +43 -0
- package/dist/data/serializer/compressor/compressorBase.d.ts +16 -0
- package/dist/data/serializer/compressor/compressorBase.js +2 -0
- package/dist/data/serializer/compressor/deflateCompressor.d.ts +7 -0
- package/dist/data/serializer/compressor/deflateCompressor.js +17 -0
- package/dist/data/serializer/compressor/gzipCompressor.d.ts +5 -0
- package/dist/data/serializer/compressor/gzipCompressor.js +9 -0
- package/dist/data/serializer/compressor/streamCompressor.d.ts +6 -0
- package/dist/data/serializer/compressor/streamCompressor.js +36 -0
- package/dist/data/serializer/serializerBase.d.ts +27 -0
- package/dist/data/serializer/serializerBase.js +2 -0
- package/dist/data/serializer/serializer_v0.d.ts +36 -0
- package/dist/data/serializer/serializer_v0.js +426 -0
- package/dist/data/shapes.d.ts +17 -0
- package/dist/data/shapes.js +117 -0
- package/dist/data/solver/allSolvers.d.ts +3 -0
- package/dist/data/solver/allSolvers.js +11 -0
- package/dist/data/solver/backtrack/backtrackSolver.d.ts +9 -0
- package/dist/data/solver/backtrack/backtrackSolver.js +92 -0
- package/dist/data/solver/backtrack/backtrackWorker.d.ts +2 -0
- package/dist/data/solver/backtrack/backtrackWorker.js +295 -0
- package/dist/data/solver/backtrack/data.d.ts +46 -0
- package/dist/data/solver/backtrack/data.js +140 -0
- package/dist/data/solver/backtrack/rules/banPattern.d.ts +9 -0
- package/dist/data/solver/backtrack/rules/banPattern.js +66 -0
- package/dist/data/solver/backtrack/rules/cellCount.d.ts +7 -0
- package/dist/data/solver/backtrack/rules/cellCount.js +30 -0
- package/dist/data/solver/backtrack/rules/connectAll.d.ts +7 -0
- package/dist/data/solver/backtrack/rules/connectAll.js +49 -0
- package/dist/data/solver/backtrack/rules/regionArea.d.ts +8 -0
- package/dist/data/solver/backtrack/rules/regionArea.js +76 -0
- package/dist/data/solver/backtrack/rules/regionShape.d.ts +8 -0
- package/dist/data/solver/backtrack/rules/regionShape.js +62 -0
- package/dist/data/solver/backtrack/rules/sameShape.d.ts +8 -0
- package/dist/data/solver/backtrack/rules/sameShape.js +19 -0
- package/dist/data/solver/backtrack/rules/symbolsPerRegion.d.ts +10 -0
- package/dist/data/solver/backtrack/rules/symbolsPerRegion.js +92 -0
- package/dist/data/solver/backtrack/rules/uniqueShape.d.ts +8 -0
- package/dist/data/solver/backtrack/rules/uniqueShape.js +19 -0
- package/dist/data/solver/backtrack/symbols/areaNumber.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/areaNumber.js +77 -0
- package/dist/data/solver/backtrack/symbols/dart.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/dart.js +58 -0
- package/dist/data/solver/backtrack/symbols/directionLinker.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/directionLinker.js +50 -0
- package/dist/data/solver/backtrack/symbols/galaxy.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/galaxy.js +19 -0
- package/dist/data/solver/backtrack/symbols/letter.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/letter.js +100 -0
- package/dist/data/solver/backtrack/symbols/lotus.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/lotus.js +36 -0
- package/dist/data/solver/backtrack/symbols/minesweeper.d.ts +9 -0
- package/dist/data/solver/backtrack/symbols/minesweeper.js +55 -0
- package/dist/data/solver/backtrack/symbols/myopia.d.ts +7 -0
- package/dist/data/solver/backtrack/symbols/myopia.js +79 -0
- package/dist/data/solver/backtrack/symbols/viewpoint.d.ts +7 -0
- package/dist/data/solver/backtrack/symbols/viewpoint.js +56 -0
- package/dist/data/solver/solver.d.ts +61 -0
- package/dist/data/solver/solver.js +55 -0
- package/dist/data/solver/underclued/undercluedSolver.d.ts +8 -0
- package/dist/data/solver/underclued/undercluedSolver.js +55 -0
- package/dist/data/solver/underclued/undercluedWorker.d.ts +2 -0
- package/dist/data/solver/underclued/undercluedWorker.js +131 -0
- package/dist/data/solver/z3/modules/areaNumberModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/areaNumberModule.js +35 -0
- package/dist/data/solver/z3/modules/cellCountModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/cellCountModule.js +59 -0
- package/dist/data/solver/z3/modules/connectAllModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/connectAllModule.js +32 -0
- package/dist/data/solver/z3/modules/dartModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/dartModule.js +69 -0
- package/dist/data/solver/z3/modules/index.d.ts +3 -0
- package/dist/data/solver/z3/modules/index.js +10 -0
- package/dist/data/solver/z3/modules/letterModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/letterModule.js +41 -0
- package/dist/data/solver/z3/modules/modules.gen.d.ts +8 -0
- package/dist/data/solver/z3/modules/modules.gen.js +12 -0
- package/dist/data/solver/z3/modules/myopiaModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/myopiaModule.js +64 -0
- package/dist/data/solver/z3/modules/regionAreaModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/regionAreaModule.js +48 -0
- package/dist/data/solver/z3/modules/viewpointModule.d.ts +9 -0
- package/dist/data/solver/z3/modules/viewpointModule.js +37 -0
- package/dist/data/solver/z3/modules/z3Module.d.ts +7 -0
- package/dist/data/solver/z3/modules/z3Module.js +3 -0
- package/dist/data/solver/z3/utils.d.ts +2 -0
- package/dist/data/solver/z3/utils.js +26 -0
- package/dist/data/solver/z3/z3Solver.d.ts +10 -0
- package/dist/data/solver/z3/z3Solver.js +134 -0
- package/dist/data/solver/z3/z3SolverContext.d.ts +808 -0
- package/dist/data/solver/z3/z3SolverContext.js +49 -0
- package/dist/data/symbols/areaNumberSymbol.d.ts +30 -0
- package/dist/data/symbols/areaNumberSymbol.js +88 -0
- package/dist/data/symbols/customIconSymbol.d.ts +35 -0
- package/dist/data/symbols/customIconSymbol.js +105 -0
- package/dist/data/symbols/customSymbol.d.ts +23 -0
- package/dist/data/symbols/customSymbol.js +48 -0
- package/dist/data/symbols/customTextSymbol.d.ts +33 -0
- package/dist/data/symbols/customTextSymbol.js +106 -0
- package/dist/data/symbols/dartSymbol.d.ts +35 -0
- package/dist/data/symbols/dartSymbol.js +110 -0
- package/dist/data/symbols/directionLinkerSymbol.d.ts +36 -0
- package/dist/data/symbols/directionLinkerSymbol.js +259 -0
- package/dist/data/symbols/galaxySymbol.d.ts +26 -0
- package/dist/data/symbols/galaxySymbol.js +74 -0
- package/dist/data/symbols/index.d.ts +3 -0
- package/dist/data/symbols/index.js +10 -0
- package/dist/data/symbols/letterSymbol.d.ts +31 -0
- package/dist/data/symbols/letterSymbol.js +137 -0
- package/dist/data/symbols/lotusSymbol.d.ts +29 -0
- package/dist/data/symbols/lotusSymbol.js +132 -0
- package/dist/data/symbols/minesweeperSymbol.d.ts +31 -0
- package/dist/data/symbols/minesweeperSymbol.js +100 -0
- package/dist/data/symbols/multiEntrySymbol.d.ts +11 -0
- package/dist/data/symbols/multiEntrySymbol.js +14 -0
- package/dist/data/symbols/myopiaSymbol.d.ts +34 -0
- package/dist/data/symbols/myopiaSymbol.js +187 -0
- package/dist/data/symbols/numberSymbol.d.ts +19 -0
- package/dist/data/symbols/numberSymbol.js +41 -0
- package/dist/data/symbols/symbol.d.ts +16 -0
- package/dist/data/symbols/symbol.js +51 -0
- package/dist/data/symbols/symbols.gen.d.ts +10 -0
- package/dist/data/symbols/symbols.gen.js +14 -0
- package/dist/data/symbols/viewpointSymbol.d.ts +31 -0
- package/dist/data/symbols/viewpointSymbol.js +106 -0
- package/dist/data/tile.d.ts +26 -0
- package/dist/data/tile.js +68 -0
- package/dist/data/tileConnections.d.ts +25 -0
- package/dist/data/tileConnections.js +74 -0
- package/dist/data/validate.d.ts +5 -0
- package/dist/data/validate.js +131 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.js +100 -0
- package/dist/polyfill/streamPolyfill.d.ts +2 -0
- package/dist/polyfill/streamPolyfill.js +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { RectangularLattice } from 'grilops';
|
|
2
|
+
import { Direction, Orientation } from '../../primitives';
|
|
3
|
+
export function convertDirection(direction) {
|
|
4
|
+
switch (direction) {
|
|
5
|
+
case Direction.Up:
|
|
6
|
+
case Orientation.Up:
|
|
7
|
+
return RectangularLattice.VERTEX_DIRECTIONS.N;
|
|
8
|
+
case Direction.Down:
|
|
9
|
+
case Orientation.Down:
|
|
10
|
+
return RectangularLattice.VERTEX_DIRECTIONS.S;
|
|
11
|
+
case Direction.Left:
|
|
12
|
+
case Orientation.Left:
|
|
13
|
+
return RectangularLattice.VERTEX_DIRECTIONS.W;
|
|
14
|
+
case Direction.Right:
|
|
15
|
+
case Orientation.Right:
|
|
16
|
+
return RectangularLattice.VERTEX_DIRECTIONS.E;
|
|
17
|
+
case Orientation.DownLeft:
|
|
18
|
+
return RectangularLattice.VERTEX_DIRECTIONS.SW;
|
|
19
|
+
case Orientation.DownRight:
|
|
20
|
+
return RectangularLattice.VERTEX_DIRECTIONS.SE;
|
|
21
|
+
case Orientation.UpLeft:
|
|
22
|
+
return RectangularLattice.VERTEX_DIRECTIONS.NW;
|
|
23
|
+
case Orientation.UpRight:
|
|
24
|
+
return RectangularLattice.VERTEX_DIRECTIONS.NE;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import GridData from '../../grid';
|
|
2
|
+
import Solver from '../solver';
|
|
3
|
+
export default class Z3Solver extends Solver {
|
|
4
|
+
readonly id = "z3";
|
|
5
|
+
readonly description = "Good for confirming that a solution is unique, especially for larger puzzles. It is otherwise slower than most solvers in small to medium-sized puzzles.";
|
|
6
|
+
isEnvironmentSupported(): Promise<boolean>;
|
|
7
|
+
solve(grid: GridData): AsyncGenerator<GridData | null>;
|
|
8
|
+
isInstructionSupported(instructionId: string): boolean;
|
|
9
|
+
isGridSupported(grid: GridData): boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Point, PointSet, SymbolGrid, SymbolSet, getRectangleLattice, } from 'grilops';
|
|
2
|
+
import Solver from '../solver';
|
|
3
|
+
import { allZ3Modules } from './modules';
|
|
4
|
+
import { Color } from '../../primitives';
|
|
5
|
+
import { init } from 'z3-solver';
|
|
6
|
+
import Z3SolverContext from './z3SolverContext';
|
|
7
|
+
import { array } from '../../dataHelper';
|
|
8
|
+
export default class Z3Solver extends Solver {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
Object.defineProperty(this, "id", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: 'z3'
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(this, "description", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: 'Good for confirming that a solution is unique, especially for larger puzzles. It is otherwise slower than most solvers in small to medium-sized puzzles.'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async isEnvironmentSupported() {
|
|
25
|
+
try {
|
|
26
|
+
await init();
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch (ex) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async *solve(grid) {
|
|
34
|
+
console.log('Initializing dependencies');
|
|
35
|
+
const { Z3, Context } = await init();
|
|
36
|
+
const z3Ctx = Context('main');
|
|
37
|
+
const grilopsCtx = {
|
|
38
|
+
z3: Z3,
|
|
39
|
+
context: z3Ctx,
|
|
40
|
+
};
|
|
41
|
+
const symbolSet = new SymbolSet([
|
|
42
|
+
['empty', ' '],
|
|
43
|
+
[Color.Dark, 'B'],
|
|
44
|
+
[Color.Light, 'W'],
|
|
45
|
+
]);
|
|
46
|
+
const lattice = getRectangleLattice(grid.height, grid.width);
|
|
47
|
+
const symbolGrid = new SymbolGrid(grilopsCtx, lattice, symbolSet, new z3Ctx.Solver('QF_FD'));
|
|
48
|
+
const ctx = new Z3SolverContext(symbolGrid);
|
|
49
|
+
console.log('Encoding constraints');
|
|
50
|
+
grid.forEach((tile, x, y) => {
|
|
51
|
+
// encode all empty tiles
|
|
52
|
+
if (!tile.exists)
|
|
53
|
+
ctx.solver.add(symbolGrid.cellAt(new Point(y, x)).eq(symbolSet.indices.empty));
|
|
54
|
+
// encode all given tiles
|
|
55
|
+
else if (tile.fixed)
|
|
56
|
+
ctx.solver.add(symbolGrid.cellAt(new Point(y, x)).eq(symbolSet.indices[tile.color]));
|
|
57
|
+
// make sure tiles are filled
|
|
58
|
+
else {
|
|
59
|
+
ctx.solver.add(symbolGrid.cellAt(new Point(y, x)).neq(symbolSet.indices.empty));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// encode connections
|
|
63
|
+
const visited = array(grid.width, grid.height, () => false);
|
|
64
|
+
const queue = new PointSet();
|
|
65
|
+
grid.connections.edges.forEach(edge => {
|
|
66
|
+
queue.add(new Point(edge.y1, edge.x1));
|
|
67
|
+
queue.add(new Point(edge.y2, edge.x2));
|
|
68
|
+
});
|
|
69
|
+
queue.forEach(point => {
|
|
70
|
+
if (visited[point.y][point.x])
|
|
71
|
+
return;
|
|
72
|
+
visited[point.y][point.x] = true;
|
|
73
|
+
const connected = grid.connections.getConnectedTiles({
|
|
74
|
+
x: point.x,
|
|
75
|
+
y: point.y,
|
|
76
|
+
});
|
|
77
|
+
connected.forEach(p => (visited[p.y][p.x] = true));
|
|
78
|
+
const filtered = connected
|
|
79
|
+
.filter(p => grid.getTile(p.x, p.y).exists)
|
|
80
|
+
.map(p => new Point(p.y, p.x));
|
|
81
|
+
if (filtered.length < 2)
|
|
82
|
+
return;
|
|
83
|
+
for (let i = 1; i < filtered.length; i++) {
|
|
84
|
+
ctx.solver.add(symbolGrid.cellAt(point).eq(symbolGrid.cellAt(filtered[i])));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
[...new Set(grid.rules.map(r => r.id))].forEach(ruleId => {
|
|
88
|
+
if (!allZ3Modules.has(ruleId))
|
|
89
|
+
return;
|
|
90
|
+
allZ3Modules.get(ruleId).encode(grid, ctx);
|
|
91
|
+
});
|
|
92
|
+
[...grid.symbols.keys()].forEach(symbolId => allZ3Modules.get(symbolId).encode(grid, ctx));
|
|
93
|
+
const decodeResult = (model) => {
|
|
94
|
+
const tiles = array(grid.width, grid.height, (x, y) => {
|
|
95
|
+
const tile = grid.getTile(x, y);
|
|
96
|
+
if (!tile.exists || tile.fixed)
|
|
97
|
+
return tile;
|
|
98
|
+
const color = Number(model.eval(symbolGrid.cellAt(new Point(y, x))));
|
|
99
|
+
return tile.withColor(symbolSet.symbols.get(color).name);
|
|
100
|
+
});
|
|
101
|
+
return grid.withTiles(tiles);
|
|
102
|
+
};
|
|
103
|
+
console.log('Solving');
|
|
104
|
+
console.time('Solve time');
|
|
105
|
+
const result = await symbolGrid.solve();
|
|
106
|
+
console.timeEnd('Solve time');
|
|
107
|
+
if (!result) {
|
|
108
|
+
yield null;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const model = ctx.solver.model();
|
|
112
|
+
yield decodeResult(model);
|
|
113
|
+
console.log('Checking uniqueness');
|
|
114
|
+
console.time('Uniqueness time');
|
|
115
|
+
const result2 = await symbolGrid.isUnique();
|
|
116
|
+
console.timeEnd('Uniqueness time');
|
|
117
|
+
if (result2) {
|
|
118
|
+
yield null;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const model2 = ctx.solver.model();
|
|
122
|
+
yield decodeResult(model2);
|
|
123
|
+
}
|
|
124
|
+
isInstructionSupported(instructionId) {
|
|
125
|
+
return allZ3Modules.has(instructionId);
|
|
126
|
+
}
|
|
127
|
+
isGridSupported(grid) {
|
|
128
|
+
if (!super.isGridSupported(grid))
|
|
129
|
+
return false;
|
|
130
|
+
if (grid.getTileCount(true, true, Color.Gray) > 0)
|
|
131
|
+
return false;
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
}
|