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
|
@@ -8,81 +8,79 @@ import {
|
|
|
8
8
|
// src/cubing/kpuzzle/combine.ts
|
|
9
9
|
function combineTransformationData(definition, transformationData1, transformationData2) {
|
|
10
10
|
const newTransformationData = {};
|
|
11
|
-
for (const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const orbit2 = transformationData2[orbitName];
|
|
11
|
+
for (const orbitDefinition of definition.orbits) {
|
|
12
|
+
const orbit1 = transformationData1[orbitDefinition.orbitName];
|
|
13
|
+
const orbit2 = transformationData2[orbitDefinition.orbitName];
|
|
15
14
|
if (isOrbitTransformationDataIdentityUncached(
|
|
16
15
|
orbitDefinition.numOrientations,
|
|
17
16
|
orbit2
|
|
18
17
|
)) {
|
|
19
|
-
newTransformationData[orbitName] = orbit1;
|
|
18
|
+
newTransformationData[orbitDefinition.orbitName] = orbit1;
|
|
20
19
|
} else if (isOrbitTransformationDataIdentityUncached(
|
|
21
20
|
orbitDefinition.numOrientations,
|
|
22
21
|
orbit1
|
|
23
22
|
)) {
|
|
24
|
-
newTransformationData[orbitName] = orbit2;
|
|
23
|
+
newTransformationData[orbitDefinition.orbitName] = orbit2;
|
|
25
24
|
} else {
|
|
26
25
|
const newPerm = new Array(orbitDefinition.numPieces);
|
|
27
26
|
if (orbitDefinition.numOrientations === 1) {
|
|
28
27
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
29
28
|
newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];
|
|
30
29
|
}
|
|
31
|
-
newTransformationData[orbitName] = {
|
|
30
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
32
31
|
permutation: newPerm,
|
|
33
|
-
|
|
32
|
+
orientationDelta: orbit1.orientationDelta
|
|
34
33
|
};
|
|
35
34
|
} else {
|
|
36
35
|
const newOri = new Array(orbitDefinition.numPieces);
|
|
37
36
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
38
|
-
newOri[idx] = (orbit1.
|
|
37
|
+
newOri[idx] = (orbit1.orientationDelta[orbit2.permutation[idx]] + orbit2.orientationDelta[idx]) % orbitDefinition.numOrientations;
|
|
39
38
|
newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];
|
|
40
39
|
}
|
|
41
|
-
newTransformationData[orbitName] = {
|
|
40
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
42
41
|
permutation: newPerm,
|
|
43
|
-
|
|
42
|
+
orientationDelta: newOri
|
|
44
43
|
};
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
return newTransformationData;
|
|
49
48
|
}
|
|
50
|
-
function
|
|
51
|
-
const
|
|
52
|
-
for (const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
const transformationOrbit = transformationData[orbitName];
|
|
49
|
+
function applyTransformationDataToKPatternData(definition, patternData, transformationData) {
|
|
50
|
+
const newPatternData = {};
|
|
51
|
+
for (const orbitDefinition of definition.orbits) {
|
|
52
|
+
const patternOrbit = patternData[orbitDefinition.orbitName];
|
|
53
|
+
const transformationOrbit = transformationData[orbitDefinition.orbitName];
|
|
56
54
|
if (isOrbitTransformationDataIdentityUncached(
|
|
57
55
|
orbitDefinition.numOrientations,
|
|
58
56
|
transformationOrbit
|
|
59
57
|
)) {
|
|
60
|
-
|
|
58
|
+
newPatternData[orbitDefinition.orbitName] = patternOrbit;
|
|
61
59
|
} else {
|
|
62
60
|
const newPieces = new Array(orbitDefinition.numPieces);
|
|
63
61
|
if (orbitDefinition.numOrientations === 1) {
|
|
64
62
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
65
|
-
newPieces[idx] =
|
|
63
|
+
newPieces[idx] = patternOrbit.pieces[transformationOrbit.permutation[idx]];
|
|
66
64
|
}
|
|
67
65
|
const newOrbitData = {
|
|
68
66
|
pieces: newPieces,
|
|
69
|
-
orientation:
|
|
67
|
+
orientation: patternOrbit.orientation
|
|
70
68
|
// copy all 0
|
|
71
69
|
};
|
|
72
|
-
|
|
70
|
+
newPatternData[orbitDefinition.orbitName] = newOrbitData;
|
|
73
71
|
} else {
|
|
74
72
|
const newOrientation = new Array(orbitDefinition.numPieces);
|
|
75
|
-
const newOrientationMod =
|
|
73
|
+
const newOrientationMod = patternOrbit.orientationMod ? new Array(orbitDefinition.numPieces) : void 0;
|
|
76
74
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
77
75
|
const transformationIdx = transformationOrbit.permutation[idx];
|
|
78
76
|
let mod = orbitDefinition.numOrientations;
|
|
79
|
-
if (
|
|
80
|
-
const orientationMod =
|
|
77
|
+
if (patternOrbit.orientationMod) {
|
|
78
|
+
const orientationMod = patternOrbit.orientationMod[transformationIdx];
|
|
81
79
|
newOrientationMod[idx] = orientationMod;
|
|
82
80
|
mod = orientationMod || orbitDefinition.numOrientations;
|
|
83
81
|
}
|
|
84
|
-
newOrientation[idx] = (
|
|
85
|
-
newPieces[idx] =
|
|
82
|
+
newOrientation[idx] = (patternOrbit.orientation[transformationIdx] + transformationOrbit.orientationDelta[idx]) % mod;
|
|
83
|
+
newPieces[idx] = patternOrbit.pieces[transformationIdx];
|
|
86
84
|
}
|
|
87
85
|
const newOrbitData = {
|
|
88
86
|
pieces: newPieces,
|
|
@@ -91,11 +89,11 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
|
|
|
91
89
|
if (newOrientationMod) {
|
|
92
90
|
newOrbitData.orientationMod = newOrientationMod;
|
|
93
91
|
}
|
|
94
|
-
|
|
92
|
+
newPatternData[orbitDefinition.orbitName] = newOrbitData;
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
}
|
|
98
|
-
return
|
|
96
|
+
return newPatternData;
|
|
99
97
|
}
|
|
100
98
|
|
|
101
99
|
// src/cubing/kpuzzle/construct.ts
|
|
@@ -114,7 +112,7 @@ function constructIdentityOrbitTransformation(numPieces) {
|
|
|
114
112
|
}
|
|
115
113
|
const orbitTransformation = {
|
|
116
114
|
permutation: newPermutation,
|
|
117
|
-
|
|
115
|
+
orientationDelta: newOrientation
|
|
118
116
|
};
|
|
119
117
|
if (FREEZE) {
|
|
120
118
|
Object.freeze(newPermutation);
|
|
@@ -126,12 +124,8 @@ function constructIdentityOrbitTransformation(numPieces) {
|
|
|
126
124
|
}
|
|
127
125
|
function constructIdentityTransformationDataUncached(definition) {
|
|
128
126
|
const transformation = {};
|
|
129
|
-
for (const
|
|
130
|
-
|
|
131
|
-
)) {
|
|
132
|
-
transformation[orbitName] = constructIdentityOrbitTransformation(
|
|
133
|
-
orbitDefinition.numPieces
|
|
134
|
-
);
|
|
127
|
+
for (const orbitDefinition of definition.orbits) {
|
|
128
|
+
transformation[orbitDefinition.orbitName] = constructIdentityOrbitTransformation(orbitDefinition.numPieces);
|
|
135
129
|
}
|
|
136
130
|
if (FREEZE) {
|
|
137
131
|
Object.freeze(transformation);
|
|
@@ -142,7 +136,7 @@ function moveToTransformationUncached(kpuzzle, move) {
|
|
|
142
136
|
const quantumKey = move.quantum.toString();
|
|
143
137
|
let quantumMoveDefinition = kpuzzle.definition.moves[quantumKey];
|
|
144
138
|
if (!quantumMoveDefinition) {
|
|
145
|
-
const derivedFrom = kpuzzle.definition.
|
|
139
|
+
const derivedFrom = kpuzzle.definition.derivedMoves?.[quantumKey];
|
|
146
140
|
if (derivedFrom) {
|
|
147
141
|
quantumMoveDefinition = kpuzzle.algToTransformation(derivedFrom).transformationData;
|
|
148
142
|
}
|
|
@@ -165,25 +159,25 @@ function moveToTransformationUncached(kpuzzle, move) {
|
|
|
165
159
|
throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);
|
|
166
160
|
}
|
|
167
161
|
|
|
168
|
-
// src/cubing/kpuzzle/
|
|
169
|
-
var
|
|
170
|
-
constructor(kpuzzle,
|
|
162
|
+
// src/cubing/kpuzzle/KPattern.ts
|
|
163
|
+
var KPattern = class _KPattern {
|
|
164
|
+
constructor(kpuzzle, patternData) {
|
|
171
165
|
this.kpuzzle = kpuzzle;
|
|
172
|
-
this.
|
|
166
|
+
this.patternData = patternData;
|
|
173
167
|
}
|
|
174
168
|
toJSON() {
|
|
175
169
|
return {
|
|
176
170
|
experimentalPuzzleName: this.kpuzzle.name(),
|
|
177
|
-
|
|
171
|
+
patternData: this.patternData
|
|
178
172
|
};
|
|
179
173
|
}
|
|
180
174
|
static fromTransformation(transformation) {
|
|
181
|
-
const
|
|
175
|
+
const newPatternData = applyTransformationDataToKPatternData(
|
|
182
176
|
transformation.kpuzzle.definition,
|
|
183
|
-
transformation.kpuzzle.definition.
|
|
177
|
+
transformation.kpuzzle.definition.defaultPattern,
|
|
184
178
|
transformation.transformationData
|
|
185
179
|
);
|
|
186
|
-
return new
|
|
180
|
+
return new _KPattern(transformation.kpuzzle, newPatternData);
|
|
187
181
|
}
|
|
188
182
|
// Convenience function
|
|
189
183
|
/** @deprecated */
|
|
@@ -192,14 +186,14 @@ var KState = class _KState {
|
|
|
192
186
|
}
|
|
193
187
|
applyTransformation(transformation) {
|
|
194
188
|
if (transformation.isIdentityTransformation()) {
|
|
195
|
-
return new
|
|
189
|
+
return new _KPattern(this.kpuzzle, this.patternData);
|
|
196
190
|
}
|
|
197
|
-
const
|
|
191
|
+
const newPatternData = applyTransformationDataToKPatternData(
|
|
198
192
|
this.kpuzzle.definition,
|
|
199
|
-
this.
|
|
193
|
+
this.patternData,
|
|
200
194
|
transformation.transformationData
|
|
201
195
|
);
|
|
202
|
-
return new
|
|
196
|
+
return new _KPattern(this.kpuzzle, newPatternData);
|
|
203
197
|
}
|
|
204
198
|
applyMove(move) {
|
|
205
199
|
return this.applyTransformation(this.kpuzzle.moveToTransformation(move));
|
|
@@ -209,26 +203,28 @@ var KState = class _KState {
|
|
|
209
203
|
}
|
|
210
204
|
/** @deprecated */
|
|
211
205
|
experimentalToTransformation() {
|
|
212
|
-
if (!this.kpuzzle.
|
|
206
|
+
if (!this.kpuzzle.canConvertDefaultPatternToUniqueTransformation()) {
|
|
213
207
|
return null;
|
|
214
208
|
}
|
|
215
209
|
const transformationData = {};
|
|
216
|
-
for (const [orbitName,
|
|
210
|
+
for (const [orbitName, patternOrbitData] of Object.entries(
|
|
211
|
+
this.patternData
|
|
212
|
+
)) {
|
|
217
213
|
const transformationOrbit = {
|
|
218
|
-
permutation:
|
|
219
|
-
|
|
214
|
+
permutation: patternOrbitData.pieces,
|
|
215
|
+
orientationDelta: patternOrbitData.orientation
|
|
220
216
|
};
|
|
221
217
|
transformationData[orbitName] = transformationOrbit;
|
|
222
218
|
}
|
|
223
219
|
return new KTransformation(this.kpuzzle, transformationData);
|
|
224
220
|
}
|
|
225
221
|
experimentalIsSolved(options) {
|
|
226
|
-
if (!this.kpuzzle.definition.
|
|
222
|
+
if (!this.kpuzzle.definition.experimentalIsPatternSolved) {
|
|
227
223
|
throw new Error(
|
|
228
|
-
"`
|
|
224
|
+
"`KPattern.experimentalIsPatternSolved()` is not supported for this puzzle at the moment."
|
|
229
225
|
);
|
|
230
226
|
}
|
|
231
|
-
return this.kpuzzle.definition.
|
|
227
|
+
return this.kpuzzle.definition.experimentalIsPatternSolved(this, options);
|
|
232
228
|
}
|
|
233
229
|
};
|
|
234
230
|
|
|
@@ -310,8 +306,8 @@ var KTransformation = class _KTransformation {
|
|
|
310
306
|
return this.applyTransformation(this.kpuzzle.algToTransformation(alg));
|
|
311
307
|
}
|
|
312
308
|
// Convenience. Useful for chaining.
|
|
313
|
-
|
|
314
|
-
return
|
|
309
|
+
toKPattern() {
|
|
310
|
+
return KPattern.fromTransformation(this);
|
|
315
311
|
}
|
|
316
312
|
repetitionOrder() {
|
|
317
313
|
return transformationRepetitionOrder(this.kpuzzle.definition, this);
|
|
@@ -330,6 +326,9 @@ var KTransformation = class _KTransformation {
|
|
|
330
326
|
|
|
331
327
|
// src/cubing/kpuzzle/calculate.ts
|
|
332
328
|
function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransformationData) {
|
|
329
|
+
if (!orbitTransformationData.permutation) {
|
|
330
|
+
console.log(orbitTransformationData);
|
|
331
|
+
}
|
|
333
332
|
const { permutation } = orbitTransformationData;
|
|
334
333
|
const numPieces = permutation.length;
|
|
335
334
|
for (let idx = 0; idx < numPieces; idx++) {
|
|
@@ -338,7 +337,7 @@ function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransfo
|
|
|
338
337
|
}
|
|
339
338
|
}
|
|
340
339
|
if (numOrientations > 1) {
|
|
341
|
-
const { orientation } = orbitTransformationData;
|
|
340
|
+
const { orientationDelta: orientation } = orbitTransformationData;
|
|
342
341
|
for (let idx = 0; idx < numPieces; idx++) {
|
|
343
342
|
if (orientation[idx] !== 0) {
|
|
344
343
|
return false;
|
|
@@ -349,7 +348,7 @@ function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransfo
|
|
|
349
348
|
}
|
|
350
349
|
function isOrbitTransformationDataIdentical(orbitDefinition, orbitTransformationData1, orbitTransformationData2, options = {}) {
|
|
351
350
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
352
|
-
if (!options?.ignoreOrientation && orbitTransformationData1.
|
|
351
|
+
if (!options?.ignoreOrientation && orbitTransformationData1.orientationDelta[idx] !== orbitTransformationData2.orientationDelta[idx]) {
|
|
353
352
|
return false;
|
|
354
353
|
}
|
|
355
354
|
if (!options?.ignorePermutation && orbitTransformationData1.permutation[idx] !== orbitTransformationData2.permutation[idx]) {
|
|
@@ -359,13 +358,11 @@ function isOrbitTransformationDataIdentical(orbitDefinition, orbitTransformation
|
|
|
359
358
|
return true;
|
|
360
359
|
}
|
|
361
360
|
function isTransformationDataIdentical(kpuzzle, transformationData1, transformationData2) {
|
|
362
|
-
for (const
|
|
363
|
-
kpuzzle.definition.orbits
|
|
364
|
-
)) {
|
|
361
|
+
for (const orbitDefinition of kpuzzle.definition.orbits) {
|
|
365
362
|
if (!isOrbitTransformationDataIdentical(
|
|
366
363
|
orbitDefinition,
|
|
367
|
-
transformationData1[orbitName],
|
|
368
|
-
transformationData2[orbitName]
|
|
364
|
+
transformationData1[orbitDefinition.orbitName],
|
|
365
|
+
transformationData2[orbitDefinition.orbitName]
|
|
369
366
|
)) {
|
|
370
367
|
return false;
|
|
371
368
|
}
|
|
@@ -374,22 +371,21 @@ function isTransformationDataIdentical(kpuzzle, transformationData1, transformat
|
|
|
374
371
|
}
|
|
375
372
|
function invertTransformation(kpuzzle, transformationData) {
|
|
376
373
|
const newTransformationData = {};
|
|
377
|
-
for (const
|
|
378
|
-
const
|
|
379
|
-
const orbitTransformationData = transformationData[orbitName];
|
|
374
|
+
for (const orbitDefinition of kpuzzle.definition.orbits) {
|
|
375
|
+
const orbitTransformationData = transformationData[orbitDefinition.orbitName];
|
|
380
376
|
if (isOrbitTransformationDataIdentityUncached(
|
|
381
377
|
orbitDefinition.numOrientations,
|
|
382
378
|
orbitTransformationData
|
|
383
379
|
)) {
|
|
384
|
-
newTransformationData[orbitName] = orbitTransformationData;
|
|
380
|
+
newTransformationData[orbitDefinition.orbitName] = orbitTransformationData;
|
|
385
381
|
} else if (orbitDefinition.numOrientations === 1) {
|
|
386
382
|
const newPerm = new Array(orbitDefinition.numPieces);
|
|
387
383
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
388
384
|
newPerm[orbitTransformationData.permutation[idx]] = idx;
|
|
389
385
|
}
|
|
390
|
-
newTransformationData[orbitName] = {
|
|
386
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
391
387
|
permutation: newPerm,
|
|
392
|
-
|
|
388
|
+
orientationDelta: orbitTransformationData.orientationDelta
|
|
393
389
|
};
|
|
394
390
|
} else {
|
|
395
391
|
const newPerm = new Array(orbitDefinition.numPieces);
|
|
@@ -397,11 +393,11 @@ function invertTransformation(kpuzzle, transformationData) {
|
|
|
397
393
|
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
|
|
398
394
|
const fromIdx = orbitTransformationData.permutation[idx];
|
|
399
395
|
newPerm[fromIdx] = idx;
|
|
400
|
-
newOri[fromIdx] = (orbitDefinition.numOrientations - orbitTransformationData.
|
|
396
|
+
newOri[fromIdx] = (orbitDefinition.numOrientations - orbitTransformationData.orientationDelta[idx] + orbitDefinition.numOrientations) % orbitDefinition.numOrientations;
|
|
401
397
|
}
|
|
402
|
-
newTransformationData[orbitName] = {
|
|
398
|
+
newTransformationData[orbitDefinition.orbitName] = {
|
|
403
399
|
permutation: newPerm,
|
|
404
|
-
|
|
400
|
+
orientationDelta: newOri
|
|
405
401
|
};
|
|
406
402
|
}
|
|
407
403
|
}
|
|
@@ -504,9 +500,8 @@ function gcd(a, b) {
|
|
|
504
500
|
}
|
|
505
501
|
function transformationRepetitionOrder(definition, transformation) {
|
|
506
502
|
let order = 1;
|
|
507
|
-
for (const
|
|
508
|
-
const
|
|
509
|
-
const transformationOrbit = transformation.transformationData[orbitName];
|
|
503
|
+
for (const orbitDefinition of definition.orbits) {
|
|
504
|
+
const transformationOrbit = transformation.transformationData[orbitDefinition.orbitName];
|
|
510
505
|
const orbitPieces = new Array(orbitDefinition.numPieces);
|
|
511
506
|
for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {
|
|
512
507
|
if (!orbitPieces[startIdx]) {
|
|
@@ -515,7 +510,7 @@ function transformationRepetitionOrder(definition, transformation) {
|
|
|
515
510
|
let cycleLength = 0;
|
|
516
511
|
for (; ; ) {
|
|
517
512
|
orbitPieces[currentIdx] = true;
|
|
518
|
-
orientationSum = orientationSum + transformationOrbit.
|
|
513
|
+
orientationSum = orientationSum + transformationOrbit.orientationDelta[currentIdx];
|
|
519
514
|
cycleLength = cycleLength + 1;
|
|
520
515
|
currentIdx = transformationOrbit.permutation[currentIdx];
|
|
521
516
|
if (currentIdx === startIdx) {
|
|
@@ -539,6 +534,23 @@ var KPuzzle = class {
|
|
|
539
534
|
this.#moveToTransformationDataCache = /* @__PURE__ */ new Map();
|
|
540
535
|
this.experimentalPGNotation = options?.experimentalPGNotation;
|
|
541
536
|
}
|
|
537
|
+
#indexedOrbits;
|
|
538
|
+
// Note: this function is needed much more rarely than you might think. Most
|
|
539
|
+
// operations related to orbits require iterating through all of them, for
|
|
540
|
+
// which the following is better:
|
|
541
|
+
//
|
|
542
|
+
// for (const orbitDefinition of kpuzzle.definition.orbits) { // …
|
|
543
|
+
// }
|
|
544
|
+
lookupOrbitDefinition(orbitName) {
|
|
545
|
+
this.#indexedOrbits || (this.#indexedOrbits = (() => {
|
|
546
|
+
const indexedOrbits = {};
|
|
547
|
+
for (const orbitDefinition of this.definition.orbits) {
|
|
548
|
+
indexedOrbits[orbitDefinition.orbitName] = orbitDefinition;
|
|
549
|
+
}
|
|
550
|
+
return indexedOrbits;
|
|
551
|
+
})());
|
|
552
|
+
return this.#indexedOrbits[orbitName];
|
|
553
|
+
}
|
|
542
554
|
name() {
|
|
543
555
|
return this.definition.name;
|
|
544
556
|
}
|
|
@@ -585,18 +597,16 @@ var KPuzzle = class {
|
|
|
585
597
|
return source;
|
|
586
598
|
}
|
|
587
599
|
}
|
|
588
|
-
|
|
589
|
-
return new
|
|
600
|
+
defaultPattern() {
|
|
601
|
+
return new KPattern(this, this.definition.defaultPattern);
|
|
590
602
|
}
|
|
591
|
-
#
|
|
592
|
-
// TODO: Handle incomplete
|
|
593
|
-
|
|
594
|
-
return this.#
|
|
595
|
-
for (const
|
|
596
|
-
this.definition.orbits
|
|
597
|
-
)) {
|
|
603
|
+
#cachedCanConvertDefaultPatternToUniqueTransformation;
|
|
604
|
+
// TODO: Handle incomplete default pattern data
|
|
605
|
+
canConvertDefaultPatternToUniqueTransformation() {
|
|
606
|
+
return this.#cachedCanConvertDefaultPatternToUniqueTransformation ?? (this.#cachedCanConvertDefaultPatternToUniqueTransformation = (() => {
|
|
607
|
+
for (const orbitDefinition of this.definition.orbits) {
|
|
598
608
|
const pieces = new Array(orbitDefinition.numPieces).fill(false);
|
|
599
|
-
for (const piece of this.definition.
|
|
609
|
+
for (const piece of this.definition.defaultPattern[orbitDefinition.orbitName].pieces) {
|
|
600
610
|
pieces[piece] = true;
|
|
601
611
|
}
|
|
602
612
|
for (const piece of pieces) {
|
|
@@ -611,8 +621,8 @@ var KPuzzle = class {
|
|
|
611
621
|
};
|
|
612
622
|
|
|
613
623
|
export {
|
|
614
|
-
|
|
624
|
+
KPattern,
|
|
615
625
|
KTransformation,
|
|
616
626
|
KPuzzle
|
|
617
627
|
};
|
|
618
|
-
//# sourceMappingURL=chunk-
|
|
628
|
+
//# sourceMappingURL=chunk-V4YTFIKT.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/cubing/kpuzzle/combine.ts", "../../src/cubing/kpuzzle/construct.ts", "../../src/cubing/kpuzzle/KPattern.ts", "../../src/cubing/kpuzzle/KTransformation.ts", "../../src/cubing/kpuzzle/calculate.ts", "../../src/cubing/kpuzzle/KPuzzle.ts"],
|
|
4
|
+
"sourcesContent": ["import { isOrbitTransformationDataIdentityUncached } from \"./calculate\";\nimport type {\n KPuzzleDefinition,\n KPatternData,\n KPatternOrbitData,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\n\nexport function combineTransformationData(\n definition: KPuzzleDefinition,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): KTransformationData {\n const newTransformationData = {} as KTransformationData;\n for (const orbitDefinition of definition.orbits) {\n const orbit1 = transformationData1[orbitDefinition.orbitName];\n const orbit2 = transformationData2[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit2,\n )\n ) {\n // common case for big cubes\n newTransformationData[orbitDefinition.orbitName] = orbit1;\n } else if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbit1,\n )\n ) {\n newTransformationData[orbitDefinition.orbitName] = orbit2;\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: orbit1.orientationDelta,\n };\n } else {\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newOri[idx] =\n (orbit1.orientationDelta[orbit2.permutation[idx]] +\n orbit2.orientationDelta[idx]) %\n orbitDefinition.numOrientations;\n newPerm[idx] = orbit1.permutation[orbit2.permutation[idx]];\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: newOri,\n };\n }\n }\n }\n return newTransformationData;\n}\n\nexport function applyTransformationDataToKPatternData(\n definition: KPuzzleDefinition,\n patternData: KPatternData,\n transformationData: KTransformationData,\n): KPatternData {\n const newPatternData = {} as KPatternData;\n for (const orbitDefinition of definition.orbits) {\n const patternOrbit = patternData[orbitDefinition.orbitName];\n const transformationOrbit = transformationData[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n transformationOrbit,\n )\n ) {\n // common case for big cubes\n newPatternData[orbitDefinition.orbitName] = patternOrbit;\n } else {\n const newPieces = new Array(orbitDefinition.numPieces);\n if (orbitDefinition.numOrientations === 1) {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPieces[idx] =\n patternOrbit.pieces[transformationOrbit.permutation[idx]];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: patternOrbit.orientation, // copy all 0\n };\n newPatternData[orbitDefinition.orbitName] = newOrbitData;\n } else {\n const newOrientation = new Array(orbitDefinition.numPieces);\n const newOrientationMod: number[] | undefined =\n patternOrbit.orientationMod\n ? new Array(orbitDefinition.numPieces)\n : undefined;\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const transformationIdx = transformationOrbit.permutation[idx];\n let mod = orbitDefinition.numOrientations;\n if (patternOrbit.orientationMod) {\n const orientationMod =\n patternOrbit.orientationMod[transformationIdx];\n newOrientationMod![idx] = orientationMod;\n mod = orientationMod || orbitDefinition.numOrientations;\n }\n newOrientation[idx] =\n (patternOrbit.orientation[transformationIdx] +\n transformationOrbit.orientationDelta[idx]) %\n mod; // We don't have to use `modIntoRange` (assuming input is well-formed), because we're adding.\n newPieces[idx] = patternOrbit.pieces[transformationIdx];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: newOrientation,\n };\n if (newOrientationMod) {\n newOrbitData.orientationMod = newOrientationMod;\n }\n newPatternData[orbitDefinition.orbitName] = newOrbitData;\n }\n }\n }\n return newPatternData;\n}\n", "import type { Move } from \"../alg\";\nimport { repeatTransformationUncached } from \"./calculate\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPuzzleDefinition,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\n\nconst FREEZE: boolean = false;\n\nconst identityOrbitCache = new Map<number, KTransformationOrbitData>();\nfunction constructIdentityOrbitTransformation(\n numPieces: number,\n): KTransformationOrbitData {\n const cached = identityOrbitCache.get(numPieces);\n if (cached) {\n return cached;\n }\n\n const newPermutation = new Array(numPieces);\n const newOrientation = new Array(numPieces);\n for (let i = 0; i < numPieces; i++) {\n newPermutation[i] = i;\n newOrientation[i] = 0;\n }\n const orbitTransformation = {\n permutation: newPermutation,\n orientationDelta: newOrientation,\n };\n if (FREEZE) {\n Object.freeze(newPermutation); // TODO\n Object.freeze(newOrientation); // TODO\n Object.freeze(orbitTransformation); // TODO\n }\n identityOrbitCache.set(numPieces, orbitTransformation);\n return orbitTransformation;\n}\n\nexport function constructIdentityTransformationDataUncached(\n definition: KPuzzleDefinition,\n): KTransformationData {\n const transformation = {} as KTransformationData;\n for (const orbitDefinition of definition.orbits) {\n transformation[orbitDefinition.orbitName] =\n constructIdentityOrbitTransformation(orbitDefinition.numPieces);\n }\n if (FREEZE) {\n Object.freeze(transformation); // TODO\n }\n return transformation;\n}\n\nexport function moveToTransformationUncached(\n kpuzzle: KPuzzle,\n move: Move,\n): KTransformationData {\n const quantumKey = move.quantum.toString();\n let quantumMoveDefinition = kpuzzle.definition.moves[quantumKey] as\n | KTransformationData\n | undefined;\n\n if (!quantumMoveDefinition) {\n const derivedFrom = kpuzzle.definition.derivedMoves?.[quantumKey];\n\n if (derivedFrom) {\n // TODO: avoid the round trip?\n quantumMoveDefinition =\n kpuzzle.algToTransformation(derivedFrom).transformationData;\n }\n }\n\n if (quantumMoveDefinition) {\n return repeatTransformationUncached(\n kpuzzle,\n quantumMoveDefinition,\n move.amount,\n );\n }\n\n // Handle e.g. `y2` if `y2` is defined.\n // Note: this doesn't handle multiples.\n const moveDefinition = kpuzzle.definition.moves[move.toString()];\n if (moveDefinition) {\n return moveDefinition;\n }\n\n // Handle e.g. `y2'` if `y2` is defined.\n // Note: this doesn't handle multiples.\n const inverseMoveDefinition =\n kpuzzle.definition.moves[move.invert().toString()];\n if (inverseMoveDefinition) {\n return repeatTransformationUncached(kpuzzle, inverseMoveDefinition, -1);\n }\n\n throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);\n}\n", "import type { KPuzzle } from \"./KPuzzle\";\nimport type { Alg, Move } from \"../alg\";\nimport { applyTransformationDataToKPatternData } from \"./combine\";\nimport type { KTransformationSource } from \"./KPuzzle\";\nimport type {\n KPatternData,\n KTransformationData,\n KTransformationOrbitData,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport class KPattern {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly patternData: KPatternData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n patternData: this.patternData,\n };\n }\n\n static fromTransformation(transformation: KTransformation): KPattern {\n const newPatternData = applyTransformationDataToKPatternData(\n transformation.kpuzzle.definition,\n transformation.kpuzzle.definition.defaultPattern,\n transformation.transformationData,\n );\n return new KPattern(transformation.kpuzzle, newPatternData);\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KPattern {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(transformation: KTransformation): KPattern {\n if (transformation.isIdentityTransformation()) {\n return new KPattern(this.kpuzzle, this.patternData);\n }\n const newPatternData = applyTransformationDataToKPatternData(\n this.kpuzzle.definition,\n this.patternData,\n transformation.transformationData,\n );\n return new KPattern(this.kpuzzle, newPatternData);\n }\n\n applyMove(move: Move | string): KPattern {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KPattern {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n /** @deprecated */\n experimentalToTransformation(): KTransformation | null {\n if (!this.kpuzzle.canConvertDefaultPatternToUniqueTransformation()) {\n return null;\n }\n const transformationData: KTransformationData = {};\n for (const [orbitName, patternOrbitData] of Object.entries(\n this.patternData,\n )) {\n const transformationOrbit: KTransformationOrbitData = {\n permutation: patternOrbitData.pieces,\n orientationDelta: patternOrbitData.orientation,\n };\n transformationData[orbitName] = transformationOrbit;\n }\n return new KTransformation(this.kpuzzle, transformationData);\n }\n\n experimentalIsSolved(options: {\n ignorePuzzleOrientation: boolean;\n ignoreCenterOrientation: boolean;\n }): boolean {\n if (!this.kpuzzle.definition.experimentalIsPatternSolved) {\n throw new Error(\n \"`KPattern.experimentalIsPatternSolved()` is not supported for this puzzle at the moment.\",\n );\n }\n return this.kpuzzle.definition.experimentalIsPatternSolved(this, options);\n }\n}\n", "import type { Alg, Move } from \"../alg\";\nimport {\n invertTransformation,\n isTransformationDataIdentical,\n repeatTransformationUncached,\n transformationRepetitionOrder,\n} from \"./calculate\";\nimport { combineTransformationData } from \"./combine\";\nimport { constructIdentityTransformationDataUncached } from \"./construct\";\nimport type { KPuzzle, KTransformationSource } from \"./KPuzzle\";\nimport type { KTransformationData } from \"./KPuzzleDefinition\";\nimport { KPattern } from \"./KPattern\";\n\nexport class KTransformation {\n constructor(\n public readonly kpuzzle: KPuzzle,\n public readonly transformationData: KTransformationData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n transformationData: this.transformationData,\n };\n }\n\n invert(): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n invertTransformation(this.kpuzzle, this.transformationData),\n );\n }\n\n // For optimizations, we want to make it cheap to rely on optimizations when a\n // transformation is an identity. Here, we try to make it cheaper by:\n // - only calculating when needed, and\n // - caching the result.\n #cachedIsIdentity: boolean | undefined; // TODO: is `null` worse here?\n isIdentityTransformation(): boolean {\n return (this.#cachedIsIdentity ??= this.isIdentical(\n this.kpuzzle.identityTransformation(),\n ));\n }\n\n /** @deprecated */\n static experimentalConstructIdentity(kpuzzle: KPuzzle) {\n const transformation = new KTransformation(\n kpuzzle,\n constructIdentityTransformationDataUncached(kpuzzle.definition),\n );\n transformation.#cachedIsIdentity = true;\n return transformation;\n }\n\n isIdentical(t2: KTransformation): boolean {\n return isTransformationDataIdentical(\n this.kpuzzle,\n this.transformationData,\n t2.transformationData,\n );\n }\n\n // Convenience function\n /** @deprecated */\n apply(source: KTransformationSource): KTransformation {\n return this.applyTransformation(this.kpuzzle.toTransformation(source));\n }\n\n applyTransformation(t2: KTransformation): KTransformation {\n if (this.kpuzzle !== t2.kpuzzle) {\n throw new Error(\n `Tried to apply a transformation for a KPuzzle (${t2.kpuzzle.name()}) to a different KPuzzle (${this.kpuzzle.name()}).`,\n );\n }\n\n if (this.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, t2.transformationData);\n }\n if (t2.#cachedIsIdentity) {\n return new KTransformation(this.kpuzzle, this.transformationData);\n }\n\n return new KTransformation(\n this.kpuzzle,\n combineTransformationData(\n this.kpuzzle.definition,\n this.transformationData,\n t2.transformationData,\n ),\n );\n }\n\n applyMove(move: Move | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.moveToTransformation(move));\n }\n\n applyAlg(alg: Alg | string): KTransformation {\n return this.applyTransformation(this.kpuzzle.algToTransformation(alg));\n }\n\n // Convenience. Useful for chaining.\n toKPattern(): KPattern {\n return KPattern.fromTransformation(this);\n }\n\n repetitionOrder(): number {\n return transformationRepetitionOrder(this.kpuzzle.definition, this);\n }\n\n selfMultiply(amount: number): KTransformation {\n return new KTransformation(\n this.kpuzzle,\n repeatTransformationUncached(\n this.kpuzzle,\n this.transformationData,\n amount,\n ),\n );\n }\n}\n", "import {\n Alg,\n Commutator,\n Conjugate,\n Grouping,\n LineComment,\n Move,\n Newline,\n Pause,\n TraversalDownUp,\n} from \"../alg\";\nimport { functionFromTraversal } from \"../alg\";\nimport { combineTransformationData } from \"./combine\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPuzzleOrbitDefinition,\n KTransformationOrbitData,\n KTransformationData,\n KPuzzleDefinition,\n} from \"./KPuzzleDefinition\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport function isOrbitTransformationDataIdentityUncached(\n numOrientations: number,\n orbitTransformationData: KTransformationOrbitData,\n): boolean {\n // TODO\n // if (o === lasto) {\n // return true;\n // }\n if (!orbitTransformationData.permutation) {\n console.log(orbitTransformationData);\n }\n const { permutation } = orbitTransformationData;\n const numPieces = permutation.length;\n for (let idx = 0; idx < numPieces; idx++) {\n if (permutation[idx] !== idx) {\n return false;\n }\n }\n if (numOrientations > 1) {\n const { orientationDelta: orientation } = orbitTransformationData;\n for (let idx = 0; idx < numPieces; idx++) {\n if (orientation[idx] !== 0) {\n return false;\n }\n }\n }\n // lasto = o; // TODO\n return true;\n}\n\nexport function isOrbitTransformationDataIdentical(\n orbitDefinition: KPuzzleOrbitDefinition,\n orbitTransformationData1: KTransformationOrbitData,\n orbitTransformationData2: KTransformationOrbitData,\n options: {\n ignoreOrientation?: boolean;\n ignorePermutation?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignoreOrientation &&\n orbitTransformationData1.orientationDelta[idx] !==\n orbitTransformationData2.orientationDelta[idx]\n ) {\n return false;\n }\n if (\n !options?.ignorePermutation &&\n orbitTransformationData1.permutation[idx] !==\n orbitTransformationData2.permutation[idx]\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function isTransformationDataIdentical(\n kpuzzle: KPuzzle,\n transformationData1: KTransformationData,\n transformationData2: KTransformationData,\n): boolean {\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n if (\n !isOrbitTransformationDataIdentical(\n orbitDefinition,\n transformationData1[orbitDefinition.orbitName],\n transformationData2[orbitDefinition.orbitName],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function invertTransformation(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n): KTransformationData {\n const newTransformationData: KTransformationData = {};\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n const orbitTransformationData =\n transformationData[orbitDefinition.orbitName];\n if (\n isOrbitTransformationDataIdentityUncached(\n orbitDefinition.numOrientations,\n orbitTransformationData,\n )\n ) {\n newTransformationData[orbitDefinition.orbitName] =\n orbitTransformationData;\n } else if (orbitDefinition.numOrientations === 1) {\n const newPerm = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n newPerm[orbitTransformationData.permutation[idx]] = idx;\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: orbitTransformationData.orientationDelta,\n };\n } else {\n const newPerm = new Array(orbitDefinition.numPieces);\n const newOri = new Array(orbitDefinition.numPieces);\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n const fromIdx = orbitTransformationData.permutation[idx];\n newPerm[fromIdx] = idx;\n newOri[fromIdx] =\n (orbitDefinition.numOrientations -\n orbitTransformationData.orientationDelta[idx] +\n orbitDefinition.numOrientations) %\n orbitDefinition.numOrientations;\n }\n newTransformationData[orbitDefinition.orbitName] = {\n permutation: newPerm,\n orientationDelta: newOri,\n };\n }\n }\n return newTransformationData;\n}\n\nexport function repeatTransformationUncached(\n kpuzzle: KPuzzle,\n transformationData: KTransformationData,\n amount: number,\n): KTransformationData {\n // This is used for move construction, so we optimize for the quantum move case.\n if (amount === 1) {\n return transformationData;\n }\n if (amount < 0) {\n return repeatTransformationUncached(\n kpuzzle,\n invertTransformation(kpuzzle, transformationData),\n -amount,\n );\n }\n if (amount === 0) {\n // TODO\n const { transformationData } = kpuzzle.identityTransformation();\n return transformationData;\n }\n let halfish = transformationData;\n if (amount !== 2) {\n halfish = repeatTransformationUncached(\n kpuzzle,\n transformationData,\n Math.floor(amount / 2),\n );\n }\n const twiceHalfish = combineTransformationData(\n kpuzzle.definition,\n halfish,\n halfish,\n );\n if (amount % 2 === 0) {\n return twiceHalfish;\n } else {\n return combineTransformationData(\n kpuzzle.definition,\n transformationData,\n twiceHalfish,\n );\n }\n}\n\nclass AlgToTransformationTraversal extends TraversalDownUp<\n KPuzzle,\n KTransformation\n> {\n traverseAlg(alg: Alg, kpuzzle: KPuzzle): KTransformation {\n let transformation: KTransformation | null = null;\n for (const algNode of alg.childAlgNodes()) {\n if (transformation) {\n transformation = transformation.applyTransformation(\n this.traverseAlgNode(algNode, kpuzzle),\n );\n } else {\n transformation = this.traverseAlgNode(algNode, kpuzzle);\n }\n }\n return transformation ?? kpuzzle.identityTransformation();\n }\n traverseGrouping(grouping: Grouping, kpuzzle: KPuzzle): KTransformation {\n const algTransformation = this.traverseAlg(grouping.alg, kpuzzle);\n return new KTransformation(\n kpuzzle,\n repeatTransformationUncached(\n kpuzzle,\n algTransformation.transformationData,\n grouping.amount,\n ),\n );\n }\n traverseMove(move: Move, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.moveToTransformation(move);\n }\n traverseCommutator(\n commutator: Commutator,\n kpuzzle: KPuzzle,\n ): KTransformation {\n const aTransformation = this.traverseAlg(commutator.A, kpuzzle);\n const bTransformation = this.traverseAlg(commutator.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert())\n .applyTransformation(bTransformation.invert());\n }\n traverseConjugate(conjugate: Conjugate, kpuzzle: KPuzzle): KTransformation {\n const aTransformation = this.traverseAlg(conjugate.A, kpuzzle);\n const bTransformation = this.traverseAlg(conjugate.B, kpuzzle);\n return aTransformation\n .applyTransformation(bTransformation)\n .applyTransformation(aTransformation.invert());\n }\n traversePause(_: Pause, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseNewline(_: Newline, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n traverseLineComment(_: LineComment, kpuzzle: KPuzzle): KTransformation {\n return kpuzzle.identityTransformation();\n }\n}\n\nexport const algToTransformation = functionFromTraversal(\n AlgToTransformationTraversal,\n);\n\nexport function canConvertDefaultPatternToUniqueTransformationUncached(\n definition: KPuzzleDefinition,\n): boolean {\n for (const orbitDefinition of definition.orbits) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.defaultPattern[\n orbitDefinition.orbitName\n ].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n}\n\nfunction gcd(a: number, b: number): number {\n if (b) {\n return gcd(b, a % b);\n }\n return a;\n}\n\n/* calculate the order of a particular transformation. */\nexport function transformationRepetitionOrder(\n definition: KPuzzleDefinition,\n transformation: KTransformation,\n): number {\n let order: number = 1;\n for (const orbitDefinition of definition.orbits) {\n const transformationOrbit =\n transformation.transformationData[orbitDefinition.orbitName];\n const orbitPieces = new Array(orbitDefinition.numPieces);\n for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {\n if (!orbitPieces[startIdx]) {\n let currentIdx = startIdx;\n let orientationSum = 0;\n let cycleLength = 0;\n for (;;) {\n orbitPieces[currentIdx] = true;\n orientationSum =\n orientationSum + transformationOrbit.orientationDelta[currentIdx];\n cycleLength = cycleLength + 1;\n currentIdx = transformationOrbit.permutation[currentIdx];\n if (currentIdx === startIdx) {\n break;\n }\n }\n if (orientationSum !== 0) {\n cycleLength =\n (cycleLength * orbitDefinition.numOrientations) /\n gcd(orbitDefinition.numOrientations, Math.abs(orientationSum));\n }\n order = (order * cycleLength) / gcd(order, cycleLength);\n }\n }\n }\n return order;\n}\n", "import { Alg, Move } from \"../alg\";\nimport type { PGNotation } from \"../puzzle-geometry/PuzzleGeometry\";\nimport { algToTransformation } from \"./calculate\";\nimport { moveToTransformationUncached } from \"./construct\";\nimport type {\n KPuzzleDefinition,\n KPuzzleOrbitDefinition,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\nimport { KPattern } from \"./KPattern\";\nimport { KTransformation } from \"./KTransformation\";\n\nexport type KTransformationSource = Alg | Move | string | KTransformation;\n\nexport class KPuzzle {\n private experimentalPGNotation: PGNotation | undefined;\n constructor(\n public readonly definition: KPuzzleDefinition,\n options?: {\n experimentalPGNotation?: PGNotation;\n },\n ) {\n this.experimentalPGNotation = options?.experimentalPGNotation;\n }\n\n #indexedOrbits: Record<string, KPuzzleOrbitDefinition> | undefined;\n // Note: this function is needed much more rarely than you might think. Most\n // operations related to orbits require iterating through all of them, for\n // which the following is better:\n //\n // for (const orbitDefinition of kpuzzle.definition.orbits) { // \u2026\n // }\n lookupOrbitDefinition(orbitName: string): KPuzzleOrbitDefinition {\n this.#indexedOrbits ||= (() => {\n const indexedOrbits: Record<string, KPuzzleOrbitDefinition> = {};\n for (const orbitDefinition of this.definition.orbits) {\n indexedOrbits[orbitDefinition.orbitName] = orbitDefinition;\n }\n return indexedOrbits;\n })();\n return this.#indexedOrbits[orbitName];\n }\n\n name(): string {\n return this.definition.name; // TODO\n }\n\n identityTransformation(): KTransformation {\n return KTransformation.experimentalConstructIdentity(this);\n }\n\n #moveToTransformationDataCache = new Map<string, KTransformationData>();\n moveToTransformation(move: Move | string): KTransformation {\n if (typeof move === \"string\") {\n move = new Move(move);\n }\n const cacheKey = move.toString();\n const cachedTransformationData: KTransformationData | undefined =\n this.#moveToTransformationDataCache.get(cacheKey);\n if (cachedTransformationData) {\n return new KTransformation(this, cachedTransformationData);\n }\n\n if (this.experimentalPGNotation) {\n const transformationData = this.experimentalPGNotation.lookupMove(move);\n if (!transformationData) {\n throw new Error(`could not map to internal move: ${move}`);\n }\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n const transformationData = moveToTransformationUncached(this, move);\n this.#moveToTransformationDataCache.set(cacheKey, transformationData);\n return new KTransformation(this, transformationData);\n }\n\n algToTransformation(alg: Alg | string): KTransformation {\n if (typeof alg === \"string\") {\n alg = new Alg(alg);\n }\n return algToTransformation(alg, this);\n }\n\n /** @deprecated */\n toTransformation(source: KTransformationSource): KTransformation {\n if (typeof source === \"string\") {\n return this.algToTransformation(source);\n } else if ((source as Alg | null)?.is?.(Alg)) {\n return this.algToTransformation(source as Alg);\n } else if ((source as Move | null)?.is?.(Move)) {\n return this.moveToTransformation(source as Move);\n } else {\n return source as KTransformation;\n }\n }\n\n defaultPattern(): KPattern {\n return new KPattern(this, this.definition.defaultPattern);\n }\n\n #cachedCanConvertDefaultPatternToUniqueTransformation: boolean | undefined;\n // TODO: Handle incomplete default pattern data\n canConvertDefaultPatternToUniqueTransformation(): boolean {\n return (this.#cachedCanConvertDefaultPatternToUniqueTransformation ??=\n ((): boolean => {\n for (const orbitDefinition of this.definition.orbits) {\n const pieces = new Array(orbitDefinition.numPieces).fill(false);\n for (const piece of this.definition.defaultPattern[\n orbitDefinition.orbitName\n ].pieces) {\n pieces[piece] = true;\n }\n for (const piece of pieces) {\n if (!piece) {\n return false;\n }\n }\n }\n return true;\n })());\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["transformationData", "transformationData"]
|
|
7
|
+
}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
insideAPI
|
|
3
|
-
} from "./chunk-NZAWY3EU.js";
|
|
4
1
|
import {
|
|
5
2
|
exposeAPI
|
|
6
3
|
} from "./chunk-7QE2OVHX.js";
|
|
@@ -129,7 +126,7 @@ function probablyCrossOrigin(workerEntryFileURL) {
|
|
|
129
126
|
try {
|
|
130
127
|
const scriptOrigin = globalThis.location?.origin;
|
|
131
128
|
const workerOrigin = workerEntryFileURL.origin;
|
|
132
|
-
return !!scriptOrigin &&
|
|
129
|
+
return !!scriptOrigin && !!workerOrigin && scriptOrigin !== workerOrigin;
|
|
133
130
|
} catch {
|
|
134
131
|
return false;
|
|
135
132
|
}
|
|
@@ -217,14 +214,15 @@ async function instantiateModuleWorkerDirectlyForBrowser() {
|
|
|
217
214
|
});
|
|
218
215
|
}
|
|
219
216
|
function wrapWithTerminate(worker) {
|
|
220
|
-
const
|
|
217
|
+
const insideAPI = wrap(worker);
|
|
221
218
|
const terminate = worker.terminate.bind(worker);
|
|
222
|
-
return { insideAPI
|
|
219
|
+
return { insideAPI, outsideAPI: { terminate } };
|
|
223
220
|
}
|
|
224
221
|
var allInsideOutsideAPIPromises = [];
|
|
225
222
|
async function instantiateWorker() {
|
|
226
223
|
const insideOutsideAPIPromise = instantiateWorkerImplementation();
|
|
227
224
|
allInsideOutsideAPIPromises.push(insideOutsideAPIPromise);
|
|
225
|
+
const { insideAPI } = await insideOutsideAPIPromise;
|
|
228
226
|
insideAPI.setDebugMeasurePerf(searchOutsideDebugGlobals.logPerf);
|
|
229
227
|
insideAPI.setScramblePrefetchLevel(
|
|
230
228
|
searchOutsideDebugGlobals.scramblePrefetchLevel
|
|
@@ -312,46 +310,50 @@ async function _randomScrambleStringForEvent(eventID) {
|
|
|
312
310
|
const worker = searchOutsideDebugGlobals.forceNewWorkerForEveryScramble ? await instantiateWorker() : await getCachedWorkerInstance();
|
|
313
311
|
return worker.insideAPI.randomScrambleStringForEvent(eventID);
|
|
314
312
|
}
|
|
315
|
-
async function experimentalSolve3x3x3IgnoringCenters(
|
|
313
|
+
async function experimentalSolve3x3x3IgnoringCenters(pattern) {
|
|
316
314
|
const cwi = await getCachedWorkerInstance();
|
|
317
|
-
return Alg.fromString(
|
|
315
|
+
return Alg.fromString(
|
|
316
|
+
await cwi.insideAPI.solve333ToString(pattern.patternData)
|
|
317
|
+
);
|
|
318
318
|
}
|
|
319
|
-
async function experimentalSolve2x2x2(
|
|
319
|
+
async function experimentalSolve2x2x2(pattern) {
|
|
320
320
|
const cwi = await getCachedWorkerInstance();
|
|
321
|
-
return Alg.fromString(
|
|
321
|
+
return Alg.fromString(
|
|
322
|
+
await cwi.insideAPI.solve222ToString(pattern.patternData)
|
|
323
|
+
);
|
|
322
324
|
}
|
|
323
|
-
async function solveSkewb(
|
|
325
|
+
async function solveSkewb(pattern) {
|
|
324
326
|
const cwi = await getCachedWorkerInstance();
|
|
325
327
|
return Alg.fromString(
|
|
326
|
-
await cwi.insideAPI.solveSkewbToString(
|
|
328
|
+
await cwi.insideAPI.solveSkewbToString(pattern.patternData)
|
|
327
329
|
);
|
|
328
330
|
}
|
|
329
|
-
async function solvePyraminx(
|
|
331
|
+
async function solvePyraminx(pattern) {
|
|
330
332
|
const cwi = await getCachedWorkerInstance();
|
|
331
333
|
return Alg.fromString(
|
|
332
|
-
await cwi.insideAPI.solvePyraminxToString(
|
|
334
|
+
await cwi.insideAPI.solvePyraminxToString(pattern.patternData)
|
|
333
335
|
);
|
|
334
336
|
}
|
|
335
|
-
async function solveMegaminx(
|
|
337
|
+
async function solveMegaminx(pattern) {
|
|
336
338
|
const cwi = await getCachedWorkerInstance();
|
|
337
339
|
return Alg.fromString(
|
|
338
|
-
await cwi.insideAPI.solveMegaminxToString(
|
|
340
|
+
await cwi.insideAPI.solveMegaminxToString(pattern.patternData)
|
|
339
341
|
);
|
|
340
342
|
}
|
|
341
|
-
async function solveTwsearch(kpuzzle,
|
|
342
|
-
const {
|
|
343
|
+
async function solveTwsearch(kpuzzle, pattern, options) {
|
|
344
|
+
const { startPattern, ...otherOptions } = options ?? {};
|
|
343
345
|
const apiOptions = otherOptions;
|
|
344
|
-
if (
|
|
345
|
-
apiOptions.
|
|
346
|
+
if (startPattern) {
|
|
347
|
+
apiOptions.startPattern = startPattern.experimentalToTransformation().transformationData;
|
|
346
348
|
}
|
|
347
349
|
const { ...def } = kpuzzle.definition;
|
|
348
|
-
delete def.
|
|
350
|
+
delete def.experimentalIsPatternSolved;
|
|
349
351
|
const dedicatedWorker = await instantiateWorker();
|
|
350
352
|
try {
|
|
351
353
|
return Alg.fromString(
|
|
352
354
|
await dedicatedWorker.insideAPI.solveTwsearchToString(
|
|
353
355
|
def,
|
|
354
|
-
|
|
356
|
+
pattern.patternData,
|
|
355
357
|
apiOptions
|
|
356
358
|
)
|
|
357
359
|
);
|
|
@@ -402,4 +404,4 @@ export {
|
|
|
402
404
|
solveTwsearch,
|
|
403
405
|
setSearchDebug
|
|
404
406
|
};
|
|
405
|
-
//# sourceMappingURL=chunk-
|
|
407
|
+
//# sourceMappingURL=chunk-XODLDV3Q.js.map
|