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.
Files changed (80) hide show
  1. package/dist/esm/bluetooth/index.js +41 -41
  2. package/dist/esm/bluetooth/index.js.map +3 -3
  3. package/dist/esm/{chunk-2UHC65GH.js → chunk-3B5ND2Z3.js} +25 -23
  4. package/dist/esm/chunk-3B5ND2Z3.js.map +7 -0
  5. package/dist/esm/{chunk-NZAWY3EU.js → chunk-3RHBVKV2.js} +98 -89
  6. package/dist/esm/chunk-3RHBVKV2.js.map +7 -0
  7. package/dist/esm/{chunk-45VMKYXT.js → chunk-6FC7BO5U.js} +3 -5
  8. package/dist/esm/chunk-6FC7BO5U.js.map +7 -0
  9. package/dist/esm/{chunk-TKIXG2EX.js → chunk-GXXHRHE5.js} +35 -35
  10. package/dist/esm/chunk-GXXHRHE5.js.map +7 -0
  11. package/dist/esm/{chunk-NBVZ7LEM.js → chunk-H66X47MG.js} +115 -125
  12. package/dist/esm/chunk-H66X47MG.js.map +7 -0
  13. package/dist/esm/{chunk-JXW26CFJ.js → chunk-LRYMCZVI.js} +3 -3
  14. package/dist/esm/{chunk-ZILJKTYP.js → chunk-Q7UVEISQ.js} +17 -17
  15. package/dist/esm/{chunk-IZJ3YK5S.js → chunk-RYRRMKVS.js} +14 -13
  16. package/dist/esm/chunk-RYRRMKVS.js.map +7 -0
  17. package/dist/esm/{chunk-F6V2QBMP.js → chunk-V4YTFIKT.js} +99 -89
  18. package/dist/esm/chunk-V4YTFIKT.js.map +7 -0
  19. package/dist/esm/{chunk-TBVTYIMY.js → chunk-XODLDV3Q.js} +25 -23
  20. package/dist/esm/chunk-XODLDV3Q.js.map +7 -0
  21. package/dist/esm/inside-GPSEWHK7.js +17 -0
  22. package/dist/esm/kpuzzle/index.js +3 -3
  23. package/dist/esm/notation/index.js +3 -3
  24. package/dist/esm/protocol/index.js +3 -3
  25. package/dist/esm/puzzle-geometry/index.js +43 -26
  26. package/dist/esm/puzzle-geometry/index.js.map +2 -2
  27. package/dist/esm/puzzles/index.js +3 -3
  28. package/dist/esm/{puzzles-dynamic-side-events-DHAI7HWB.js → puzzles-dynamic-side-events-42Q52YAB.js} +157 -85
  29. package/dist/esm/puzzles-dynamic-side-events-42Q52YAB.js.map +7 -0
  30. package/dist/esm/{puzzles-dynamic-unofficial-QXSDLTK5.js → puzzles-dynamic-unofficial-PCHNKY4Y.js} +13 -13
  31. package/dist/esm/{puzzles-dynamic-unofficial-QXSDLTK5.js.map → puzzles-dynamic-unofficial-PCHNKY4Y.js.map} +2 -2
  32. package/dist/esm/scramble/index.js +7 -7
  33. package/dist/esm/search/index.js +9 -9
  34. package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js → search-dynamic-sgs-side-events-4ZHROANX.js} +5 -5
  35. package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js → search-dynamic-sgs-unofficial-VKBYULK5.js} +5 -5
  36. package/dist/esm/{search-dynamic-solve-3x3x3-7EEK52SV.js → search-dynamic-solve-3x3x3-NULYS7OL.js} +3 -3
  37. package/dist/esm/{search-dynamic-solve-3x3x3-7EEK52SV.js.map → search-dynamic-solve-3x3x3-NULYS7OL.js.map} +2 -2
  38. package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js → search-dynamic-solve-4x4x4-KASG5V7K.js} +5 -5
  39. package/dist/esm/{search-dynamic-solve-sq1-CWJPRQVZ.js → search-dynamic-solve-sq1-TO7UHE6Y.js} +6 -6
  40. package/dist/esm/{search-dynamic-solve-sq1-CWJPRQVZ.js.map → search-dynamic-solve-sq1-TO7UHE6Y.js.map} +2 -2
  41. package/dist/esm/search-worker-entry.js.js +1 -1
  42. package/dist/esm/twisty/index.js +74 -66
  43. package/dist/esm/twisty/index.js.map +3 -3
  44. package/dist/esm/{twisty-dynamic-3d-EI5ZUVCP.js → twisty-dynamic-3d-5VC2L2WS.js} +19 -19
  45. package/dist/esm/twisty-dynamic-3d-5VC2L2WS.js.map +7 -0
  46. package/dist/esm/{twsearch-ZALDQ4TE.js → twsearch-OMTTOVJO.js} +15 -15
  47. package/dist/esm/twsearch-OMTTOVJO.js.map +7 -0
  48. package/dist/types/{KState-33ce1f57.d.ts → KPattern-12e23b1f.d.ts} +37 -33
  49. package/dist/types/{TwizzleLink-19143923.d.ts → TwizzleLink-8eaf164c.d.ts} +10 -10
  50. package/dist/types/bluetooth/index.d.ts +8 -8
  51. package/dist/types/{bluetooth-puzzle-29072a56.d.ts → bluetooth-puzzle-91e73b7f.d.ts} +3 -3
  52. package/dist/types/kpuzzle/index.d.ts +1 -1
  53. package/dist/types/notation/index.d.ts +2 -2
  54. package/dist/types/{outside-b7760f77.d.ts → outside-deaac55d.d.ts} +8 -8
  55. package/dist/types/protocol/index.d.ts +5 -5
  56. package/dist/types/puzzle-geometry/index.d.ts +2 -2
  57. package/dist/types/puzzles/index.d.ts +3 -3
  58. package/dist/types/scramble/index.d.ts +2 -2
  59. package/dist/types/search/index.d.ts +4 -4
  60. package/dist/types/stream/index.d.ts +2 -2
  61. package/dist/types/twisty/index.d.ts +7 -7
  62. package/package.json +1 -1
  63. package/dist/esm/chunk-2UHC65GH.js.map +0 -7
  64. package/dist/esm/chunk-45VMKYXT.js.map +0 -7
  65. package/dist/esm/chunk-F6V2QBMP.js.map +0 -7
  66. package/dist/esm/chunk-IZJ3YK5S.js.map +0 -7
  67. package/dist/esm/chunk-NBVZ7LEM.js.map +0 -7
  68. package/dist/esm/chunk-NZAWY3EU.js.map +0 -7
  69. package/dist/esm/chunk-TBVTYIMY.js.map +0 -7
  70. package/dist/esm/chunk-TKIXG2EX.js.map +0 -7
  71. package/dist/esm/inside-BGMQCQ2A.js +0 -17
  72. package/dist/esm/puzzles-dynamic-side-events-DHAI7HWB.js.map +0 -7
  73. package/dist/esm/twisty-dynamic-3d-EI5ZUVCP.js.map +0 -7
  74. package/dist/esm/twsearch-ZALDQ4TE.js.map +0 -7
  75. /package/dist/esm/{chunk-JXW26CFJ.js.map → chunk-LRYMCZVI.js.map} +0 -0
  76. /package/dist/esm/{chunk-ZILJKTYP.js.map → chunk-Q7UVEISQ.js.map} +0 -0
  77. /package/dist/esm/{inside-BGMQCQ2A.js.map → inside-GPSEWHK7.js.map} +0 -0
  78. /package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js.map → search-dynamic-sgs-side-events-4ZHROANX.js.map} +0 -0
  79. /package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js.map → search-dynamic-sgs-unofficial-VKBYULK5.js.map} +0 -0
  80. /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 orbitName in definition.orbits) {
12
- const orbitDefinition = definition.orbits[orbitName];
13
- const orbit1 = transformationData1[orbitName];
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
- orientation: orbit1.orientation
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.orientation[orbit2.permutation[idx]] + orbit2.orientation[idx]) % orbitDefinition.numOrientations;
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
- orientation: newOri
42
+ orientationDelta: newOri
44
43
  };
45
44
  }
46
45
  }
47
46
  }
48
47
  return newTransformationData;
49
48
  }
50
- function applyTransformationDataToStateData(definition, stateData, transformationData) {
51
- const newStateData = {};
52
- for (const orbitName in definition.orbits) {
53
- const orbitDefinition = definition.orbits[orbitName];
54
- const stateOrbit = stateData[orbitName];
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
- newStateData[orbitName] = stateOrbit;
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] = stateOrbit.pieces[transformationOrbit.permutation[idx]];
63
+ newPieces[idx] = patternOrbit.pieces[transformationOrbit.permutation[idx]];
66
64
  }
67
65
  const newOrbitData = {
68
66
  pieces: newPieces,
69
- orientation: stateOrbit.orientation
67
+ orientation: patternOrbit.orientation
70
68
  // copy all 0
71
69
  };
72
- newStateData[orbitName] = newOrbitData;
70
+ newPatternData[orbitDefinition.orbitName] = newOrbitData;
73
71
  } else {
74
72
  const newOrientation = new Array(orbitDefinition.numPieces);
75
- const newOrientationMod = stateOrbit.orientationMod ? new Array(orbitDefinition.numPieces) : void 0;
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 (stateOrbit.orientationMod) {
80
- const orientationMod = stateOrbit.orientationMod[transformationIdx];
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] = (stateOrbit.orientation[transformationIdx] + transformationOrbit.orientation[idx]) % mod;
85
- newPieces[idx] = stateOrbit.pieces[transformationIdx];
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
- newStateData[orbitName] = newOrbitData;
92
+ newPatternData[orbitDefinition.orbitName] = newOrbitData;
95
93
  }
96
94
  }
97
95
  }
98
- return newStateData;
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
- orientation: newOrientation
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 [orbitName, orbitDefinition] of Object.entries(
130
- definition.orbits
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.experimentalDerivedMoves?.[quantumKey];
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/KState.ts
169
- var KState = class _KState {
170
- constructor(kpuzzle, stateData) {
162
+ // src/cubing/kpuzzle/KPattern.ts
163
+ var KPattern = class _KPattern {
164
+ constructor(kpuzzle, patternData) {
171
165
  this.kpuzzle = kpuzzle;
172
- this.stateData = stateData;
166
+ this.patternData = patternData;
173
167
  }
174
168
  toJSON() {
175
169
  return {
176
170
  experimentalPuzzleName: this.kpuzzle.name(),
177
- stateData: this.stateData
171
+ patternData: this.patternData
178
172
  };
179
173
  }
180
174
  static fromTransformation(transformation) {
181
- const newStateData = applyTransformationDataToStateData(
175
+ const newPatternData = applyTransformationDataToKPatternData(
182
176
  transformation.kpuzzle.definition,
183
- transformation.kpuzzle.definition.startStateData,
177
+ transformation.kpuzzle.definition.defaultPattern,
184
178
  transformation.transformationData
185
179
  );
186
- return new _KState(transformation.kpuzzle, newStateData);
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 _KState(this.kpuzzle, this.stateData);
189
+ return new _KPattern(this.kpuzzle, this.patternData);
196
190
  }
197
- const newStateData = applyTransformationDataToStateData(
191
+ const newPatternData = applyTransformationDataToKPatternData(
198
192
  this.kpuzzle.definition,
199
- this.stateData,
193
+ this.patternData,
200
194
  transformation.transformationData
201
195
  );
202
- return new _KState(this.kpuzzle, newStateData);
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.canConvertStateToUniqueTransformation()) {
206
+ if (!this.kpuzzle.canConvertDefaultPatternToUniqueTransformation()) {
213
207
  return null;
214
208
  }
215
209
  const transformationData = {};
216
- for (const [orbitName, stateOrbitData] of Object.entries(this.stateData)) {
210
+ for (const [orbitName, patternOrbitData] of Object.entries(
211
+ this.patternData
212
+ )) {
217
213
  const transformationOrbit = {
218
- permutation: stateOrbitData.pieces,
219
- orientation: stateOrbitData.orientation
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.experimentalIsStateSolved) {
222
+ if (!this.kpuzzle.definition.experimentalIsPatternSolved) {
227
223
  throw new Error(
228
- "`KState.experimentalIsSolved()` is not supported for this puzzle at the moment."
224
+ "`KPattern.experimentalIsPatternSolved()` is not supported for this puzzle at the moment."
229
225
  );
230
226
  }
231
- return this.kpuzzle.definition.experimentalIsStateSolved(this, options);
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
- toKState() {
314
- return KState.fromTransformation(this);
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.orientation[idx] !== orbitTransformationData2.orientation[idx]) {
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 [orbitName, orbitDefinition] of Object.entries(
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 orbitName in kpuzzle.definition.orbits) {
378
- const orbitDefinition = kpuzzle.definition.orbits[orbitName];
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
- orientation: orbitTransformationData.orientation
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.orientation[idx] + orbitDefinition.numOrientations) % orbitDefinition.numOrientations;
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
- orientation: newOri
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 orbitName in definition.orbits) {
508
- const orbitDefinition = definition.orbits[orbitName];
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.orientation[currentIdx];
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
- startState() {
589
- return new KState(this, this.definition.startStateData);
600
+ defaultPattern() {
601
+ return new KPattern(this, this.definition.defaultPattern);
590
602
  }
591
- #cachedCanConvertStateToUniqueTransformation;
592
- // TODO: Handle incomplete start state data
593
- canConvertStateToUniqueTransformation() {
594
- return this.#cachedCanConvertStateToUniqueTransformation ?? (this.#cachedCanConvertStateToUniqueTransformation = (() => {
595
- for (const [orbitName, orbitDefinition] of Object.entries(
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.startStateData[orbitName].pieces) {
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
- KState,
624
+ KPattern,
615
625
  KTransformation,
616
626
  KPuzzle
617
627
  };
618
- //# sourceMappingURL=chunk-F6V2QBMP.js.map
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 && scriptOrigin !== null && !!workerOrigin && workerOrigin !== null && scriptOrigin !== workerOrigin;
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 insideAPI2 = wrap(worker);
217
+ const insideAPI = wrap(worker);
221
218
  const terminate = worker.terminate.bind(worker);
222
- return { insideAPI: insideAPI2, outsideAPI: { terminate } };
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(state) {
313
+ async function experimentalSolve3x3x3IgnoringCenters(pattern) {
316
314
  const cwi = await getCachedWorkerInstance();
317
- return Alg.fromString(await cwi.insideAPI.solve333ToString(state.stateData));
315
+ return Alg.fromString(
316
+ await cwi.insideAPI.solve333ToString(pattern.patternData)
317
+ );
318
318
  }
319
- async function experimentalSolve2x2x2(state) {
319
+ async function experimentalSolve2x2x2(pattern) {
320
320
  const cwi = await getCachedWorkerInstance();
321
- return Alg.fromString(await cwi.insideAPI.solve222ToString(state.stateData));
321
+ return Alg.fromString(
322
+ await cwi.insideAPI.solve222ToString(pattern.patternData)
323
+ );
322
324
  }
323
- async function solveSkewb(state) {
325
+ async function solveSkewb(pattern) {
324
326
  const cwi = await getCachedWorkerInstance();
325
327
  return Alg.fromString(
326
- await cwi.insideAPI.solveSkewbToString(state.stateData)
328
+ await cwi.insideAPI.solveSkewbToString(pattern.patternData)
327
329
  );
328
330
  }
329
- async function solvePyraminx(state) {
331
+ async function solvePyraminx(pattern) {
330
332
  const cwi = await getCachedWorkerInstance();
331
333
  return Alg.fromString(
332
- await cwi.insideAPI.solvePyraminxToString(state.stateData)
334
+ await cwi.insideAPI.solvePyraminxToString(pattern.patternData)
333
335
  );
334
336
  }
335
- async function solveMegaminx(state) {
337
+ async function solveMegaminx(pattern) {
336
338
  const cwi = await getCachedWorkerInstance();
337
339
  return Alg.fromString(
338
- await cwi.insideAPI.solveMegaminxToString(state.stateData)
340
+ await cwi.insideAPI.solveMegaminxToString(pattern.patternData)
339
341
  );
340
342
  }
341
- async function solveTwsearch(kpuzzle, state, options) {
342
- const { startState, ...otherOptions } = options ?? {};
343
+ async function solveTwsearch(kpuzzle, pattern, options) {
344
+ const { startPattern, ...otherOptions } = options ?? {};
343
345
  const apiOptions = otherOptions;
344
- if (startState) {
345
- apiOptions.startState = startState.experimentalToTransformation().transformationData;
346
+ if (startPattern) {
347
+ apiOptions.startPattern = startPattern.experimentalToTransformation().transformationData;
346
348
  }
347
349
  const { ...def } = kpuzzle.definition;
348
- delete def.experimentalIsStateSolved;
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
- state.stateData,
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-TBVTYIMY.js.map
407
+ //# sourceMappingURL=chunk-XODLDV3Q.js.map