cubing 0.40.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/esm/bluetooth/index.js +7 -7
  2. package/dist/esm/bluetooth/index.js.map +2 -2
  3. package/dist/esm/{chunk-2UHC65GH.js → chunk-2MAPPPWG.js} +5 -5
  4. package/dist/esm/chunk-2MAPPPWG.js.map +7 -0
  5. package/dist/esm/{chunk-ZILJKTYP.js → chunk-BTVDGT5H.js} +17 -17
  6. package/dist/esm/{chunk-JXW26CFJ.js → chunk-DNOZJX34.js} +3 -3
  7. package/dist/esm/{chunk-F6V2QBMP.js → chunk-F72PPD54.js} +72 -64
  8. package/dist/esm/chunk-F72PPD54.js.map +7 -0
  9. package/dist/esm/{chunk-TKIXG2EX.js → chunk-LWPMAFQX.js} +8 -8
  10. package/dist/esm/chunk-LWPMAFQX.js.map +7 -0
  11. package/dist/esm/{chunk-TBVTYIMY.js → chunk-QFJEREMI.js} +3 -3
  12. package/dist/esm/chunk-QFJEREMI.js.map +7 -0
  13. package/dist/esm/{chunk-IZJ3YK5S.js → chunk-RYRRMKVS.js} +14 -13
  14. package/dist/esm/chunk-RYRRMKVS.js.map +7 -0
  15. package/dist/esm/{chunk-NBVZ7LEM.js → chunk-SNYTAYI2.js} +95 -105
  16. package/dist/esm/chunk-SNYTAYI2.js.map +7 -0
  17. package/dist/esm/{chunk-NZAWY3EU.js → chunk-UOO5TXR6.js} +29 -29
  18. package/dist/esm/chunk-UOO5TXR6.js.map +7 -0
  19. package/dist/esm/{chunk-45VMKYXT.js → chunk-VRFVPBCT.js} +3 -5
  20. package/dist/esm/chunk-VRFVPBCT.js.map +7 -0
  21. package/dist/esm/inside-DLVM67HZ.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 +7 -7
  34. package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js → search-dynamic-sgs-side-events-7RLPMUUQ.js} +5 -5
  35. package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js → search-dynamic-sgs-unofficial-IXO75L3Y.js} +5 -5
  36. package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js → search-dynamic-solve-4x4x4-IP6UC7HF.js} +5 -5
  37. package/dist/esm/search-worker-entry.js.js +1 -1
  38. package/dist/esm/twisty/index.js +28 -22
  39. package/dist/esm/twisty/index.js.map +2 -2
  40. package/dist/esm/{twisty-dynamic-3d-EI5ZUVCP.js → twisty-dynamic-3d-6SRUMP27.js} +13 -13
  41. package/dist/esm/twisty-dynamic-3d-6SRUMP27.js.map +7 -0
  42. package/dist/esm/{twsearch-ZALDQ4TE.js → twsearch-D6TM63UU.js} +8 -8
  43. package/dist/esm/twsearch-D6TM63UU.js.map +7 -0
  44. package/dist/types/{KState-33ce1f57.d.ts → KPattern-85fd8579.d.ts} +33 -29
  45. package/dist/types/{TwizzleLink-19143923.d.ts → TwizzleLink-7d147be8.d.ts} +7 -7
  46. package/dist/types/bluetooth/index.d.ts +6 -6
  47. package/dist/types/{bluetooth-puzzle-29072a56.d.ts → bluetooth-puzzle-da601f13.d.ts} +3 -3
  48. package/dist/types/kpuzzle/index.d.ts +1 -1
  49. package/dist/types/notation/index.d.ts +2 -2
  50. package/dist/types/{outside-b7760f77.d.ts → outside-51ce651a.d.ts} +8 -8
  51. package/dist/types/protocol/index.d.ts +4 -4
  52. package/dist/types/puzzle-geometry/index.d.ts +2 -2
  53. package/dist/types/puzzles/index.d.ts +3 -3
  54. package/dist/types/scramble/index.d.ts +2 -2
  55. package/dist/types/search/index.d.ts +3 -3
  56. package/dist/types/stream/index.d.ts +2 -2
  57. package/dist/types/twisty/index.d.ts +7 -7
  58. package/package.json +1 -1
  59. package/dist/esm/chunk-2UHC65GH.js.map +0 -7
  60. package/dist/esm/chunk-45VMKYXT.js.map +0 -7
  61. package/dist/esm/chunk-F6V2QBMP.js.map +0 -7
  62. package/dist/esm/chunk-IZJ3YK5S.js.map +0 -7
  63. package/dist/esm/chunk-NBVZ7LEM.js.map +0 -7
  64. package/dist/esm/chunk-NZAWY3EU.js.map +0 -7
  65. package/dist/esm/chunk-TBVTYIMY.js.map +0 -7
  66. package/dist/esm/chunk-TKIXG2EX.js.map +0 -7
  67. package/dist/esm/inside-BGMQCQ2A.js +0 -17
  68. package/dist/esm/puzzles-dynamic-side-events-DHAI7HWB.js.map +0 -7
  69. package/dist/esm/twisty-dynamic-3d-EI5ZUVCP.js.map +0 -7
  70. package/dist/esm/twsearch-ZALDQ4TE.js.map +0 -7
  71. /package/dist/esm/{chunk-ZILJKTYP.js.map → chunk-BTVDGT5H.js.map} +0 -0
  72. /package/dist/esm/{chunk-JXW26CFJ.js.map → chunk-DNOZJX34.js.map} +0 -0
  73. /package/dist/esm/{inside-BGMQCQ2A.js.map → inside-DLVM67HZ.js.map} +0 -0
  74. /package/dist/esm/{search-dynamic-sgs-side-events-LBEIUPJE.js.map → search-dynamic-sgs-side-events-7RLPMUUQ.js.map} +0 -0
  75. /package/dist/esm/{search-dynamic-sgs-unofficial-PHDE4BVE.js.map → search-dynamic-sgs-unofficial-IXO75L3Y.js.map} +0 -0
  76. /package/dist/esm/{search-dynamic-solve-4x4x4-EJB3WWMV.js.map → search-dynamic-solve-4x4x4-IP6UC7HF.js.map} +0 -0
@@ -11,10 +11,10 @@ import {
11
11
  experimental3x3x3KPuzzle,
12
12
  from,
13
13
  getCached
14
- } from "./chunk-NBVZ7LEM.js";
14
+ } from "./chunk-SNYTAYI2.js";
15
15
  import {
16
16
  KPuzzle
17
- } from "./chunk-F6V2QBMP.js";
17
+ } from "./chunk-F72PPD54.js";
18
18
  import {
19
19
  Move,
20
20
  QuantumMove
@@ -69,12 +69,12 @@ var cube2x2x2 = {
69
69
  fullName: "2\xD72\xD72 Cube",
70
70
  kpuzzle: getCached(
71
71
  async () => new KPuzzle(
72
- (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).cube2x2x2JSON
72
+ (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).cube2x2x2JSON
73
73
  )
74
74
  ),
75
- svg: async () => (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).cube2x2x2SVG,
75
+ svg: async () => (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).cube2x2x2SVG,
76
76
  llSVG: getCached(
77
- async () => (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).cube2x2x2LLSVG
77
+ async () => (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).cube2x2x2LLSVG
78
78
  ),
79
79
  pg: getCached(async () => {
80
80
  return asyncGetPuzzleGeometry("2x2x2");
@@ -343,11 +343,11 @@ var clock = {
343
343
  // Patent application year: https://www.jaapsch.net/puzzles/patents/us4869506.pdf
344
344
  kpuzzle: getCached(
345
345
  async () => new KPuzzle(
346
- (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).clockJSON
346
+ (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).clockJSON
347
347
  )
348
348
  ),
349
349
  svg: getCached(async () => {
350
- return (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).clockSVG;
350
+ return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).clockSVG;
351
351
  })
352
352
  };
353
353
 
@@ -457,7 +457,7 @@ var FTOPuzzleLoader = class extends PGPuzzleLoader {
457
457
  });
458
458
  this.stickerings = ftoStickerings;
459
459
  this.svg = getCached(async () => {
460
- return (await import("./puzzles-dynamic-unofficial-QXSDLTK5.js")).ftoSVG;
460
+ return (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).ftoSVG;
461
461
  });
462
462
  }
463
463
  stickeringMask(stickering) {
@@ -513,7 +513,7 @@ var PyraminxPuzzleLoader = class extends PGPuzzleLoader {
513
513
  inventedBy: ["Uwe Meffert"]
514
514
  });
515
515
  this.svg = getCached(async () => {
516
- return (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).pyraminxSVG;
516
+ return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).pyraminxSVG;
517
517
  });
518
518
  }
519
519
  };
@@ -528,11 +528,11 @@ var square1 = {
528
528
  // Czech patent application year: http://spisy.upv.cz/Patents/FullDocuments/277/277266.pdf
529
529
  kpuzzle: getCached(
530
530
  async () => new KPuzzle(
531
- (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).sq1HyperOrbitJSON
531
+ (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).sq1HyperOrbitJSON
532
532
  )
533
533
  ),
534
534
  svg: getCached(async () => {
535
- return (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).sq1HyperOrbitSVG;
535
+ return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).sq1HyperOrbitSVG;
536
536
  })
537
537
  };
538
538
 
@@ -552,7 +552,7 @@ var kilominx = {
552
552
  includeEdgeOrbits: false
553
553
  }),
554
554
  svg: getCached(async () => {
555
- return (await import("./puzzles-dynamic-unofficial-QXSDLTK5.js")).kilominxSVG;
555
+ return (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).kilominxSVG;
556
556
  })
557
557
  };
558
558
 
@@ -566,11 +566,11 @@ var rediCube = {
566
566
  inventionYear: 2009,
567
567
  kpuzzle: getCached(
568
568
  async () => new KPuzzle(
569
- (await import("./puzzles-dynamic-unofficial-QXSDLTK5.js")).rediCubeJSON
569
+ (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).rediCubeJSON
570
570
  )
571
571
  ),
572
572
  svg: async () => {
573
- return (await import("./puzzles-dynamic-unofficial-QXSDLTK5.js")).rediCubeSVG;
573
+ return (await import("./puzzles-dynamic-unofficial-PCHNKY4Y.js")).rediCubeSVG;
574
574
  }
575
575
  };
576
576
 
@@ -591,11 +591,11 @@ var melindas2x2x2x2 = {
591
591
  // inventionYear: 20__, // TODO
592
592
  kpuzzle: getCached(
593
593
  async () => new KPuzzle(
594
- (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).melindas2x2x2x2OrbitJSON
594
+ (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).melindas2x2x2x2OrbitJSON
595
595
  )
596
596
  ),
597
597
  svg: getCached(async () => {
598
- return (await import("./puzzles-dynamic-side-events-DHAI7HWB.js")).melindas2x2x2x2OrbitSVG;
598
+ return (await import("./puzzles-dynamic-side-events-42Q52YAB.js")).melindas2x2x2x2OrbitSVG;
599
599
  })
600
600
  };
601
601
 
@@ -660,4 +660,4 @@ export {
660
660
  cube3x3x3,
661
661
  puzzles
662
662
  };
663
- //# sourceMappingURL=chunk-ZILJKTYP.js.map
663
+ //# sourceMappingURL=chunk-BTVDGT5H.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  from
3
- } from "./chunk-NBVZ7LEM.js";
3
+ } from "./chunk-SNYTAYI2.js";
4
4
 
5
5
  // src/cubing/twisty/debug.ts
6
6
  var twistyDebugGlobals = {
@@ -541,7 +541,7 @@ var StatsPanel = class {
541
541
  // src/cubing/twisty/heavy-code-imports/3d.ts
542
542
  var cachedConstructorProxy = null;
543
543
  async function proxy3D() {
544
- return cachedConstructorProxy ?? (cachedConstructorProxy = import("./twisty-dynamic-3d-EI5ZUVCP.js"));
544
+ return cachedConstructorProxy ?? (cachedConstructorProxy = import("./twisty-dynamic-3d-6SRUMP27.js"));
545
545
  }
546
546
  var THREEJS = from(
547
547
  async () => (await proxy3D()).T3I
@@ -1175,4 +1175,4 @@ export {
1175
1175
  proxy3D,
1176
1176
  THREEJS
1177
1177
  };
1178
- //# sourceMappingURL=chunk-JXW26CFJ.js.map
1178
+ //# sourceMappingURL=chunk-DNOZJX34.js.map
@@ -8,39 +8,38 @@ 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
  }
@@ -49,15 +48,14 @@ function combineTransformationData(definition, transformationData1, transformati
49
48
  }
50
49
  function applyTransformationDataToStateData(definition, stateData, transformationData) {
51
50
  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];
51
+ for (const orbitDefinition of definition.orbits) {
52
+ const stateOrbit = stateData[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
+ newStateData[orbitDefinition.orbitName] = stateOrbit;
61
59
  } else {
62
60
  const newPieces = new Array(orbitDefinition.numPieces);
63
61
  if (orbitDefinition.numOrientations === 1) {
@@ -69,7 +67,7 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
69
67
  orientation: stateOrbit.orientation
70
68
  // copy all 0
71
69
  };
72
- newStateData[orbitName] = newOrbitData;
70
+ newStateData[orbitDefinition.orbitName] = newOrbitData;
73
71
  } else {
74
72
  const newOrientation = new Array(orbitDefinition.numPieces);
75
73
  const newOrientationMod = stateOrbit.orientationMod ? new Array(orbitDefinition.numPieces) : void 0;
@@ -81,7 +79,7 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
81
79
  newOrientationMod[idx] = orientationMod;
82
80
  mod = orientationMod || orbitDefinition.numOrientations;
83
81
  }
84
- newOrientation[idx] = (stateOrbit.orientation[transformationIdx] + transformationOrbit.orientation[idx]) % mod;
82
+ newOrientation[idx] = (stateOrbit.orientation[transformationIdx] + transformationOrbit.orientationDelta[idx]) % mod;
85
83
  newPieces[idx] = stateOrbit.pieces[transformationIdx];
86
84
  }
87
85
  const newOrbitData = {
@@ -91,7 +89,7 @@ function applyTransformationDataToStateData(definition, stateData, transformatio
91
89
  if (newOrientationMod) {
92
90
  newOrbitData.orientationMod = newOrientationMod;
93
91
  }
94
- newStateData[orbitName] = newOrbitData;
92
+ newStateData[orbitDefinition.orbitName] = newOrbitData;
95
93
  }
96
94
  }
97
95
  }
@@ -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,8 +159,8 @@ 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 {
162
+ // src/cubing/kpuzzle/KPattern.ts
163
+ var KPattern = class _KPattern {
170
164
  constructor(kpuzzle, stateData) {
171
165
  this.kpuzzle = kpuzzle;
172
166
  this.stateData = stateData;
@@ -180,10 +174,10 @@ var KState = class _KState {
180
174
  static fromTransformation(transformation) {
181
175
  const newStateData = applyTransformationDataToStateData(
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, newStateData);
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.stateData);
196
190
  }
197
191
  const newStateData = applyTransformationDataToStateData(
198
192
  this.kpuzzle.definition,
199
193
  this.stateData,
200
194
  transformation.transformationData
201
195
  );
202
- return new _KState(this.kpuzzle, newStateData);
196
+ return new _KPattern(this.kpuzzle, newStateData);
203
197
  }
204
198
  applyMove(move) {
205
199
  return this.applyTransformation(this.kpuzzle.moveToTransformation(move));
@@ -216,7 +210,7 @@ var KState = class _KState {
216
210
  for (const [orbitName, stateOrbitData] of Object.entries(this.stateData)) {
217
211
  const transformationOrbit = {
218
212
  permutation: stateOrbitData.pieces,
219
- orientation: stateOrbitData.orientation
213
+ orientationDelta: stateOrbitData.orientation
220
214
  };
221
215
  transformationData[orbitName] = transformationOrbit;
222
216
  }
@@ -225,7 +219,7 @@ var KState = class _KState {
225
219
  experimentalIsSolved(options) {
226
220
  if (!this.kpuzzle.definition.experimentalIsStateSolved) {
227
221
  throw new Error(
228
- "`KState.experimentalIsSolved()` is not supported for this puzzle at the moment."
222
+ "`KPattern.experimentalIsSolved()` is not supported for this puzzle at the moment."
229
223
  );
230
224
  }
231
225
  return this.kpuzzle.definition.experimentalIsStateSolved(this, options);
@@ -310,8 +304,8 @@ var KTransformation = class _KTransformation {
310
304
  return this.applyTransformation(this.kpuzzle.algToTransformation(alg));
311
305
  }
312
306
  // Convenience. Useful for chaining.
313
- toKState() {
314
- return KState.fromTransformation(this);
307
+ toKPattern() {
308
+ return KPattern.fromTransformation(this);
315
309
  }
316
310
  repetitionOrder() {
317
311
  return transformationRepetitionOrder(this.kpuzzle.definition, this);
@@ -330,6 +324,9 @@ var KTransformation = class _KTransformation {
330
324
 
331
325
  // src/cubing/kpuzzle/calculate.ts
332
326
  function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransformationData) {
327
+ if (!orbitTransformationData.permutation) {
328
+ console.log(orbitTransformationData);
329
+ }
333
330
  const { permutation } = orbitTransformationData;
334
331
  const numPieces = permutation.length;
335
332
  for (let idx = 0; idx < numPieces; idx++) {
@@ -338,7 +335,7 @@ function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransfo
338
335
  }
339
336
  }
340
337
  if (numOrientations > 1) {
341
- const { orientation } = orbitTransformationData;
338
+ const { orientationDelta: orientation } = orbitTransformationData;
342
339
  for (let idx = 0; idx < numPieces; idx++) {
343
340
  if (orientation[idx] !== 0) {
344
341
  return false;
@@ -349,7 +346,7 @@ function isOrbitTransformationDataIdentityUncached(numOrientations, orbitTransfo
349
346
  }
350
347
  function isOrbitTransformationDataIdentical(orbitDefinition, orbitTransformationData1, orbitTransformationData2, options = {}) {
351
348
  for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
352
- if (!options?.ignoreOrientation && orbitTransformationData1.orientation[idx] !== orbitTransformationData2.orientation[idx]) {
349
+ if (!options?.ignoreOrientation && orbitTransformationData1.orientationDelta[idx] !== orbitTransformationData2.orientationDelta[idx]) {
353
350
  return false;
354
351
  }
355
352
  if (!options?.ignorePermutation && orbitTransformationData1.permutation[idx] !== orbitTransformationData2.permutation[idx]) {
@@ -359,13 +356,11 @@ function isOrbitTransformationDataIdentical(orbitDefinition, orbitTransformation
359
356
  return true;
360
357
  }
361
358
  function isTransformationDataIdentical(kpuzzle, transformationData1, transformationData2) {
362
- for (const [orbitName, orbitDefinition] of Object.entries(
363
- kpuzzle.definition.orbits
364
- )) {
359
+ for (const orbitDefinition of kpuzzle.definition.orbits) {
365
360
  if (!isOrbitTransformationDataIdentical(
366
361
  orbitDefinition,
367
- transformationData1[orbitName],
368
- transformationData2[orbitName]
362
+ transformationData1[orbitDefinition.orbitName],
363
+ transformationData2[orbitDefinition.orbitName]
369
364
  )) {
370
365
  return false;
371
366
  }
@@ -374,22 +369,21 @@ function isTransformationDataIdentical(kpuzzle, transformationData1, transformat
374
369
  }
375
370
  function invertTransformation(kpuzzle, transformationData) {
376
371
  const newTransformationData = {};
377
- for (const orbitName in kpuzzle.definition.orbits) {
378
- const orbitDefinition = kpuzzle.definition.orbits[orbitName];
379
- const orbitTransformationData = transformationData[orbitName];
372
+ for (const orbitDefinition of kpuzzle.definition.orbits) {
373
+ const orbitTransformationData = transformationData[orbitDefinition.orbitName];
380
374
  if (isOrbitTransformationDataIdentityUncached(
381
375
  orbitDefinition.numOrientations,
382
376
  orbitTransformationData
383
377
  )) {
384
- newTransformationData[orbitName] = orbitTransformationData;
378
+ newTransformationData[orbitDefinition.orbitName] = orbitTransformationData;
385
379
  } else if (orbitDefinition.numOrientations === 1) {
386
380
  const newPerm = new Array(orbitDefinition.numPieces);
387
381
  for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
388
382
  newPerm[orbitTransformationData.permutation[idx]] = idx;
389
383
  }
390
- newTransformationData[orbitName] = {
384
+ newTransformationData[orbitDefinition.orbitName] = {
391
385
  permutation: newPerm,
392
- orientation: orbitTransformationData.orientation
386
+ orientationDelta: orbitTransformationData.orientationDelta
393
387
  };
394
388
  } else {
395
389
  const newPerm = new Array(orbitDefinition.numPieces);
@@ -397,11 +391,11 @@ function invertTransformation(kpuzzle, transformationData) {
397
391
  for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
398
392
  const fromIdx = orbitTransformationData.permutation[idx];
399
393
  newPerm[fromIdx] = idx;
400
- newOri[fromIdx] = (orbitDefinition.numOrientations - orbitTransformationData.orientation[idx] + orbitDefinition.numOrientations) % orbitDefinition.numOrientations;
394
+ newOri[fromIdx] = (orbitDefinition.numOrientations - orbitTransformationData.orientationDelta[idx] + orbitDefinition.numOrientations) % orbitDefinition.numOrientations;
401
395
  }
402
- newTransformationData[orbitName] = {
396
+ newTransformationData[orbitDefinition.orbitName] = {
403
397
  permutation: newPerm,
404
- orientation: newOri
398
+ orientationDelta: newOri
405
399
  };
406
400
  }
407
401
  }
@@ -504,9 +498,8 @@ function gcd(a, b) {
504
498
  }
505
499
  function transformationRepetitionOrder(definition, transformation) {
506
500
  let order = 1;
507
- for (const orbitName in definition.orbits) {
508
- const orbitDefinition = definition.orbits[orbitName];
509
- const transformationOrbit = transformation.transformationData[orbitName];
501
+ for (const orbitDefinition of definition.orbits) {
502
+ const transformationOrbit = transformation.transformationData[orbitDefinition.orbitName];
510
503
  const orbitPieces = new Array(orbitDefinition.numPieces);
511
504
  for (let startIdx = 0; startIdx < orbitDefinition.numPieces; startIdx++) {
512
505
  if (!orbitPieces[startIdx]) {
@@ -515,7 +508,7 @@ function transformationRepetitionOrder(definition, transformation) {
515
508
  let cycleLength = 0;
516
509
  for (; ; ) {
517
510
  orbitPieces[currentIdx] = true;
518
- orientationSum = orientationSum + transformationOrbit.orientation[currentIdx];
511
+ orientationSum = orientationSum + transformationOrbit.orientationDelta[currentIdx];
519
512
  cycleLength = cycleLength + 1;
520
513
  currentIdx = transformationOrbit.permutation[currentIdx];
521
514
  if (currentIdx === startIdx) {
@@ -539,6 +532,23 @@ var KPuzzle = class {
539
532
  this.#moveToTransformationDataCache = /* @__PURE__ */ new Map();
540
533
  this.experimentalPGNotation = options?.experimentalPGNotation;
541
534
  }
535
+ #indexedOrbits;
536
+ // Note: this function is needed much more rarely than you might think. Most
537
+ // operations related to orbits require iterating through all of them, for
538
+ // which the following is better:
539
+ //
540
+ // for (const orbitDefinition of kpuzzle.definition.orbits) { // …
541
+ // }
542
+ lookupOrbitDefinition(orbitName) {
543
+ this.#indexedOrbits || (this.#indexedOrbits = (() => {
544
+ const indexedOrbits = {};
545
+ for (const orbitDefinition of this.definition.orbits) {
546
+ indexedOrbits[orbitDefinition.orbitName] = orbitDefinition;
547
+ }
548
+ return indexedOrbits;
549
+ })());
550
+ return this.#indexedOrbits[orbitName];
551
+ }
542
552
  name() {
543
553
  return this.definition.name;
544
554
  }
@@ -586,17 +596,15 @@ var KPuzzle = class {
586
596
  }
587
597
  }
588
598
  startState() {
589
- return new KState(this, this.definition.startStateData);
599
+ return new KPattern(this, this.definition.defaultPattern);
590
600
  }
591
601
  #cachedCanConvertStateToUniqueTransformation;
592
602
  // TODO: Handle incomplete start state data
593
603
  canConvertStateToUniqueTransformation() {
594
604
  return this.#cachedCanConvertStateToUniqueTransformation ?? (this.#cachedCanConvertStateToUniqueTransformation = (() => {
595
- for (const [orbitName, orbitDefinition] of Object.entries(
596
- this.definition.orbits
597
- )) {
605
+ for (const orbitDefinition of this.definition.orbits) {
598
606
  const pieces = new Array(orbitDefinition.numPieces).fill(false);
599
- for (const piece of this.definition.startStateData[orbitName].pieces) {
607
+ for (const piece of this.definition.defaultPattern[orbitDefinition.orbitName].pieces) {
600
608
  pieces[piece] = true;
601
609
  }
602
610
  for (const piece of pieces) {
@@ -611,8 +619,8 @@ var KPuzzle = class {
611
619
  };
612
620
 
613
621
  export {
614
- KState,
622
+ KPattern,
615
623
  KTransformation,
616
624
  KPuzzle
617
625
  };
618
- //# sourceMappingURL=chunk-F6V2QBMP.js.map
626
+ //# sourceMappingURL=chunk-F72PPD54.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 applyTransformationDataToStateData(\n definition: KPuzzleDefinition,\n stateData: KPatternData,\n transformationData: KTransformationData,\n): KPatternData {\n const newStateData = {} as KPatternData;\n for (const orbitDefinition of definition.orbits) {\n const stateOrbit = stateData[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 newStateData[orbitDefinition.orbitName] = stateOrbit;\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 stateOrbit.pieces[transformationOrbit.permutation[idx]];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: stateOrbit.orientation, // copy all 0\n };\n newStateData[orbitDefinition.orbitName] = newOrbitData;\n } else {\n const newOrientation = new Array(orbitDefinition.numPieces);\n const newOrientationMod: number[] | undefined =\n stateOrbit.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 (stateOrbit.orientationMod) {\n const orientationMod = stateOrbit.orientationMod[transformationIdx];\n newOrientationMod![idx] = orientationMod;\n mod = orientationMod || orbitDefinition.numOrientations;\n }\n newOrientation[idx] =\n (stateOrbit.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] = stateOrbit.pieces[transformationIdx];\n }\n const newOrbitData: KPatternOrbitData = {\n pieces: newPieces,\n orientation: newOrientation,\n };\n if (newOrientationMod) {\n newOrbitData.orientationMod = newOrientationMod;\n }\n newStateData[orbitDefinition.orbitName] = newOrbitData;\n }\n }\n }\n return newStateData;\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 { applyTransformationDataToStateData } 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 stateData: KPatternData,\n ) {}\n\n toJSON(): any {\n return {\n experimentalPuzzleName: this.kpuzzle.name(),\n stateData: this.stateData,\n };\n }\n\n static fromTransformation(transformation: KTransformation): KPattern {\n const newStateData = applyTransformationDataToStateData(\n transformation.kpuzzle.definition,\n transformation.kpuzzle.definition.defaultPattern,\n transformation.transformationData,\n );\n return new KPattern(transformation.kpuzzle, newStateData);\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.stateData);\n }\n const newStateData = applyTransformationDataToStateData(\n this.kpuzzle.definition,\n this.stateData,\n transformation.transformationData,\n );\n return new KPattern(this.kpuzzle, newStateData);\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.canConvertStateToUniqueTransformation()) {\n return null;\n }\n const transformationData: KTransformationData = {};\n for (const [orbitName, stateOrbitData] of Object.entries(this.stateData)) {\n const transformationOrbit: KTransformationOrbitData = {\n permutation: stateOrbitData.pieces,\n orientationDelta: stateOrbitData.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.experimentalIsStateSolved) {\n throw new Error(\n \"`KPattern.experimentalIsSolved()` is not supported for this puzzle at the moment.\",\n );\n }\n return this.kpuzzle.definition.experimentalIsStateSolved(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 canConvertStateToUniqueTransformationUncached(\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 startState(): KPattern {\n return new KPattern(this, this.definition.defaultPattern);\n }\n\n #cachedCanConvertStateToUniqueTransformation: boolean | undefined;\n // TODO: Handle incomplete start state data\n canConvertStateToUniqueTransformation(): boolean {\n return (this.#cachedCanConvertStateToUniqueTransformation ??=\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,12 +1,12 @@
1
1
  import {
2
2
  puzzles
3
- } from "./chunk-ZILJKTYP.js";
3
+ } from "./chunk-BTVDGT5H.js";
4
4
  import {
5
5
  from
6
- } from "./chunk-NBVZ7LEM.js";
6
+ } from "./chunk-SNYTAYI2.js";
7
7
  import {
8
- KState
9
- } from "./chunk-F6V2QBMP.js";
8
+ KPattern
9
+ } from "./chunk-F72PPD54.js";
10
10
  import {
11
11
  Alg,
12
12
  AlgBuilder,
@@ -142,7 +142,7 @@ function toMin2PhaseState(state) {
142
142
 
143
143
  // src/cubing/search/inside/solve/puzzles/3x3x3/filter.ts
144
144
  function isEquivalentTranformationIgnoringCENTERS(t1, t2) {
145
- const t1NoCenterOri = new KState(t1.kpuzzle, {
145
+ const t1NoCenterOri = new KPattern(t1.kpuzzle, {
146
146
  EDGES: t1.stateData.EDGES,
147
147
  CORNERS: t1.stateData.CORNERS,
148
148
  CENTERS: {
@@ -150,7 +150,7 @@ function isEquivalentTranformationIgnoringCENTERS(t1, t2) {
150
150
  orientation: new Array(6).fill(0)
151
151
  }
152
152
  }).experimentalToTransformation();
153
- const t2NoCenterOri = new KState(t2.kpuzzle, {
153
+ const t2NoCenterOri = new KPattern(t2.kpuzzle, {
154
154
  EDGES: t2.stateData.EDGES,
155
155
  CORNERS: t2.stateData.CORNERS,
156
156
  CENTERS: {
@@ -166,7 +166,7 @@ function passesFilter(kpuzzle, state) {
166
166
  }
167
167
  for (const face of "ULFRBD") {
168
168
  for (let amount = 1; amount < 4; amount++) {
169
- const transformation = kpuzzle.moveToTransformation(new Move(face, amount)).toKState();
169
+ const transformation = kpuzzle.moveToTransformation(new Move(face, amount)).toKPattern();
170
170
  if (isEquivalentTranformationIgnoringCENTERS(transformation, state)) {
171
171
  return false;
172
172
  }
@@ -612,4 +612,4 @@ export {
612
612
  random333OrientedScramble,
613
613
  random333FewestMovesScramble
614
614
  };
615
- //# sourceMappingURL=chunk-TKIXG2EX.js.map
615
+ //# sourceMappingURL=chunk-LWPMAFQX.js.map