cubing 0.40.0 → 0.41.1
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/dist/esm/bluetooth/index.js +41 -41
- package/dist/esm/bluetooth/index.js.map +3 -3
- package/dist/esm/{chunk-2UHC65GH.js → chunk-3B5ND2Z3.js} +25 -23
- package/dist/esm/chunk-3B5ND2Z3.js.map +7 -0
- package/dist/esm/{chunk-NZAWY3EU.js → chunk-3RHBVKV2.js} +98 -89
- package/dist/esm/chunk-3RHBVKV2.js.map +7 -0
- package/dist/esm/{chunk-45VMKYXT.js → chunk-6FC7BO5U.js} +3 -5
- package/dist/esm/chunk-6FC7BO5U.js.map +7 -0
- package/dist/esm/{chunk-TKIXG2EX.js → chunk-GXXHRHE5.js} +35 -35
- package/dist/esm/chunk-GXXHRHE5.js.map +7 -0
- package/dist/esm/{chunk-NBVZ7LEM.js → chunk-H66X47MG.js} +115 -125
- package/dist/esm/chunk-H66X47MG.js.map +7 -0
- package/dist/esm/{chunk-JXW26CFJ.js → chunk-LRYMCZVI.js} +3 -3
- package/dist/esm/{chunk-ZILJKTYP.js → chunk-Q7UVEISQ.js} +17 -17
- package/dist/esm/{chunk-IZJ3YK5S.js → chunk-RYRRMKVS.js} +14 -13
- package/dist/esm/chunk-RYRRMKVS.js.map +7 -0
- package/dist/esm/{chunk-F6V2QBMP.js → chunk-V4YTFIKT.js} +99 -89
- package/dist/esm/chunk-V4YTFIKT.js.map +7 -0
- package/dist/esm/{chunk-TBVTYIMY.js → chunk-XODLDV3Q.js} +25 -23
- package/dist/esm/chunk-XODLDV3Q.js.map +7 -0
- package/dist/esm/inside-GPSEWHK7.js +17 -0
- package/dist/esm/kpuzzle/index.js +3 -3
- package/dist/esm/notation/index.js +3 -3
- package/dist/esm/protocol/index.js +3 -3
- package/dist/esm/puzzle-geometry/index.js +43 -26
- package/dist/esm/puzzle-geometry/index.js.map +2 -2
- package/dist/esm/puzzles/index.js +3 -3
- package/dist/esm/{puzzles-dynamic-side-events-DHAI7HWB.js → puzzles-dynamic-side-events-42Q52YAB.js} +157 -85
- package/dist/esm/puzzles-dynamic-side-events-42Q52YAB.js.map +7 -0
- package/dist/esm/{puzzles-dynamic-unofficial-QXSDLTK5.js → puzzles-dynamic-unofficial-PCHNKY4Y.js} +13 -13
- package/dist/esm/{puzzles-dynamic-unofficial-QXSDLTK5.js.map → puzzles-dynamic-unofficial-PCHNKY4Y.js.map} +2 -2
- package/dist/esm/scramble/index.js +7 -7
- package/dist/esm/search/index.js +9 -9
- package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js → search-dynamic-sgs-side-events-4ZHROANX.js} +5 -5
- package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js → search-dynamic-sgs-unofficial-VKBYULK5.js} +5 -5
- package/dist/esm/{search-dynamic-solve-3x3x3-7EEK52SV.js → search-dynamic-solve-3x3x3-NULYS7OL.js} +3 -3
- package/dist/esm/{search-dynamic-solve-3x3x3-7EEK52SV.js.map → search-dynamic-solve-3x3x3-NULYS7OL.js.map} +2 -2
- package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js → search-dynamic-solve-4x4x4-KASG5V7K.js} +5 -5
- package/dist/esm/{search-dynamic-solve-sq1-CWJPRQVZ.js → search-dynamic-solve-sq1-TO7UHE6Y.js} +6 -6
- package/dist/esm/{search-dynamic-solve-sq1-CWJPRQVZ.js.map → search-dynamic-solve-sq1-TO7UHE6Y.js.map} +2 -2
- package/dist/esm/search-worker-entry.js.js +1 -1
- package/dist/esm/twisty/index.js +74 -66
- package/dist/esm/twisty/index.js.map +3 -3
- package/dist/esm/{twisty-dynamic-3d-EI5ZUVCP.js → twisty-dynamic-3d-5VC2L2WS.js} +19 -19
- package/dist/esm/twisty-dynamic-3d-5VC2L2WS.js.map +7 -0
- package/dist/esm/{twsearch-ZALDQ4TE.js → twsearch-OMTTOVJO.js} +15 -15
- package/dist/esm/twsearch-OMTTOVJO.js.map +7 -0
- package/dist/types/{KState-33ce1f57.d.ts → KPattern-12e23b1f.d.ts} +37 -33
- package/dist/types/{TwizzleLink-19143923.d.ts → TwizzleLink-8eaf164c.d.ts} +10 -10
- package/dist/types/bluetooth/index.d.ts +8 -8
- package/dist/types/{bluetooth-puzzle-29072a56.d.ts → bluetooth-puzzle-91e73b7f.d.ts} +3 -3
- package/dist/types/kpuzzle/index.d.ts +1 -1
- package/dist/types/notation/index.d.ts +2 -2
- package/dist/types/{outside-b7760f77.d.ts → outside-deaac55d.d.ts} +8 -8
- package/dist/types/protocol/index.d.ts +5 -5
- package/dist/types/puzzle-geometry/index.d.ts +2 -2
- package/dist/types/puzzles/index.d.ts +3 -3
- package/dist/types/scramble/index.d.ts +2 -2
- package/dist/types/search/index.d.ts +4 -4
- package/dist/types/stream/index.d.ts +2 -2
- package/dist/types/twisty/index.d.ts +7 -7
- package/package.json +1 -1
- package/dist/esm/chunk-2UHC65GH.js.map +0 -7
- package/dist/esm/chunk-45VMKYXT.js.map +0 -7
- package/dist/esm/chunk-F6V2QBMP.js.map +0 -7
- package/dist/esm/chunk-IZJ3YK5S.js.map +0 -7
- package/dist/esm/chunk-NBVZ7LEM.js.map +0 -7
- package/dist/esm/chunk-NZAWY3EU.js.map +0 -7
- package/dist/esm/chunk-TBVTYIMY.js.map +0 -7
- package/dist/esm/chunk-TKIXG2EX.js.map +0 -7
- package/dist/esm/inside-BGMQCQ2A.js +0 -17
- package/dist/esm/puzzles-dynamic-side-events-DHAI7HWB.js.map +0 -7
- package/dist/esm/twisty-dynamic-3d-EI5ZUVCP.js.map +0 -7
- package/dist/esm/twsearch-ZALDQ4TE.js.map +0 -7
- /package/dist/esm/{chunk-JXW26CFJ.js.map → chunk-LRYMCZVI.js.map} +0 -0
- /package/dist/esm/{chunk-ZILJKTYP.js.map → chunk-Q7UVEISQ.js.map} +0 -0
- /package/dist/esm/{inside-BGMQCQ2A.js.map → inside-GPSEWHK7.js.map} +0 -0
- /package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js.map → search-dynamic-sgs-side-events-4ZHROANX.js.map} +0 -0
- /package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js.map → search-dynamic-sgs-unofficial-VKBYULK5.js.map} +0 -0
- /package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js.map → search-dynamic-solve-4x4x4-KASG5V7K.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cubing/protocol/binary/orbit-indexing.ts", "../../src/cubing/protocol/binary/binary3x3x3.ts", "../../src/cubing/protocol/binary/hex.ts"],
|
|
4
|
+
"sourcesContent": ["export function identityPermutation(numElems: number): number[] {\n const arr = new Array<number>(numElems);\n for (let i = 0; i < numElems; i++) {\n arr[i] = i;\n }\n return arr;\n}\n\n// Inclusive start, exclusive end (similar to `Array.prototype.slice`)\nexport function orientationsToMask(\n radix: number,\n orientations: number[],\n): number {\n let val = 0;\n for (const orientation of orientations) {\n val *= radix;\n val += orientation;\n }\n return val;\n}\n\n// Inclusive start, exclusive end (similar to `Array.prototype.slice`)\nexport function maskToOrientations(\n radix: number,\n numElems: number,\n mask: number,\n): number[] {\n const arr = [];\n while (mask > 0) {\n arr.push(mask % radix);\n mask = Math.floor(mask / radix);\n }\n return new Array<number>(numElems - arr.length).fill(0).concat(arr.reverse());\n}\n\n// From https://www.jaapsch.net/puzzles/compindx.htm#perm\nexport function permutationToLex(permutation: number[]): number {\n const n = permutation.length;\n let lexicographicIdx = 0;\n for (let i = 0; i < n - 1; i++) {\n lexicographicIdx = lexicographicIdx * (n - i);\n for (let j = i + 1; j < n; j++) {\n if (permutation[i] > permutation[j]) {\n lexicographicIdx += 1;\n }\n }\n }\n return lexicographicIdx;\n}\n\n// From https://www.jaapsch.net/puzzles/compindx.htm#perm\nexport function lexToPermutation(\n numPieces: number,\n lexicographicIdx: number,\n): number[] {\n const permutation: number[] = new Array(numPieces);\n permutation[numPieces - 1] = 0;\n for (let i = numPieces - 2; i >= 0; i--) {\n permutation[i] = lexicographicIdx % (numPieces - i);\n lexicographicIdx = Math.floor(lexicographicIdx / (numPieces - i));\n for (let j = i + 1; j < numPieces; j++) {\n if (permutation[j] >= permutation[i]) {\n permutation[j] = permutation[j] + 1;\n }\n }\n }\n return permutation;\n}\n", "import { KPattern, type KPatternData } from \"../../kpuzzle\";\nimport {\n experimental3x3x3KPuzzle,\n experimentalNormalize3x3x3Orientation,\n experimentalPuzzleOrientation3x3x3Cache,\n experimentalPuzzleOrientation3x3x3Idx,\n} from \"../../puzzles/cubing-private\";\nimport {\n identityPermutation,\n lexToPermutation,\n maskToOrientations,\n orientationsToMask,\n permutationToLex,\n} from \"./orbit-indexing\";\n\n// TODO: combine with `orientPuzzle`?\nexport function reorientPuzzle(\n pattern: KPattern,\n idxU: number,\n idxL: number,\n): KPattern {\n return pattern.applyTransformation(\n experimentalPuzzleOrientation3x3x3Cache()[idxU][idxL].invert(),\n );\n}\n\ntype Binary3x3x3Pattern = ArrayBuffer;\n\n// Bit lengths of the encoded components, in order.\nconst BIT_LENGTHS = [29, 12, 16, 13, 3, 2, 1, 12];\n\n// These fields are sorted by the order in which they appear in the binary format.\nexport interface Binary3x3x3Components {\n epLex: number; // 29 bits, edge permutation\n eoMask: number; // 12 bits, edge orientation\n cpLex: number; // 16 bits, corner permutation\n coMask: number; // 13 bits, corner orientation\n poIdxU: number; // 3 bits, puzzle orientation (U face)\n poIdxL: number; // 2 bits, puzzle orientation (L face)\n moSupport: number; // 1 bit, center orientation support\n moMask: number; // 12 bits, center orientation\n}\n\n// There are various clever ways to do this, but this is simple and efficient.\nfunction arraySum(arr: number[]): number {\n let total = 0;\n for (const entry of arr) {\n total += entry;\n }\n return total;\n}\n\n// Due to limitations in JS bit operations, this is unsafe if any of the bit lengths span across the contents of more than 4 bytes.\n// - Safe: [8, 32]\n// - Unsafe: [4, 32, 4]\n// - Unsafe: [40, 4]\nfunction splitBinary(bitLengths: number[], buffy: ArrayBuffer): number[] {\n const u8buffy = new Uint8Array(buffy);\n let at = 0;\n let bits = 0;\n let accum = 0;\n const values: number[] = [];\n for (const bitLength of bitLengths) {\n while (bits < bitLength) {\n accum = (accum << 8) | u8buffy[at++];\n bits += 8;\n }\n values.push((accum >> (bits - bitLength)) & ((1 << bitLength) - 1));\n bits -= bitLength;\n }\n return values;\n}\n\n// See above for safety notes.\nfunction concatBinary(bitLengths: number[], values: number[]): ArrayBuffer {\n const buffy = new Uint8Array(Math.ceil(arraySum(bitLengths) / 8));\n let at = 0;\n let bits = 0;\n let accum = 0;\n for (let i = 0; i < bitLengths.length; i++) {\n accum = (accum << bitLengths[i]) | values[i];\n bits += bitLengths[i];\n while (bits >= 8) {\n buffy[at++] = accum >> (bits - 8);\n bits -= 8;\n }\n }\n if (bits > 0) {\n buffy[at++] = accum << (8 - bits);\n }\n return buffy;\n}\n\n// 0x111 (for idxU) means \"not supported\"\nfunction supportsPuzzleOrientation(components: Binary3x3x3Components): boolean {\n return components.poIdxU !== 7;\n}\n\nfunction hasFullMOData(centerOrientationModData: number[] | undefined): 0 | 1 {\n if (!centerOrientationModData) {\n return 1;\n }\n for (let i = 0; i < 6; i++) {\n if (centerOrientationModData[i] !== 0) {\n return 0;\n }\n }\n return 1;\n}\n\nexport function reid3x3x3ToBinaryComponents(\n pattern: KPattern,\n): Binary3x3x3Components {\n const normedPattern = experimentalNormalize3x3x3Orientation(pattern);\n\n const epLex = permutationToLex(normedPattern.patternData[\"EDGES\"].pieces);\n const eoMask = orientationsToMask(\n 2,\n normedPattern.patternData[\"EDGES\"].orientation,\n );\n const cpLex = permutationToLex(normedPattern.patternData[\"CORNERS\"].pieces);\n const coMask = orientationsToMask(\n 3,\n normedPattern.patternData[\"CORNERS\"].orientation,\n );\n const [poIdxU, poIdxL] = experimentalPuzzleOrientation3x3x3Idx(pattern);\n\n const moSupport = hasFullMOData(\n pattern.patternData[\"CENTERS\"].orientationMod,\n ); // Required for now.\n const moMask = moSupport\n ? orientationsToMask(4, normedPattern.patternData[\"CENTERS\"].orientation)\n : 0;\n\n return {\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n };\n}\n\nexport function binaryComponentsToTwizzleBinary(\n components: Binary3x3x3Components,\n): Binary3x3x3Pattern {\n const { epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask } =\n components;\n\n return concatBinary(BIT_LENGTHS, [\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n ]);\n}\n\n/** @category Binary 3x3x3 Format */\nexport function reid3x3x3ToTwizzleBinary(\n pattern: KPattern,\n): Binary3x3x3Pattern {\n const components: Binary3x3x3Components =\n reid3x3x3ToBinaryComponents(pattern);\n return binaryComponentsToTwizzleBinary(components);\n}\n\n/** @category Binary 3x3x3 Format */\nexport function twizzleBinaryToBinaryComponents(\n buffer: ArrayBuffer,\n): Binary3x3x3Components {\n const [epLex, eoMask, cpLex, coMask, poIdxU, poIdxL, moSupport, moMask] =\n splitBinary(BIT_LENGTHS, buffer);\n\n return {\n epLex,\n eoMask,\n cpLex,\n coMask,\n poIdxU,\n poIdxL,\n moSupport,\n moMask,\n };\n}\n\n/** @category Binary 3x3x3 Format */\nexport function binaryComponentsToReid3x3x3(\n components: Binary3x3x3Components,\n): KPattern {\n const patternData: KPatternData = {\n EDGES: {\n pieces: lexToPermutation(12, components.epLex),\n orientation: maskToOrientations(2, 12, components.eoMask),\n },\n CORNERS: {\n pieces: lexToPermutation(8, components.cpLex),\n orientation: maskToOrientations(3, 8, components.coMask),\n },\n CENTERS: {\n pieces: identityPermutation(6),\n orientation: maskToOrientations(4, 6, components.moMask),\n },\n };\n if (!components.moSupport) {\n patternData.CENTERS.orientationMod = new Array(6).fill(1);\n }\n const normedPattern = new KPattern(experimental3x3x3KPuzzle, patternData);\n\n if (!supportsPuzzleOrientation(components)) {\n return normedPattern;\n }\n\n return reorientPuzzle(normedPattern, components.poIdxU, components.poIdxL);\n}\n\n// Returns a list of error string.\n// An empty list means validation success.\nfunction validateComponents(components: Binary3x3x3Components): string[] {\n const errors = [];\n if (components.epLex < 0 || components.epLex >= 479001600) {\n errors.push(`epLex (${components.epLex}) out of range`);\n }\n if (components.cpLex < 0 || components.cpLex >= 40320) {\n errors.push(`cpLex (${components.cpLex}) out of range`);\n }\n if (components.coMask < 0 || components.coMask >= 6561) {\n errors.push(`coMask (${components.coMask}) out of range`);\n }\n if (components.poIdxU < 0 || components.poIdxU >= 6) {\n // 0x111 (for idxU) means \"not supported\"\n if (supportsPuzzleOrientation(components)) {\n errors.push(`poIdxU (${components.poIdxU}) out of range`);\n }\n }\n // The following cannot be (f decoded from binary properl) out of rangey.\n if (components.eoMask < 0 || components.eoMask >= 4096) {\n errors.push(`eoMask (${components.eoMask}) out of range`);\n }\n if (components.moMask < 0 || components.moMask >= 4096) {\n errors.push(`moMask (${components.moMask}) out of range`);\n }\n if (components.poIdxL < 0 || components.poIdxL >= 4) {\n errors.push(`poIdxL (${components.poIdxL}) out of range`);\n }\n if (components.moSupport < 0 || components.moSupport >= 2) {\n errors.push(`moSupport (${components.moSupport}) out of range`);\n }\n return errors;\n}\n\n/** @category Binary 3x3x3 Format */\nexport function twizzleBinaryToReid3x3x3(buffy: ArrayBuffer): KPattern {\n const components = twizzleBinaryToBinaryComponents(buffy);\n const errors = validateComponents(components);\n if (errors.length !== 0) {\n throw new Error(`Invalid binary pattern components: ${errors.join(\", \")}`);\n }\n return binaryComponentsToReid3x3x3(components);\n}\n", "export function bufferToSpacedHex(buffer: ArrayBuffer): string {\n // buffer is an ArrayBuffer\n return (\n Array.prototype.map.call(new Uint8Array(buffer), (x: number) =>\n `00${x.toString(16)}`.slice(-2),\n ) as string[]\n ).join(\" \");\n}\n\nexport function spacedHexToBuffer(hex: string): Uint8Array {\n return new Uint8Array(hex.split(\" \").map((c) => parseInt(c, 16)));\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -7,22 +7,22 @@ import {
|
|
|
7
7
|
random333Scramble,
|
|
8
8
|
setIsInsideWorker,
|
|
9
9
|
solve333
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GXXHRHE5.js";
|
|
11
11
|
import {
|
|
12
12
|
countMoves
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6FC7BO5U.js";
|
|
14
14
|
import {
|
|
15
15
|
cube2x2x2,
|
|
16
16
|
puzzles
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-Q7UVEISQ.js";
|
|
18
18
|
import {
|
|
19
19
|
from,
|
|
20
20
|
normalize2x2x2Orientation
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-H66X47MG.js";
|
|
22
22
|
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} from "./chunk-
|
|
23
|
+
KPattern,
|
|
24
|
+
KPuzzle
|
|
25
|
+
} from "./chunk-V4YTFIKT.js";
|
|
26
26
|
import {
|
|
27
27
|
Alg,
|
|
28
28
|
AlgBuilder,
|
|
@@ -73,8 +73,8 @@ var TrembleSolver = class {
|
|
|
73
73
|
// public badRandomMoves(): KSolvePuzzleState {
|
|
74
74
|
// return badRandomMoves(this.moves, this.ksp);
|
|
75
75
|
// }
|
|
76
|
-
async solve(
|
|
77
|
-
const transformation =
|
|
76
|
+
async solve(pattern, stage1DepthLimit = DEFAULT_STAGE1_DEPTH_LIMIT, quantumMoveOrder) {
|
|
77
|
+
const transformation = pattern.experimentalToTransformation();
|
|
78
78
|
if (!transformation) {
|
|
79
79
|
throw new Error(
|
|
80
80
|
"distinguishable pieces are not supported in tremble solver yt"
|
|
@@ -135,7 +135,7 @@ var TrembleSolver = class {
|
|
|
135
135
|
const loc = cubieSeq[i];
|
|
136
136
|
const orbitName = loc.orbitName;
|
|
137
137
|
const idx = loc.permutationIdx;
|
|
138
|
-
key += ` ${inverseTransformation.transformationData[orbitName].permutation[idx]} ${inverseTransformation.transformationData[orbitName].
|
|
138
|
+
key += ` ${inverseTransformation.transformationData[orbitName].permutation[idx]} ${inverseTransformation.transformationData[orbitName].orientationDelta[idx]}`;
|
|
139
139
|
}
|
|
140
140
|
const info = step.lookup[key];
|
|
141
141
|
if (!info) {
|
|
@@ -151,7 +151,7 @@ var TrembleSolver = class {
|
|
|
151
151
|
const location = cubieSeq[i];
|
|
152
152
|
const orbitName = location.orbitName;
|
|
153
153
|
const idx = location.permutationIdx;
|
|
154
|
-
if (transformation.transformationData[orbitName].permutation[idx] !== idx || transformation.transformationData[orbitName].
|
|
154
|
+
if (transformation.transformationData[orbitName].permutation[idx] !== idx || transformation.transformationData[orbitName].orientationDelta[idx] !== 0) {
|
|
155
155
|
throw new Error("bad SGS :-(");
|
|
156
156
|
}
|
|
157
157
|
}
|
|
@@ -160,7 +160,7 @@ var TrembleSolver = class {
|
|
|
160
160
|
return algBuilder.toAlg();
|
|
161
161
|
}
|
|
162
162
|
};
|
|
163
|
-
function
|
|
163
|
+
function randomPatternFromSGS(kpuzzle, sgs) {
|
|
164
164
|
let transformation = kpuzzle.identityTransformation();
|
|
165
165
|
for (const step of sgs.ordering) {
|
|
166
166
|
const sgsAction = randomChoice(Object.values(step.lookup));
|
|
@@ -168,14 +168,14 @@ function randomStateFromSGS(kpuzzle, sgs) {
|
|
|
168
168
|
sgsAction.transformation
|
|
169
169
|
);
|
|
170
170
|
}
|
|
171
|
-
return transformation.
|
|
171
|
+
return transformation.toKPattern();
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
// src/cubing/search/inside/solve/puzzles/dynamic/sgs-side-events/index.ts
|
|
175
|
-
var searchDynamicSideEvents = from(() => import("./search-dynamic-sgs-side-events-
|
|
175
|
+
var searchDynamicSideEvents = from(() => import("./search-dynamic-sgs-side-events-4ZHROANX.js"));
|
|
176
176
|
|
|
177
177
|
// src/cubing/search/inside/solve/twsearch.ts
|
|
178
|
-
var twsearchPromise = from(async () => import("./twsearch-
|
|
178
|
+
var twsearchPromise = from(async () => import("./twsearch-OMTTOVJO.js"));
|
|
179
179
|
var existingPuzzleDefString;
|
|
180
180
|
var existingMoveSubsetString;
|
|
181
181
|
function mustBeNaturalNumber(meaning, n) {
|
|
@@ -183,13 +183,13 @@ function mustBeNaturalNumber(meaning, n) {
|
|
|
183
183
|
throw new Error(`Invalid ${meaning}: ${n}`);
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
-
async function solveTwsearch(def,
|
|
186
|
+
async function solveTwsearch(def, patternData, options) {
|
|
187
187
|
const {
|
|
188
188
|
setArg,
|
|
189
189
|
setKPuzzleDefString,
|
|
190
190
|
serializeDefToTws,
|
|
191
|
-
|
|
192
|
-
|
|
191
|
+
solvePattern,
|
|
192
|
+
serializeScramblePattern
|
|
193
193
|
} = await twsearchPromise;
|
|
194
194
|
const kpuzzle = new KPuzzle(def);
|
|
195
195
|
setArg("--startprunedepth 5");
|
|
@@ -238,7 +238,9 @@ async function solveTwsearch(def, stateData, options) {
|
|
|
238
238
|
"Attempted to solve two different move subsets in the same worker using `twsearch`. This is not currently supported!"
|
|
239
239
|
);
|
|
240
240
|
}
|
|
241
|
-
return await
|
|
241
|
+
return await solvePattern(
|
|
242
|
+
serializeScramblePattern("SearchState", patternData)
|
|
243
|
+
);
|
|
242
244
|
}
|
|
243
245
|
|
|
244
246
|
// src/cubing/search/inside/solve/puzzles/2x2x2.ts
|
|
@@ -256,11 +258,11 @@ async function getCachedTrembleSolver() {
|
|
|
256
258
|
async function preInitialize222() {
|
|
257
259
|
await getCachedTrembleSolver();
|
|
258
260
|
}
|
|
259
|
-
async function solve222HTMSubOptimal(
|
|
261
|
+
async function solve222HTMSubOptimal(pattern, maxDepth = 11) {
|
|
260
262
|
mustBeInsideWorker();
|
|
261
263
|
return await solveTwsearch(
|
|
262
264
|
(await cube2x2x2.kpuzzle()).definition,
|
|
263
|
-
|
|
265
|
+
pattern.patternData,
|
|
264
266
|
{
|
|
265
267
|
moveSubset: "UFLR".split(""),
|
|
266
268
|
// TODO: <U, F, R>
|
|
@@ -268,12 +270,12 @@ async function solve222HTMSubOptimal(state, maxDepth = 11) {
|
|
|
268
270
|
}
|
|
269
271
|
);
|
|
270
272
|
}
|
|
271
|
-
async function solve222HTMOptimal(
|
|
273
|
+
async function solve222HTMOptimal(pattern, maxDepth = 11) {
|
|
272
274
|
mustBeInsideWorker();
|
|
273
|
-
const {
|
|
275
|
+
const { normalizedPattern, normalizationAlg } = normalize2x2x2Orientation(pattern);
|
|
274
276
|
const orientedResult = await solveTwsearch(
|
|
275
277
|
(await cube2x2x2.kpuzzle()).definition,
|
|
276
|
-
|
|
278
|
+
normalizedPattern.patternData,
|
|
277
279
|
{
|
|
278
280
|
moveSubset: "UFLR".split(""),
|
|
279
281
|
// TODO: <U, F, R>
|
|
@@ -282,9 +284,9 @@ async function solve222HTMOptimal(state, maxDepth = 11) {
|
|
|
282
284
|
);
|
|
283
285
|
return normalizationAlg.concat(orientedResult);
|
|
284
286
|
}
|
|
285
|
-
async function hasHTMSolutionWithFewerMoves(
|
|
287
|
+
async function hasHTMSolutionWithFewerMoves(pattern, filterMin) {
|
|
286
288
|
try {
|
|
287
|
-
(await solve222HTMOptimal(
|
|
289
|
+
(await solve222HTMOptimal(pattern, filterMin - 1)).log();
|
|
288
290
|
return true;
|
|
289
291
|
} catch (e) {
|
|
290
292
|
if (e instanceof (await twsearchPromise).NoSolutionError) {
|
|
@@ -308,58 +310,57 @@ function isCancelling(alg) {
|
|
|
308
310
|
}
|
|
309
311
|
return false;
|
|
310
312
|
}
|
|
311
|
-
async function solve222ForScramble(
|
|
313
|
+
async function solve222ForScramble(pattern) {
|
|
312
314
|
mustBeInsideWorker();
|
|
313
315
|
return solveTwsearch(
|
|
314
316
|
(await cube2x2x2.kpuzzle()).definition,
|
|
315
|
-
|
|
317
|
+
pattern.patternData,
|
|
316
318
|
{
|
|
317
319
|
moveSubset: "UFLR".split(""),
|
|
318
320
|
minDepth: 11
|
|
319
321
|
}
|
|
320
322
|
);
|
|
321
323
|
}
|
|
322
|
-
function mutatingRandomizeOrbit(kpuzzle, orbitName,
|
|
323
|
-
randomPermuteInPlace(
|
|
324
|
-
const
|
|
325
|
-
const ori =
|
|
324
|
+
function mutatingRandomizeOrbit(kpuzzle, orbitName, pattern, options) {
|
|
325
|
+
randomPermuteInPlace(pattern.patternData[orbitName].pieces);
|
|
326
|
+
const orbitDefinition = kpuzzle.lookupOrbitDefinition(orbitName);
|
|
327
|
+
const ori = pattern.patternData[orbitName].orientation;
|
|
326
328
|
let sum = 0;
|
|
327
|
-
for (let i = 0; i <
|
|
328
|
-
const o = randomUIntBelow(
|
|
329
|
+
for (let i = 0; i < orbitDefinition.numPieces; i++) {
|
|
330
|
+
const o = randomUIntBelow(orbitDefinition.numOrientations);
|
|
329
331
|
ori[i] = o;
|
|
330
332
|
sum += o;
|
|
331
333
|
}
|
|
332
334
|
if (options && "orientationSum" in options) {
|
|
333
|
-
ori[0] = ((ori[0] + options.orientationSum - sum) %
|
|
335
|
+
ori[0] = ((ori[0] + options.orientationSum - sum) % orbitDefinition.numOrientations + orbitDefinition.numOrientations) % orbitDefinition.numOrientations;
|
|
334
336
|
}
|
|
335
337
|
}
|
|
336
|
-
async function
|
|
338
|
+
async function random222Pattern() {
|
|
337
339
|
const kpuzzle = await puzzles["2x2x2"].kpuzzle();
|
|
338
|
-
const
|
|
340
|
+
const patternCopy = new KPattern(
|
|
339
341
|
kpuzzle,
|
|
340
|
-
structuredClone(kpuzzle.
|
|
342
|
+
structuredClone(kpuzzle.defaultPattern().patternData)
|
|
341
343
|
);
|
|
342
|
-
mutatingRandomizeOrbit(kpuzzle, "CORNERS",
|
|
344
|
+
mutatingRandomizeOrbit(kpuzzle, "CORNERS", patternCopy, {
|
|
343
345
|
orientationSum: 0
|
|
344
346
|
});
|
|
345
|
-
return
|
|
347
|
+
return patternCopy;
|
|
346
348
|
}
|
|
347
349
|
async function random222Scramble() {
|
|
348
|
-
let
|
|
349
|
-
while (await hasHTMSolutionWithFewerMoves(
|
|
350
|
-
console.info("Filtered out a 2x2x2
|
|
351
|
-
|
|
350
|
+
let pattern = await random222Pattern();
|
|
351
|
+
while (await hasHTMSolutionWithFewerMoves(pattern, 4)) {
|
|
352
|
+
console.info("Filtered out a 2x2x2 pattern!");
|
|
353
|
+
pattern = await random222Pattern();
|
|
352
354
|
}
|
|
353
|
-
|
|
354
|
-
let sol = await solve222ForScramble(inverseState);
|
|
355
|
+
let sol = await solve222ForScramble(pattern);
|
|
355
356
|
while (isCancelling(sol)) {
|
|
356
|
-
sol = await solve222ForScramble(
|
|
357
|
+
sol = await solve222ForScramble(pattern);
|
|
357
358
|
}
|
|
358
359
|
return sol;
|
|
359
360
|
}
|
|
360
361
|
|
|
361
362
|
// src/cubing/search/inside/solve/puzzles/dynamic/4x4x4/index.ts
|
|
362
|
-
var dynamic4x4x4Solver = from(() => import("./search-dynamic-solve-4x4x4-
|
|
363
|
+
var dynamic4x4x4Solver = from(() => import("./search-dynamic-solve-4x4x4-KASG5V7K.js"));
|
|
363
364
|
|
|
364
365
|
// src/cubing/search/inside/solve/puzzles/4x4x4.ts
|
|
365
366
|
var randomSuffixes = [
|
|
@@ -452,7 +453,7 @@ async function oriented555RandomMoves() {
|
|
|
452
453
|
var dynamicFTOSolver = from(() => import("./search-dynamic-solve-fto-GGEYM3K6.js"));
|
|
453
454
|
|
|
454
455
|
// src/cubing/search/inside/solve/puzzles/fto.ts
|
|
455
|
-
var dynamic = from(() => import("./search-dynamic-sgs-unofficial-
|
|
456
|
+
var dynamic = from(() => import("./search-dynamic-sgs-unofficial-VKBYULK5.js"));
|
|
456
457
|
async function randomFTOScramble() {
|
|
457
458
|
mustBeInsideWorker();
|
|
458
459
|
return new Alg(await (await dynamicFTOSolver).randomFTOScrambleString());
|
|
@@ -491,17 +492,19 @@ async function getCachedTrembleSolver2() {
|
|
|
491
492
|
);
|
|
492
493
|
})());
|
|
493
494
|
}
|
|
494
|
-
async function solveMegaminx(
|
|
495
|
+
async function solveMegaminx(pattern) {
|
|
495
496
|
mustBeInsideWorker();
|
|
496
497
|
const trembleSolver = await getCachedTrembleSolver2();
|
|
497
|
-
const
|
|
498
|
-
|
|
499
|
-
|
|
498
|
+
const patternDataWithoutMO = structuredClone(
|
|
499
|
+
pattern.patternData
|
|
500
|
+
);
|
|
501
|
+
patternDataWithoutMO.CENTERS.orientation = new Array(12).fill(0);
|
|
502
|
+
const patternWithoutMO = new KPattern(
|
|
500
503
|
await (await searchDynamicSideEvents).cachedMegaminxKPuzzleWithoutMO(),
|
|
501
|
-
|
|
504
|
+
patternDataWithoutMO
|
|
502
505
|
);
|
|
503
506
|
const alg = await trembleSolver.solve(
|
|
504
|
-
|
|
507
|
+
patternWithoutMO,
|
|
505
508
|
TREMBLE_DEPTH,
|
|
506
509
|
() => 5
|
|
507
510
|
// TODO: Attach quantum move order lookup to puzzle.
|
|
@@ -522,25 +525,25 @@ async function getCachedTrembleSolver3() {
|
|
|
522
525
|
);
|
|
523
526
|
})());
|
|
524
527
|
}
|
|
525
|
-
async function solvePyraminx(
|
|
528
|
+
async function solvePyraminx(pattern) {
|
|
526
529
|
mustBeInsideWorker();
|
|
527
530
|
const trembleSolver = await getCachedTrembleSolver3();
|
|
528
|
-
const alg = await trembleSolver.solve(
|
|
531
|
+
const alg = await trembleSolver.solve(pattern, TREMBLE_DEPTH2, () => 3);
|
|
529
532
|
return alg;
|
|
530
533
|
}
|
|
531
|
-
async function
|
|
534
|
+
async function randomPyraminxPatternFixedOrientation() {
|
|
532
535
|
mustBeInsideWorker();
|
|
533
|
-
return
|
|
536
|
+
return randomPatternFromSGS(
|
|
534
537
|
await puzzles.pyraminx.kpuzzle(),
|
|
535
538
|
await (await searchDynamicSideEvents).sgsDataPyraminxFixedOrientation()
|
|
536
539
|
);
|
|
537
540
|
}
|
|
538
541
|
async function randomPyraminxScrambleFixedOrientation() {
|
|
539
|
-
return solvePyraminx(await
|
|
542
|
+
return solvePyraminx(await randomPyraminxPatternFixedOrientation());
|
|
540
543
|
}
|
|
541
544
|
|
|
542
545
|
// src/cubing/search/inside/solve/puzzles/dynamic/sgs-unofficial/index.ts
|
|
543
|
-
var searchDynamicUnofficial = from(() => import("./search-dynamic-sgs-unofficial-
|
|
546
|
+
var searchDynamicUnofficial = from(() => import("./search-dynamic-sgs-unofficial-VKBYULK5.js"));
|
|
544
547
|
|
|
545
548
|
// src/cubing/search/inside/solve/puzzles/redi_cube.ts
|
|
546
549
|
async function randomRediCubeScramble() {
|
|
@@ -561,41 +564,41 @@ async function getCachedTrembleSolver4() {
|
|
|
561
564
|
);
|
|
562
565
|
})());
|
|
563
566
|
}
|
|
564
|
-
async function resetCenterOrientation(
|
|
565
|
-
return new
|
|
567
|
+
async function resetCenterOrientation(pattern) {
|
|
568
|
+
return new KPattern(
|
|
566
569
|
await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),
|
|
567
570
|
{
|
|
568
|
-
CORNERS:
|
|
571
|
+
CORNERS: pattern.patternData.CORNERS,
|
|
569
572
|
CENTERS: {
|
|
570
|
-
pieces:
|
|
573
|
+
pieces: pattern.patternData.CENTERS.pieces,
|
|
571
574
|
orientation: new Array(6).fill(0)
|
|
572
575
|
}
|
|
573
576
|
}
|
|
574
577
|
);
|
|
575
578
|
}
|
|
576
|
-
async function solveSkewb(
|
|
579
|
+
async function solveSkewb(pattern) {
|
|
577
580
|
mustBeInsideWorker();
|
|
578
581
|
const trembleSolver = await getCachedTrembleSolver4();
|
|
579
582
|
const alg = await trembleSolver.solve(
|
|
580
|
-
await resetCenterOrientation(
|
|
583
|
+
await resetCenterOrientation(pattern),
|
|
581
584
|
TREMBLE_DEPTH3,
|
|
582
585
|
(quantumMove) => quantumMove.family === "y" ? 4 : 3
|
|
583
586
|
// TODO: Attach quantum move order lookup to puzzle.
|
|
584
587
|
);
|
|
585
588
|
return alg;
|
|
586
589
|
}
|
|
587
|
-
async function
|
|
588
|
-
return
|
|
590
|
+
async function randomSkewbFixedCornerPattern() {
|
|
591
|
+
return randomPatternFromSGS(
|
|
589
592
|
await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),
|
|
590
593
|
await (await searchDynamicSideEvents).sgsDataSkewbFixedCorner()
|
|
591
594
|
);
|
|
592
595
|
}
|
|
593
596
|
async function randomSkewbFixedCornerScramble() {
|
|
594
|
-
return solveSkewb(await
|
|
597
|
+
return solveSkewb(await randomSkewbFixedCornerPattern());
|
|
595
598
|
}
|
|
596
599
|
|
|
597
600
|
// src/cubing/search/inside/solve/puzzles/dynamic/sq1/index.ts
|
|
598
|
-
var dynamicSq1Solver = from(() => import("./search-dynamic-solve-sq1-
|
|
601
|
+
var dynamicSq1Solver = from(() => import("./search-dynamic-solve-sq1-TO7UHE6Y.js"));
|
|
599
602
|
|
|
600
603
|
// src/cubing/search/inside/solve/puzzles/sq1.ts
|
|
601
604
|
async function getRandomSquare1Scramble() {
|
|
@@ -766,35 +769,41 @@ var insideAPI = {
|
|
|
766
769
|
randomScrambleStringForEvent: async (eventID) => {
|
|
767
770
|
return (await insideAPI.randomScrambleForEvent(eventID)).toString();
|
|
768
771
|
},
|
|
769
|
-
solve333ToString: async (
|
|
770
|
-
const
|
|
771
|
-
return (await solve333(
|
|
772
|
+
solve333ToString: async (patternData) => {
|
|
773
|
+
const pattern = new KPattern(await puzzles["3x3x3"].kpuzzle(), patternData);
|
|
774
|
+
return (await solve333(pattern)).toString();
|
|
772
775
|
},
|
|
773
|
-
solve222ToString: async (
|
|
774
|
-
const
|
|
775
|
-
return (await solve222HTMSubOptimal(
|
|
776
|
+
solve222ToString: async (patternData) => {
|
|
777
|
+
const pattern = new KPattern(await puzzles["2x2x2"].kpuzzle(), patternData);
|
|
778
|
+
return (await solve222HTMSubOptimal(pattern)).toString();
|
|
776
779
|
},
|
|
777
|
-
solveSkewbToString: async (
|
|
778
|
-
const
|
|
779
|
-
return (await solveSkewb(
|
|
780
|
+
solveSkewbToString: async (patternData) => {
|
|
781
|
+
const pattern = new KPattern(await puzzles["skewb"].kpuzzle(), patternData);
|
|
782
|
+
return (await solveSkewb(pattern)).toString();
|
|
780
783
|
},
|
|
781
|
-
solvePyraminxToString: async (
|
|
782
|
-
const
|
|
783
|
-
|
|
784
|
+
solvePyraminxToString: async (patternData) => {
|
|
785
|
+
const pattern = new KPattern(
|
|
786
|
+
await puzzles["pyraminx"].kpuzzle(),
|
|
787
|
+
patternData
|
|
788
|
+
);
|
|
789
|
+
return (await solvePyraminx(pattern)).toString();
|
|
784
790
|
},
|
|
785
|
-
solveMegaminxToString: async (
|
|
786
|
-
const
|
|
787
|
-
|
|
791
|
+
solveMegaminxToString: async (patternData) => {
|
|
792
|
+
const pattern = new KPattern(
|
|
793
|
+
await puzzles["megaminx"].kpuzzle(),
|
|
794
|
+
patternData
|
|
795
|
+
);
|
|
796
|
+
return (await solveMegaminx(pattern)).toString();
|
|
788
797
|
},
|
|
789
798
|
setDebugMeasurePerf: async (measure) => {
|
|
790
799
|
setDebugMeasurePerf(measure);
|
|
791
800
|
},
|
|
792
|
-
solveTwsearchToString: async (def,
|
|
793
|
-
return (await solveTwsearch(def,
|
|
801
|
+
solveTwsearchToString: async (def, patternData, options) => {
|
|
802
|
+
return (await solveTwsearch(def, patternData, options)).toString();
|
|
794
803
|
}
|
|
795
804
|
};
|
|
796
805
|
|
|
797
806
|
export {
|
|
798
807
|
insideAPI
|
|
799
808
|
};
|
|
800
|
-
//# sourceMappingURL=chunk-
|
|
809
|
+
//# sourceMappingURL=chunk-3RHBVKV2.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cubing/search/inside/solve/puzzles/2x2x2.ts", "../../src/cubing/search/inside/solve/tremble.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/sgs-side-events/index.ts", "../../src/cubing/search/inside/solve/twsearch.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/4x4x4/index.ts", "../../src/cubing/search/inside/solve/puzzles/4x4x4.ts", "../../src/cubing/search/inside/solve/puzzles/big-cubes.ts", "../../src/cubing/search/inside/solve/puzzles/5x5x5.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/fto/index.ts", "../../src/cubing/search/inside/solve/puzzles/fto.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/kilominx/index.ts", "../../src/cubing/search/inside/solve/puzzles/kilominx.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/master_tetraminx/index.ts", "../../src/cubing/search/inside/solve/puzzles/master_tetraminx.ts", "../../src/cubing/search/inside/solve/puzzles/megaminx.ts", "../../src/cubing/search/inside/solve/puzzles/pyraminx.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/sgs-unofficial/index.ts", "../../src/cubing/search/inside/solve/puzzles/redi_cube.ts", "../../src/cubing/search/inside/solve/puzzles/skewb.ts", "../../src/cubing/search/inside/solve/puzzles/dynamic/sq1/index.ts", "../../src/cubing/search/inside/solve/puzzles/sq1.ts", "../../src/cubing/search/inside/api.ts"],
|
|
4
|
+
"sourcesContent": ["import { Alg, Move } from \"../../../../alg\";\nimport type { KPuzzle } from \"../../../../kpuzzle\";\nimport { KPattern } from \"../../../../kpuzzle\";\nimport { cube2x2x2, puzzles } from \"../../../../puzzles\";\nimport { randomPermuteInPlace, randomUIntBelow } from \"random-uint-below\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport type { SGSCachedData } from \"../parseSGS\";\nimport { TrembleSolver } from \"../tremble\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events\";\nimport { solveTwsearch, twsearchPromise } from \"../twsearch\";\nimport { experimentalNormalize2x2x2Orientation } from \"../../../../puzzles/cubing-private\";\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const sgsCachedData: SGSCachedData = await (\n await searchDynamicSideEvents\n ).cachedData222();\n return new TrembleSolver(\n await puzzles[\"2x2x2\"].kpuzzle(),\n sgsCachedData,\n \"URFLBD\".split(\"\"),\n );\n })())\n );\n}\n\nexport async function preInitialize222(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\nexport async function solve222HTMSubOptimal(\n pattern: KPattern,\n maxDepth: number = 11,\n): Promise<Alg> {\n mustBeInsideWorker();\n return await solveTwsearch(\n (\n await cube2x2x2.kpuzzle()\n ).definition,\n pattern.patternData,\n {\n moveSubset: \"UFLR\".split(\"\"), // TODO: <U, F, R>\n maxDepth,\n },\n );\n}\n\n// TODO: fix def consistency.\n// TODO: why is this ending up with the wrong rotation sometimes?\nexport async function solve222HTMOptimal(\n pattern: KPattern,\n maxDepth: number = 11,\n): Promise<Alg> {\n mustBeInsideWorker();\n const { normalizedPattern, normalizationAlg } =\n experimentalNormalize2x2x2Orientation(pattern);\n const orientedResult = await solveTwsearch(\n (\n await cube2x2x2.kpuzzle()\n ).definition,\n normalizedPattern.patternData,\n {\n moveSubset: \"UFLR\".split(\"\"), // TODO: <U, F, R>\n maxDepth,\n },\n );\n return normalizationAlg.concat(orientedResult);\n}\n\nasync function hasHTMSolutionWithFewerMoves(\n pattern: KPattern,\n filterMin: number,\n): Promise<boolean> {\n try {\n (await solve222HTMOptimal(pattern, filterMin - 1)).log();\n return true;\n } catch (e) {\n if (e instanceof (await twsearchPromise).NoSolutionError) {\n return false;\n }\n throw e;\n }\n}\n\nfunction isCancelling(alg: Alg): boolean {\n let lastFamily: undefined | string;\n for (const node of alg.childAlgNodes()) {\n const move = node.as(Move);\n if (!move) {\n throw new Error(\"Unexpected solution with a non-move node!\");\n }\n const { family } = move;\n if (\n lastFamily &&\n ((lastFamily === \"L\" && family === \"R\") ||\n (lastFamily === \"R\" && family === \"L\"))\n ) {\n return true;\n }\n lastFamily = family;\n }\n return false;\n}\n\n// TODO: fix def consistency.\nexport async function solve222ForScramble(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n return solveTwsearch(\n (await cube2x2x2.kpuzzle()).definition,\n pattern.patternData,\n {\n moveSubset: \"UFLR\".split(\"\"),\n minDepth: 11,\n },\n );\n}\n\n// TODO: factor out and test.\nfunction mutatingRandomizeOrbit(\n kpuzzle: KPuzzle,\n orbitName: string,\n pattern: KPattern,\n options?: { orientationSum?: number },\n): void {\n randomPermuteInPlace(pattern.patternData[orbitName].pieces);\n\n const orbitDefinition = kpuzzle.lookupOrbitDefinition(orbitName);\n const ori = pattern.patternData[orbitName].orientation;\n\n let sum = 0;\n for (let i = 0; i < orbitDefinition.numPieces; i++) {\n const o = randomUIntBelow(orbitDefinition.numOrientations);\n ori[i] = o;\n sum += o;\n }\n\n // console.log(\"aaaa\", options && \"orientationSum\" in options);\n if (options && \"orientationSum\" in options) {\n // console.log(\"sfdsf\", options!.orientationSum),\n ori[0] =\n (((ori[0] + options.orientationSum! - sum) %\n orbitDefinition.numOrientations) +\n orbitDefinition.numOrientations) %\n orbitDefinition.numOrientations;\n }\n}\n\n// TODO: Use SGS?\nexport async function random222Pattern(): Promise<KPattern> {\n const kpuzzle = await puzzles[\"2x2x2\"].kpuzzle();\n const patternCopy: KPattern = new KPattern(\n kpuzzle,\n structuredClone(kpuzzle.defaultPattern().patternData),\n ); // TODO\n mutatingRandomizeOrbit(kpuzzle, \"CORNERS\", patternCopy, {\n orientationSum: 0,\n });\n return patternCopy;\n}\n\nexport async function random222Scramble(): Promise<Alg> {\n let pattern = await random222Pattern();\n while (await hasHTMSolutionWithFewerMoves(pattern, 4)) {\n console.info(\"Filtered out a 2x2x2 pattern!\");\n pattern = await random222Pattern();\n }\n\n let sol = await solve222ForScramble(pattern);\n while (isCancelling(sol)) {\n // Rely on `--randomstart` to find us a non-cancelling with \u22482/3 probability.\n // TODO: Check that this works for 100% of patterns.\n sol = await solve222ForScramble(pattern);\n }\n\n return sol;\n}\n", "import { Alg, AlgBuilder, Move, QuantumMove } from \"../../../alg\";\nimport type { KPuzzle, KTransformation } from \"../../../kpuzzle\";\nimport type { KPattern } from \"../../../kpuzzle/KPattern\";\nimport { experimentalCountMoves } from \"../../../notation\";\nimport { randomChoice } from \"random-uint-below\";\nimport type { SGSCachedData } from \"./parseSGS\";\n\nconst DEFAULT_STAGE1_DEPTH_LIMIT = 2; // Moderately performant default.\n\nconst DOUBLECHECK_PLACED_PIECES = true;\nconst DEBUG = false;\n\n// TODO: Take moves instead of move names?\nfunction calculateMoves(\n kpuzzle: KPuzzle,\n moveNames: string[],\n): {\n move: Move;\n transformation: KTransformation;\n}[] {\n const searchMoves: {\n move: Move;\n transformation: KTransformation;\n }[] = [];\n // const identity = identityTransformation(def); // TODO\n // TODO: Make it easy to filter moves.\n moveNames.forEach(function (moveName) {\n const rootMove = new Move(moveName);\n if (rootMove.amount !== 1) {\n throw new Error(\n \"SGS cannot handle def moves with an amount other than 1 yet.\",\n );\n }\n let transformation = kpuzzle.identityTransformation();\n for (let i = 1; true; i++) {\n transformation = transformation.applyMove(rootMove);\n if (transformation.isIdentityTransformation()) {\n break;\n }\n searchMoves.push({\n move: rootMove.modified({ amount: i }),\n transformation,\n });\n }\n });\n return searchMoves;\n}\n\n// function badRandomMoves(moves: string[], ksp: KSolvePuzzle): KSolvePuzzleState {\n// // var sum = 0;\n// var scramble = \"\";\n// for (var i = 0; i < 1000; i++) {\n// scramble = scramble + \" \" + moves[Math.floor(moves.length * Math.random())];\n// }\n// // var sol = \"\";\n// const indexer = new TreeAlgIndexer(ksp, Alg.fromString(scramble));\n// return indexer.transformAtIndex(indexer.numMoves()) as any; // TODO\n// }\n\nexport class TrembleSolver {\n private searchMoves: {\n move: Move;\n transformation: KTransformation;\n }[];\n\n constructor(\n private kpuzzle: KPuzzle,\n private sgs: SGSCachedData,\n trembleMoveNames?: string[],\n ) {\n this.searchMoves = calculateMoves(\n this.kpuzzle,\n trembleMoveNames ?? Object.keys(this.kpuzzle.definition.moves),\n );\n }\n\n // public badRandomMoves(): KSolvePuzzleState {\n // return badRandomMoves(this.moves, this.ksp);\n // }\n\n public async solve(\n pattern: KPattern,\n stage1DepthLimit: number = DEFAULT_STAGE1_DEPTH_LIMIT,\n quantumMoveOrder?: (quantumMove: QuantumMove) => number,\n ): Promise<Alg> {\n const transformation = pattern.experimentalToTransformation();\n if (!transformation) {\n throw new Error(\n \"distinguishable pieces are not supported in tremble solver yt\",\n );\n }\n let bestAlg: Alg | null = null;\n let bestLen = 1000000;\n const recur = (\n recursiveTransformation: KTransformation, // TODO: Support KStatq1\n togo: number,\n sofar: Alg,\n ) => {\n // console.log(\"recur\");\n if (togo === 0) {\n const sgsAlg = this.sgsPhaseSolve(recursiveTransformation, bestLen);\n if (!sgsAlg) {\n return;\n }\n // console.log(\"sgs done!\", sofar.toString(), \"|\", sgsAlg.toString());\n const newAlg = sofar.concat(sgsAlg).experimentalSimplify({\n cancel: {\n directional: \"any-direction\",\n puzzleSpecificModWrap: \"canonical-centered\",\n },\n puzzleSpecificSimplifyOptions: { quantumMoveOrder },\n });\n\n const len = experimentalCountMoves(newAlg);\n if (bestAlg === null || len < bestLen) {\n if (DEBUG) {\n console.log(`New best (${len} moves): ${newAlg.toString()}`);\n console.log(`Tremble moves are: ${sofar.toString()}`);\n }\n bestAlg = newAlg;\n bestLen = len;\n }\n return;\n }\n for (const searchMove of this.searchMoves) {\n recur(\n recursiveTransformation.applyTransformation(\n searchMove.transformation,\n ),\n togo - 1,\n sofar.concat([searchMove.move]),\n );\n }\n };\n for (let d = 0; d <= stage1DepthLimit; d++) {\n recur(transformation, d, new Alg());\n }\n if (bestAlg === null) {\n throw new Error(\"SGS search failed.\");\n }\n return bestAlg;\n }\n\n private sgsPhaseSolve(\n initialTransformation: KTransformation, // TODO: Handle KPattern\n bestLenSofar: number,\n ): Alg | null {\n // const pieceNames = \"UFR URB UBL ULF DRF DFL DLB DBR\".split(\" \");\n\n // function loggo(s: string) {\n // // console.warn(s);\n // // document.body.appendChild(document.createElement(\"div\")).textContent = s;\n // }\n\n // console.log(\"sgsPhaseSolve\");\n const algBuilder = new AlgBuilder();\n let transformation = initialTransformation;\n for (const step of this.sgs.ordering) {\n const cubieSeq = step.pieceOrdering;\n let key = \"\";\n const inverseTransformation = transformation.invert();\n for (let i = 0; i < cubieSeq.length; i++) {\n const loc = cubieSeq[i];\n const orbitName = loc.orbitName;\n const idx = loc.permutationIdx;\n key += ` ${inverseTransformation.transformationData[orbitName].permutation[idx]} ${inverseTransformation.transformationData[orbitName].orientationDelta[idx]}`;\n }\n // console.log(key, step.lookup);\n const info = step.lookup[key];\n if (!info) {\n throw new Error(\"Missing algorithm in sgs or esgs?\");\n }\n algBuilder.experimentalPushAlg(info.alg);\n if (algBuilder.experimentalNumAlgNodes() >= bestLenSofar) {\n return null;\n }\n transformation = transformation.applyTransformation(info.transformation);\n if (DOUBLECHECK_PLACED_PIECES) {\n for (let i = 0; i < cubieSeq.length; i++) {\n const location = cubieSeq[i];\n const orbitName = location.orbitName;\n const idx = location.permutationIdx;\n if (\n transformation.transformationData[orbitName].permutation[idx] !==\n idx ||\n transformation.transformationData[orbitName].orientationDelta[\n idx\n ] !== 0\n ) {\n throw new Error(\"bad SGS :-(\");\n }\n }\n }\n }\n return algBuilder.toAlg();\n }\n}\n\nexport function randomPatternFromSGS(\n kpuzzle: KPuzzle,\n sgs: SGSCachedData,\n): KPattern {\n let transformation = kpuzzle.identityTransformation();\n for (const step of sgs.ordering) {\n const sgsAction = randomChoice(Object.values(step.lookup));\n transformation = transformation.applyTransformation(\n sgsAction.transformation,\n );\n }\n return transformation.toKPattern();\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const searchDynamicSideEvents = from<\n typeof import(\"./search-dynamic-sgs-side-events\")\n>(() => import(\"./search-dynamic-sgs-side-events\"));\n", "import type { Alg } from \"../../../alg\";\nimport {\n KPuzzle,\n type KPuzzleDefinition,\n type KPatternData,\n type KTransformationData,\n} from \"../../../kpuzzle\";\nimport { from } from \"../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const twsearchPromise: Promise<\n typeof import(\"../../../vendor/mpl/twsearch\")\n> = from(async () => import(\"../../../vendor/mpl/twsearch\"));\n\nexport interface TwsearchOptions {\n moveSubset?: string[];\n startPattern?: KTransformationData;\n minDepth?: number;\n maxDepth?: number;\n}\n\nlet existingPuzzleDefString: undefined | string;\nlet existingMoveSubsetString: undefined | string;\n\nfunction mustBeNaturalNumber(meaning: string, n: number): void {\n if (typeof n !== \"number\" || !Number.isInteger(n) || n < 0) {\n throw new Error(`Invalid ${meaning}: ${n}`);\n }\n}\n\nexport async function solveTwsearch(\n def: KPuzzleDefinition,\n patternData: KPatternData,\n options?: TwsearchOptions,\n): Promise<Alg> {\n const {\n setArg,\n setKPuzzleDefString,\n serializeDefToTws,\n solvePattern,\n serializeScramblePattern,\n } = await twsearchPromise;\n const kpuzzle = new KPuzzle(def);\n setArg(\"--startprunedepth 5\"); // TODO\n let moveSubsetString = \"\"; // TODO: pass the full set of moves, to avoid rotations not being treated as moves.\n if (options) {\n if (options.moveSubset) {\n moveSubsetString = options?.moveSubset?.join(\",\");\n // TODO: better, reusable validation\n if (moveSubsetString.includes(\" \")) {\n throw new Error(\"A move contains a space\u203D\");\n }\n if (moveSubsetString.includes(\"-\")) {\n throw new Error(\"A move contains a dash\");\n }\n setArg(`--moves ${moveSubsetString}`); // TODO: remove the need for this.\n }\n let { minDepth, maxDepth } = options;\n if (typeof minDepth !== \"undefined\") {\n mustBeNaturalNumber(\"minDepth\", minDepth);\n if (typeof maxDepth !== \"undefined\") {\n mustBeNaturalNumber(\"maxDepth\", maxDepth);\n } else {\n maxDepth = 1000000;\n }\n\n setArg(\"--randomstart\");\n setArg(`--mindepth ${minDepth}`);\n setArg(`--maxdepth ${maxDepth}`);\n } else if (typeof maxDepth !== \"undefined\") {\n mustBeNaturalNumber(\"maxDepth\", maxDepth);\n setArg(\"--mindepth 0\");\n setArg(`--maxdepth ${maxDepth}`);\n }\n }\n\n const puzzleDefString = serializeDefToTws(kpuzzle, options);\n if (existingPuzzleDefString) {\n if (existingPuzzleDefString !== puzzleDefString) {\n throw new Error(\n \"Attempted to solve two puzzles in the same worker using `twsearch`. This is not currently supported!\",\n );\n }\n } else {\n existingPuzzleDefString = puzzleDefString;\n await setKPuzzleDefString(puzzleDefString);\n }\n\n if (\n typeof existingMoveSubsetString !== \"undefined\" &&\n moveSubsetString !== existingMoveSubsetString\n ) {\n throw new Error(\n \"Attempted to solve two different move subsets in the same worker using `twsearch`. This is not currently supported!\",\n );\n }\n\n return await solvePattern(\n serializeScramblePattern(\"SearchState\", patternData),\n );\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const dynamic4x4x4Solver = from<\n typeof import(\"./search-dynamic-solve-4x4x4\")\n>(() => import(\"./search-dynamic-solve-4x4x4\"));\n", "import type { Alg } from \"../../../../alg\";\nimport { addOrientationSuffix } from \"../addOrientationSuffix\";\nimport { dynamic4x4x4Solver } from \"./dynamic/4x4x4\";\n\nconst randomSuffixes = [\n [null, \"x\", \"x2\", \"x'\", \"z\", \"z'\"],\n [null, \"y\", \"y2\", \"y'\"],\n];\n\nexport async function initialize444(): Promise<void> {\n return (await dynamic4x4x4Solver).initialize();\n}\n\nexport async function random444Scramble(): Promise<Alg> {\n return (await dynamic4x4x4Solver).random444Scramble();\n}\n\nexport async function random444OrientedScramble(): Promise<Alg> {\n return addOrientationSuffix(await random444Scramble(), randomSuffixes);\n}\n", "import { Alg, AlgBuilder, Move, QuantumMove } from \"../../../../alg\";\nimport { randomChoice, randomUIntBelow } from \"random-uint-below\";\n\nfunction numMoves(n: number): number {\n switch (n) {\n case 5:\n return 60;\n case 6:\n return 80;\n default:\n return 100;\n }\n}\n\nconst axesFaces = [\n [\"U\", \"D\"],\n [\"L\", \"R\"],\n [\"F\", \"B\"],\n];\nconst axesMovesCache: Map<number, QuantumMove[][]> = new Map();\nfunction cachedAxesMoves(n: number): QuantumMove[][] {\n const existing = axesMovesCache.get(n);\n if (existing) {\n return existing;\n }\n const axesMoves = [];\n for (const faces of axesFaces) {\n const axisMoveFamilies: QuantumMove[] = [];\n axesMoves.push(axisMoveFamilies);\n\n for (const face of faces) {\n axisMoveFamilies.push(new QuantumMove(face));\n if (n > 3) {\n axisMoveFamilies.push(new QuantumMove(`${face}w`));\n }\n for (let i = 3; i <= n / 2; i++) {\n axisMoveFamilies.push(new QuantumMove(`${face}w`, i));\n }\n }\n }\n axesMovesCache.set(n, axesMoves);\n return axesMoves;\n}\n\n// TODO: Document this algorithm and compare to TNoodle.\nexport async function bigCubeRandomMoves(n: number): Promise<Alg> {\n const axesMoves = cachedAxesMoves(n);\n\n const cachedNumMoves = numMoves(n);\n const algBuilder = new AlgBuilder();\n let currentAxisIdx = 0;\n const currentAxisQuantumMoves = new Set();\n while (algBuilder.experimentalNumAlgNodes() < cachedNumMoves) {\n const newAxisIdx = randomUIntBelow(3);\n if (newAxisIdx !== currentAxisIdx) {\n currentAxisQuantumMoves.clear();\n }\n currentAxisIdx = newAxisIdx;\n\n const quantumMove = randomChoice(axesMoves[currentAxisIdx]);\n const quantumMoveStr = quantumMove.toString();\n if (currentAxisQuantumMoves.has(quantumMoveStr)) {\n // Skip duplicates and resample with replacement.\n continue;\n }\n currentAxisQuantumMoves.add(quantumMoveStr);\n algBuilder.push(new Move(quantumMove, randomChoice([1, 2, -1])));\n }\n\n return algBuilder.toAlg();\n}\n", "import type { Alg } from \"../../../../alg\";\nimport { addOrientationSuffix } from \"../addOrientationSuffix\";\nimport { bigCubeRandomMoves } from \"./big-cubes\";\n\nconst randomSuffixes = [\n [null, \"3Rw\", \"3Rw2\", \"3Rw'\", \"3Fw\", \"3Fw'\"],\n [null, \"3Dw\", \"3Dw2\", \"3Dw'\"],\n];\n\nexport async function oriented555RandomMoves(): Promise<Alg> {\n return addOrientationSuffix(await bigCubeRandomMoves(5), randomSuffixes);\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const dynamicFTOSolver = from<\n typeof import(\"./search-dynamic-solve-fto\")\n>(() => import(\"./search-dynamic-solve-fto\"));\n", "import { Alg } from \"../../../../alg\";\nimport type { KPattern } from \"../../../../kpuzzle/KPattern\";\nimport { puzzles } from \"../../../../puzzles\";\nimport { from } from \"../../../../vendor/mit/p-lazy/p-lazy\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport type { SGSCachedData } from \"../parseSGS\";\nimport { TrembleSolver } from \"../tremble\";\nimport { dynamicFTOSolver } from \"./dynamic/fto\";\n\nconst dynamic = from<\n typeof import(\"./dynamic/sgs-unofficial/search-dynamic-sgs-unofficial\")\n>(() => import(\"./dynamic/sgs-unofficial/search-dynamic-sgs-unofficial\"));\n\nconst TREMBLE_DEPTH = 3;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (await dynamic).sgsDataFTO();\n return new TrembleSolver(await puzzles[\"fto\"].kpuzzle(), json, [\n \"U\",\n \"R\",\n \"F\",\n \"L\",\n \"D\",\n \"B\",\n \"BR\",\n \"BL\",\n ]);\n })())\n );\n}\n\nexport async function preInitializeFTO(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\n// TODO: centers\nexport async function solveFTO(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const alg = await trembleSolver.solve(\n pattern,\n TREMBLE_DEPTH,\n () => 3, // TODO: Attach quantum move order lookup to puzzle.\n );\n return alg;\n}\n\nexport async function randomFTOScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return new Alg(await (await dynamicFTOSolver).randomFTOScrambleString());\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const dynamicKilominxSolver = from<\n typeof import(\"./search-dynamic-solve-kilominx\")\n>(() => import(\"./search-dynamic-solve-kilominx\"));\n", "import type { Alg } from \"../../../../alg\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport { dynamicKilominxSolver } from \"./dynamic/kilominx\";\n\nexport async function randomKilominxScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return (await dynamicKilominxSolver).getRandomKilominxScramble();\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const dynamicMasterTetraminxSolver = from<\n typeof import(\"./search-dynamic-solve-master_tetraminx\")\n>(() => import(\"./search-dynamic-solve-master_tetraminx\"));\n", "import { Alg } from \"../../../../alg\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport { dynamicMasterTetraminxSolver } from \"./dynamic/master_tetraminx\";\n\nexport async function randomMasterTetraminxScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return new Alg(\n await (\n await dynamicMasterTetraminxSolver\n ).randomMasterTetraminxScrambleString(),\n );\n}\n", "import type { Alg } from \"../../../../alg\";\nimport type { KPatternData } from \"../../../../kpuzzle\";\nimport { KPattern } from \"../../../../kpuzzle\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport type { SGSCachedData } from \"../parseSGS\";\nimport { TrembleSolver } from \"../tremble\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events\";\n\nconst TREMBLE_DEPTH = 2;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (\n await searchDynamicSideEvents\n ).cachedSGSDataMegaminx();\n return new TrembleSolver(\n await (await searchDynamicSideEvents).cachedMegaminxKPuzzleWithoutMO(),\n json,\n [\"U\", \"R\", \"F\", \"L\", \"BR\", \"BL\", \"FR\", \"FL\", \"DR\", \"DL\", \"B\", \"D\"],\n );\n })())\n );\n}\n\nexport async function preInitializeMegaminx(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\n// TODO: centers\nexport async function solveMegaminx(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const patternDataWithoutMO: KPatternData = structuredClone(\n pattern.patternData,\n );\n patternDataWithoutMO.CENTERS.orientation = new Array(12).fill(0);\n const patternWithoutMO = new KPattern(\n await (await searchDynamicSideEvents).cachedMegaminxKPuzzleWithoutMO(),\n patternDataWithoutMO,\n );\n const alg = await trembleSolver.solve(\n patternWithoutMO,\n TREMBLE_DEPTH,\n () => 5, // TODO: Attach quantum move order lookup to puzzle.\n );\n return alg;\n}\n", "import type { Alg } from \"../../../../alg\";\nimport type { KPattern } from \"../../../../kpuzzle/KPattern\";\nimport { puzzles } from \"../../../../puzzles\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport type { SGSCachedData } from \"../parseSGS\";\nimport { randomPatternFromSGS, TrembleSolver } from \"../tremble\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events\";\n\nconst TREMBLE_DEPTH = 3;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (\n await searchDynamicSideEvents\n ).sgsDataPyraminx();\n return new TrembleSolver(\n await puzzles.pyraminx.kpuzzle(),\n json,\n \"RLUB\".split(\"\"),\n );\n })())\n );\n}\n\nexport async function preInitializePyraminx(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\nexport async function solvePyraminx(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const alg = await trembleSolver.solve(pattern, TREMBLE_DEPTH, () => 3); // TODO: Attach quantum move order lookup to puzzle.\n return alg;\n}\n\nexport async function randomPyraminxPatternFixedOrientation(): Promise<KPattern> {\n mustBeInsideWorker();\n // Note: this sets all center orientations to 0.\n return randomPatternFromSGS(\n await puzzles.pyraminx.kpuzzle(),\n await (await searchDynamicSideEvents).sgsDataPyraminxFixedOrientation(),\n );\n}\n\nexport async function randomPyraminxScrambleFixedOrientation(): Promise<Alg> {\n return solvePyraminx(await randomPyraminxPatternFixedOrientation());\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const searchDynamicUnofficial = from<\n typeof import(\"./search-dynamic-sgs-unofficial\")\n>(() => import(\"./search-dynamic-sgs-unofficial\"));\n", "import type { Alg } from \"../../../../alg\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport { searchDynamicUnofficial } from \"./dynamic/sgs-unofficial\";\n\nexport async function randomRediCubeScramble(): Promise<Alg> {\n mustBeInsideWorker();\n return (await searchDynamicUnofficial).getRandomRediCubeScramble();\n}\n", "import type { Alg, QuantumMove } from \"../../../../alg\";\nimport { KPattern } from \"../../../../kpuzzle\";\nimport { mustBeInsideWorker } from \"../../inside-worker\";\nimport type { SGSCachedData } from \"../parseSGS\";\nimport { randomPatternFromSGS, TrembleSolver } from \"../tremble\";\nimport { searchDynamicSideEvents } from \"./dynamic/sgs-side-events\";\n\nconst TREMBLE_DEPTH = 3;\n\nlet cachedTrembleSolver: Promise<TrembleSolver> | null = null;\nasync function getCachedTrembleSolver(): Promise<TrembleSolver> {\n return (\n cachedTrembleSolver ||\n (cachedTrembleSolver = (async (): Promise<TrembleSolver> => {\n const json: SGSCachedData = await (\n await searchDynamicSideEvents\n ).sgsDataSkewb();\n return new TrembleSolver(\n await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),\n json,\n \"RLUB\".split(\"\"),\n );\n })())\n );\n}\n\nexport async function preInitializeSkewb(): Promise<void> {\n await getCachedTrembleSolver();\n}\n\nasync function resetCenterOrientation(pattern: KPattern): Promise<KPattern> {\n return new KPattern(\n await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),\n {\n CORNERS: pattern.patternData.CORNERS,\n CENTERS: {\n pieces: pattern.patternData.CENTERS.pieces,\n orientation: new Array(6).fill(0),\n },\n },\n );\n}\n\n// TODO: fix def consistency.\nexport async function solveSkewb(pattern: KPattern): Promise<Alg> {\n mustBeInsideWorker();\n const trembleSolver = await getCachedTrembleSolver();\n const alg = await trembleSolver.solve(\n await resetCenterOrientation(pattern),\n TREMBLE_DEPTH,\n (quantumMove: QuantumMove) => (quantumMove.family === \"y\" ? 4 : 3), // TODO: Attach quantum move order lookup to puzzle.\n );\n return alg;\n}\n\nexport async function randomSkewbFixedCornerPattern(): Promise<KPattern> {\n // Note: this sets all center orientations to 0.\n return randomPatternFromSGS(\n await (await searchDynamicSideEvents).skewbKPuzzleWithoutMOCached(),\n await (await searchDynamicSideEvents).sgsDataSkewbFixedCorner(),\n );\n}\n\nexport async function randomSkewbFixedCornerScramble(): Promise<Alg> {\n return solveSkewb(await randomSkewbFixedCornerPattern());\n}\n", "import { from } from \"../../../../../../vendor/mit/p-lazy/p-lazy\";\n\nexport const dynamicSq1Solver = from<\n typeof import(\"./search-dynamic-solve-sq1\")\n>(() => import(\"./search-dynamic-solve-sq1\"));\n", "import { Alg } from \"../../../../alg\";\nimport { dynamicSq1Solver } from \"./dynamic/sq1\";\n\nexport async function getRandomSquare1Scramble(): Promise<Alg> {\n return Alg.fromString(\n await (await dynamicSq1Solver).getRandomSquare1ScrambleString(),\n );\n}\n", "import type { Alg } from \"../../alg\";\nimport {\n type KPuzzleDefinition,\n KPattern,\n type KPatternData,\n} from \"../../kpuzzle\";\nimport { puzzles } from \"../../puzzles\";\nimport { setIsInsideWorker } from \"./inside-worker\";\nimport {\n preInitialize222,\n random222Scramble,\n solve222HTMSubOptimal,\n} from \"./solve/puzzles/2x2x2\";\nimport {\n initialize333,\n random333FewestMovesScramble,\n random333OrientedScramble,\n random333Scramble,\n solve333,\n} from \"./solve/puzzles/3x3x3\";\nimport {\n initialize444,\n random444OrientedScramble,\n random444Scramble,\n} from \"./solve/puzzles/4x4x4\";\nimport { oriented555RandomMoves } from \"./solve/puzzles/5x5x5\";\nimport { bigCubeRandomMoves } from \"./solve/puzzles/big-cubes\";\nimport { randomFTOScramble } from \"./solve/puzzles/fto\";\nimport { randomKilominxScramble } from \"./solve/puzzles/kilominx\";\nimport { randomMasterTetraminxScramble } from \"./solve/puzzles/master_tetraminx\";\nimport { solveMegaminx } from \"./solve/puzzles/megaminx\";\nimport {\n randomPyraminxScrambleFixedOrientation,\n solvePyraminx,\n} from \"./solve/puzzles/pyraminx\";\nimport { randomRediCubeScramble } from \"./solve/puzzles/redi_cube\";\nimport {\n randomSkewbFixedCornerScramble,\n solveSkewb,\n} from \"./solve/puzzles/skewb\";\nimport { getRandomSquare1Scramble } from \"./solve/puzzles/sq1\";\nimport { solveTwsearch, type TwsearchOptions } from \"./solve/twsearch\";\n\nconst IDLE_PREFETCH_TIMEOUT_MS = 1000;\n\nsetIsInsideWorker(true);\n\nlet DEBUG_MEASURE_PERF = true;\nexport function setDebugMeasurePerf(newDebugMeasurePerf: boolean): void {\n DEBUG_MEASURE_PERF = newDebugMeasurePerf;\n}\n\nfunction now() {\n return (typeof performance === \"undefined\" ? Date : performance).now();\n}\n\nasync function measurePerf<T>(\n name: string,\n f: () => T | Promise<T>,\n options?: { isPrefetch?: boolean },\n): Promise<T> {\n if (!DEBUG_MEASURE_PERF) {\n return f();\n }\n\n const start = now();\n const result = f();\n if ((result as any)?.then) {\n await result;\n }\n const end = now();\n console.warn(\n `${name}${options?.isPrefetch ? \" (prefetched)\" : \"\"}: ${Math.round(\n end - start,\n )}ms`,\n );\n return result;\n}\n\nconst prefetchPromises: Map<string, Promise<Alg>> = new Map();\n// This would just be a number, except `node` is extremely silly and returns an object instead.\n// https://nodejs.org/api/timers.html#settimeoutcallback-delay-args\nlet queuedPrefetchTimeoutID: ReturnType<typeof setTimeout> | null = null;\n\nasync function randomScrambleForEvent(\n eventID: string,\n options?: { isPrefetch?: boolean },\n): Promise<Alg> {\n switch (eventID) {\n case \"222\":\n return measurePerf(\"random222Scramble\", random222Scramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"333\":\n case \"333oh\":\n case \"333ft\":\n return measurePerf(\"random333Scramble\", random333Scramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"333fm\":\n return measurePerf(\n \"random333FewestMovesScramble\",\n random333FewestMovesScramble,\n );\n case \"333bf\":\n case \"333mb\":\n return measurePerf(\n \"random333OrientedScramble\",\n random333OrientedScramble,\n );\n case \"444\":\n return measurePerf(\"random444Scramble\", random444Scramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"444bf\":\n return measurePerf(\n \"random444OrientedScramble\",\n random444OrientedScramble,\n );\n case \"555\":\n return measurePerf(\n \"bigCubeScramble(5)\",\n bigCubeRandomMoves.bind(bigCubeRandomMoves, 5),\n );\n case \"555bf\":\n return measurePerf(\"oriented555RandomMoves\", oriented555RandomMoves);\n case \"666\":\n return measurePerf(\n \"bigCubeScramble(6)\",\n bigCubeRandomMoves.bind(bigCubeRandomMoves, 6),\n );\n case \"777\":\n return measurePerf(\n \"bigCubeScramble(7)\",\n bigCubeRandomMoves.bind(bigCubeRandomMoves, 7),\n );\n case \"skewb\":\n return measurePerf(\n \"randomSkewbFixedCornerScramble\",\n randomSkewbFixedCornerScramble,\n );\n case \"pyram\":\n return measurePerf(\n \"randomPyraminxScrambleFixedOrientation\",\n randomPyraminxScrambleFixedOrientation,\n );\n case \"sq1\":\n return measurePerf(\"getRandomSquare1Scramble\", getRandomSquare1Scramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"fto\":\n return measurePerf(\"randomFTOScramble\", randomFTOScramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"master_tetraminx\":\n return measurePerf(\n \"randomMasterTetraminxScramble\",\n randomMasterTetraminxScramble,\n );\n case \"kilominx\":\n return measurePerf(\"randomKilominxScramble\", randomKilominxScramble, {\n isPrefetch: options?.isPrefetch,\n });\n case \"redi_cube\":\n return measurePerf(\"randomRediCubeScramble\", randomRediCubeScramble, {\n isPrefetch: options?.isPrefetch,\n });\n default:\n throw new Error(`unsupported event: ${eventID}`);\n }\n}\n\nexport enum PrefetchLevel {\n Auto = \"auto\",\n None = \"none\",\n Immediate = \"immediate\",\n}\n\nlet currentPrefetchLevel = PrefetchLevel.Auto;\n\nexport const insideAPI = {\n initialize: async (eventID: string) => {\n switch (eventID) {\n case \"222\":\n return measurePerf(\"preInitialize222\", preInitialize222);\n case \"333\":\n case \"333oh\":\n case \"333ft\":\n return measurePerf(\"initialize333\", initialize333);\n case \"444\":\n return measurePerf(\"initialize444\", initialize444);\n default:\n throw new Error(`unsupported event: ${eventID}`);\n }\n },\n\n setScramblePrefetchLevel(prefetchLevel: `${PrefetchLevel}`) {\n currentPrefetchLevel = prefetchLevel as PrefetchLevel;\n },\n\n randomScrambleForEvent: async (eventID: string): Promise<Alg> => {\n let promise = prefetchPromises.get(eventID);\n if (promise) {\n prefetchPromises.delete(eventID);\n } else {\n promise = randomScrambleForEvent(eventID);\n }\n if (currentPrefetchLevel !== PrefetchLevel.None) {\n promise.then(() => {\n // `queuedPrefetch` could be 0, but:\n // > Passing an invalid ID to clearTimeout() silently does nothing; no exception is thrown.\n // https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout#notes\n if (queuedPrefetchTimeoutID) {\n clearTimeout(queuedPrefetchTimeoutID);\n }\n queuedPrefetchTimeoutID = setTimeout(\n () => {\n prefetchPromises.set(\n eventID,\n randomScrambleForEvent(eventID, {\n isPrefetch: true,\n }),\n );\n },\n currentPrefetchLevel === PrefetchLevel.Immediate\n ? 0\n : IDLE_PREFETCH_TIMEOUT_MS,\n );\n });\n }\n return promise;\n },\n\n randomScrambleStringForEvent: async (eventID: string): Promise<string> => {\n return (await insideAPI.randomScrambleForEvent(eventID)).toString();\n },\n\n solve333ToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(await puzzles[\"3x3x3\"].kpuzzle(), patternData);\n return (await solve333(pattern)).toString();\n },\n\n solve222ToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(await puzzles[\"2x2x2\"].kpuzzle(), patternData);\n return (await solve222HTMSubOptimal(pattern)).toString();\n },\n\n solveSkewbToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(await puzzles[\"skewb\"].kpuzzle(), patternData);\n return (await solveSkewb(pattern)).toString();\n },\n\n solvePyraminxToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(\n await puzzles[\"pyraminx\"].kpuzzle(),\n patternData,\n );\n return (await solvePyraminx(pattern)).toString();\n },\n\n solveMegaminxToString: async (patternData: KPatternData): Promise<string> => {\n const pattern = new KPattern(\n await puzzles[\"megaminx\"].kpuzzle(),\n patternData,\n );\n return (await solveMegaminx(pattern)).toString();\n },\n\n setDebugMeasurePerf: async (measure: boolean): Promise<void> => {\n setDebugMeasurePerf(measure);\n },\n\n solveTwsearchToString: async (\n def: KPuzzleDefinition,\n patternData: KPatternData,\n options?: TwsearchOptions,\n ): Promise<string> => {\n return (await solveTwsearch(def, patternData, options)).toString();\n },\n};\n\nexport type WorkerInsideAPI = typeof insideAPI;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["randomChoice", "randomUIntBelow", "randomSuffixes", "cachedTrembleSolver", "getCachedTrembleSolver", "getCachedTrembleSolver", "TREMBLE_DEPTH", "cachedTrembleSolver", "getCachedTrembleSolver", "getCachedTrembleSolver", "TREMBLE_DEPTH", "TREMBLE_DEPTH", "cachedTrembleSolver", "getCachedTrembleSolver", "getCachedTrembleSolver", "TREMBLE_DEPTH"]
|
|
7
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cube3x3x3KPuzzleDefinition
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-H66X47MG.js";
|
|
4
4
|
import {
|
|
5
5
|
TraversalUp,
|
|
6
6
|
functionFromTraversal
|
|
@@ -42,9 +42,7 @@ function getCache() {
|
|
|
42
42
|
cache = {};
|
|
43
43
|
const moveQuantumStrings = [
|
|
44
44
|
...Object.keys(cube3x3x3KPuzzleDefinition.moves),
|
|
45
|
-
...Object.keys(
|
|
46
|
-
cube3x3x3KPuzzleDefinition.experimentalDerivedMoves
|
|
47
|
-
)
|
|
45
|
+
...Object.keys(cube3x3x3KPuzzleDefinition.derivedMoves)
|
|
48
46
|
];
|
|
49
47
|
for (const moveQuantumString of moveQuantumStrings) {
|
|
50
48
|
cache[moveQuantumString] = uncachedMoveCount(moveQuantumString);
|
|
@@ -230,4 +228,4 @@ export {
|
|
|
230
228
|
countMetricMoves,
|
|
231
229
|
countAnimatedLeaves
|
|
232
230
|
};
|
|
233
|
-
//# sourceMappingURL=chunk-
|
|
231
|
+
//# sourceMappingURL=chunk-6FC7BO5U.js.map
|