cubing 0.56.0 → 0.57.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 (88) hide show
  1. package/dist/bin/chunks/{chunk-DFQMTDRG.js → chunk-J53ID3VX.js} +2 -2
  2. package/dist/bin/chunks/chunk-J53ID3VX.js.map +7 -0
  3. package/dist/bin/order.js +1 -1
  4. package/dist/bin/order.js.map +2 -2
  5. package/dist/bin/puzzle-geometry-bin.js +1 -1
  6. package/dist/bin/puzzle-geometry-bin.js.map +2 -2
  7. package/dist/bin/scramble.js +1 -1
  8. package/dist/lib/cubing/{PuzzleLoader-DWqO9l1G.d.ts → PuzzleLoader-KP152e2X.d.ts} +356 -313
  9. package/dist/lib/cubing/alg/index.d.ts +8 -8
  10. package/dist/lib/cubing/alg/index.js +1 -1
  11. package/dist/lib/cubing/bluetooth/index.d.ts +7 -8
  12. package/dist/lib/cubing/bluetooth/index.js +68 -54
  13. package/dist/lib/cubing/bluetooth/index.js.map +3 -3
  14. package/dist/lib/cubing/{bluetooth-puzzle-C6TIIh-Z.d.ts → bluetooth-puzzle-6BecDFLi.d.ts} +1 -1
  15. package/dist/lib/cubing/chunks/big-puzzle-orientation-SKZG73EB.js +68 -0
  16. package/dist/lib/cubing/chunks/big-puzzle-orientation-SKZG73EB.js.map +7 -0
  17. package/dist/lib/cubing/chunks/{chunk-MA47PABE.js → chunk-3C5XG4SC.js} +40 -42
  18. package/dist/lib/cubing/chunks/chunk-3C5XG4SC.js.map +7 -0
  19. package/dist/lib/cubing/chunks/{chunk-TQF5J7MH.js → chunk-3YVVF3KK.js} +79 -79
  20. package/dist/lib/cubing/chunks/chunk-3YVVF3KK.js.map +7 -0
  21. package/dist/lib/cubing/chunks/{chunk-WOAANT6Y.js → chunk-5Q6DZ5HV.js} +114 -21
  22. package/dist/lib/cubing/chunks/chunk-5Q6DZ5HV.js.map +7 -0
  23. package/dist/lib/cubing/chunks/{chunk-XPH22PGR.js → chunk-C5WSBDCA.js} +2 -2
  24. package/dist/lib/cubing/chunks/chunk-C5WSBDCA.js.map +7 -0
  25. package/dist/lib/cubing/chunks/{chunk-BQNTAVTA.js → chunk-GKM2CK6T.js} +2 -2
  26. package/dist/lib/cubing/chunks/{chunk-YFGRXDD4.js → chunk-MTC4WFXA.js} +4 -4
  27. package/dist/lib/cubing/chunks/{chunk-YFGRXDD4.js.map → chunk-MTC4WFXA.js.map} +2 -2
  28. package/dist/lib/cubing/chunks/{chunk-YQVHA4F6.js → chunk-NHRL4TEW.js} +55 -51
  29. package/dist/lib/cubing/chunks/{chunk-YQVHA4F6.js.map → chunk-NHRL4TEW.js.map} +3 -3
  30. package/dist/lib/cubing/chunks/{chunk-2SBMIHZV.js → chunk-SWKNZGJF.js} +100 -108
  31. package/dist/lib/cubing/chunks/chunk-SWKNZGJF.js.map +7 -0
  32. package/dist/lib/cubing/chunks/{chunk-KO64SKMG.js → chunk-Z7BNHCSY.js} +11 -11
  33. package/dist/lib/cubing/chunks/chunk-Z7BNHCSY.js.map +7 -0
  34. package/dist/lib/cubing/chunks/{chunk-M4T7GO54.js → chunk-ZKDJHPLD.js} +92 -70
  35. package/dist/lib/cubing/chunks/chunk-ZKDJHPLD.js.map +7 -0
  36. package/dist/lib/cubing/chunks/{inside-KAVAZETT.js → inside-GP3ZBAPI.js} +18 -18
  37. package/dist/lib/cubing/chunks/{inside-KAVAZETT.js.map → inside-GP3ZBAPI.js.map} +2 -2
  38. package/dist/lib/cubing/chunks/{puzzles-dynamic-side-events-AHFPWEBD.js → puzzles-dynamic-side-events-BOGUHF4Q.js} +1660 -1660
  39. package/dist/lib/cubing/chunks/{puzzles-dynamic-side-events-AHFPWEBD.js.map → puzzles-dynamic-side-events-BOGUHF4Q.js.map} +3 -3
  40. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-FTWMZ5ZJ.js → search-dynamic-sgs-side-events-ZJVBE4BF.js} +7 -7
  41. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-FTWMZ5ZJ.js.map → search-dynamic-sgs-side-events-ZJVBE4BF.js.map} +2 -2
  42. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-ZYGVRJQK.js → search-dynamic-sgs-unofficial-RT4BSM6R.js} +648 -648
  43. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-RT4BSM6R.js.map +7 -0
  44. package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-6MKLH6KJ.js → search-dynamic-solve-4x4x4-WSSH4ANK.js} +7 -7
  45. package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-5YRST2XM.js → search-dynamic-solve-fto-NKAFVO65.js} +2 -2
  46. package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-W64XQPBF.js → search-dynamic-solve-kilominx-EDGE5SP4.js} +2 -2
  47. package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
  48. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-QGRCHB6L.js → twisty-dynamic-3d-2Z5KPRYX.js} +63 -57
  49. package/dist/lib/cubing/chunks/twisty-dynamic-3d-2Z5KPRYX.js.map +7 -0
  50. package/dist/lib/cubing/chunks/{twsearch-ITWEA5PO.js → twsearch-TGLVN7TI.js} +2 -2
  51. package/dist/lib/cubing/{index-g0IQg962.d.ts → index-DS5qKjfG.d.ts} +2 -2
  52. package/dist/lib/cubing/kpuzzle/index.d.ts +1 -1
  53. package/dist/lib/cubing/kpuzzle/index.js +2 -2
  54. package/dist/lib/cubing/notation/index.d.ts +3 -3
  55. package/dist/lib/cubing/notation/index.js +4 -4
  56. package/dist/lib/cubing/protocol/index.d.ts +1 -1
  57. package/dist/lib/cubing/protocol/index.js +4 -4
  58. package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -2
  59. package/dist/lib/cubing/puzzle-geometry/index.js +456 -438
  60. package/dist/lib/cubing/puzzle-geometry/index.js.map +3 -3
  61. package/dist/lib/cubing/puzzles/index.d.ts +1 -1
  62. package/dist/lib/cubing/puzzles/index.js +4 -4
  63. package/dist/lib/cubing/scramble/index.d.ts +2 -2
  64. package/dist/lib/cubing/scramble/index.js +6 -6
  65. package/dist/lib/cubing/search/index.d.ts +2 -2
  66. package/dist/lib/cubing/search/index.js +6 -6
  67. package/dist/lib/cubing/stream/index.d.ts +22 -22
  68. package/dist/lib/cubing/stream/index.js +41 -41
  69. package/dist/lib/cubing/stream/index.js.map +3 -3
  70. package/dist/lib/cubing/twisty/index.d.ts +8 -8
  71. package/dist/lib/cubing/twisty/index.js +3678 -3638
  72. package/dist/lib/cubing/twisty/index.js.map +4 -4
  73. package/package.json +13 -7
  74. package/dist/bin/chunks/chunk-DFQMTDRG.js.map +0 -7
  75. package/dist/lib/cubing/chunks/chunk-2SBMIHZV.js.map +0 -7
  76. package/dist/lib/cubing/chunks/chunk-KO64SKMG.js.map +0 -7
  77. package/dist/lib/cubing/chunks/chunk-M4T7GO54.js.map +0 -7
  78. package/dist/lib/cubing/chunks/chunk-MA47PABE.js.map +0 -7
  79. package/dist/lib/cubing/chunks/chunk-TQF5J7MH.js.map +0 -7
  80. package/dist/lib/cubing/chunks/chunk-WOAANT6Y.js.map +0 -7
  81. package/dist/lib/cubing/chunks/chunk-XPH22PGR.js.map +0 -7
  82. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-ZYGVRJQK.js.map +0 -7
  83. package/dist/lib/cubing/chunks/twisty-dynamic-3d-QGRCHB6L.js.map +0 -7
  84. /package/dist/lib/cubing/chunks/{chunk-BQNTAVTA.js.map → chunk-GKM2CK6T.js.map} +0 -0
  85. /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-6MKLH6KJ.js.map → search-dynamic-solve-4x4x4-WSSH4ANK.js.map} +0 -0
  86. /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-5YRST2XM.js.map → search-dynamic-solve-fto-NKAFVO65.js.map} +0 -0
  87. /package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-W64XQPBF.js.map → search-dynamic-solve-kilominx-EDGE5SP4.js.map} +0 -0
  88. /package/dist/lib/cubing/chunks/{twsearch-ITWEA5PO.js.map → twsearch-TGLVN7TI.js.map} +0 -0
@@ -1,10 +1,43 @@
1
1
  import {
2
2
  cube3x3x3KPuzzleDefinition
3
- } from "./chunk-YQVHA4F6.js";
3
+ } from "./chunk-NHRL4TEW.js";
4
4
  import {
5
5
  TraversalUp,
6
6
  functionFromTraversal
7
- } from "./chunk-2SBMIHZV.js";
7
+ } from "./chunk-SWKNZGJF.js";
8
+
9
+ // src/cubing/notation/CountAnimatedLeaves.ts
10
+ var CountAnimatedLeaves = class extends TraversalUp {
11
+ traverseAlg(alg) {
12
+ let total = 0;
13
+ for (const part of alg.childAlgNodes()) {
14
+ total += this.traverseAlgNode(part);
15
+ }
16
+ return total;
17
+ }
18
+ traverseGrouping(grouping) {
19
+ return this.traverseAlg(grouping.alg) * Math.abs(grouping.amount);
20
+ }
21
+ traverseMove(_move) {
22
+ return 1;
23
+ }
24
+ traverseCommutator(commutator) {
25
+ return 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B));
26
+ }
27
+ traverseConjugate(conjugate) {
28
+ return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);
29
+ }
30
+ traversePause(_pause) {
31
+ return 1;
32
+ }
33
+ traverseNewline(_newline) {
34
+ return 0;
35
+ }
36
+ traverseLineComment(_comment) {
37
+ return 0;
38
+ }
39
+ };
40
+ var countAnimatedLeaves = functionFromTraversal(CountAnimatedLeaves);
8
41
 
9
42
  // src/cubing/notation/commonMetrics.ts
10
43
  var CommonMetric = /* @__PURE__ */ ((CommonMetric2) => {
@@ -145,7 +178,7 @@ var CountLeavesInExpansionForSimultaneousMoveIndexer = class extends TraversalUp
145
178
  const alg = grouping.alg;
146
179
  return this.traverseAlg(alg) * Math.abs(grouping.amount);
147
180
  }
148
- traverseMove(move) {
181
+ traverseMove(_move) {
149
182
  return 1;
150
183
  }
151
184
  traverseCommutator(commutator) {
@@ -199,9 +232,7 @@ var countRangeBlockQuantumMovesPG = functionFromTraversal(CountMoves, [
199
232
  var countRangeBlockMovesPG = functionFromTraversal(CountMoves, [
200
233
  rangeBlockTurnMetric
201
234
  ]);
202
- var countLeavesInExpansionForSimultaneousMoveIndexer = functionFromTraversal(CountLeavesInExpansionForSimultaneousMoveIndexer, [
203
- baseMetric
204
- ]);
235
+ var countLeavesInExpansionForSimultaneousMoveIndexer = functionFromTraversal(CountLeavesInExpansionForSimultaneousMoveIndexer, []);
205
236
  function countMetricMoves(puzzleLoader, metric, alg) {
206
237
  if (puzzleLoader.id === "3x3x3") {
207
238
  if (metric in costFactorsByMetric) {
@@ -230,46 +261,13 @@ function countMetricMoves(puzzleLoader, metric, alg) {
230
261
  throw new Error("Unsupported puzzle or metric.");
231
262
  }
232
263
 
233
- // src/cubing/notation/CountAnimatedLeaves.ts
234
- var CountAnimatedLeaves = class extends TraversalUp {
235
- traverseAlg(alg) {
236
- let total = 0;
237
- for (const part of alg.childAlgNodes()) {
238
- total += this.traverseAlgNode(part);
239
- }
240
- return total;
241
- }
242
- traverseGrouping(grouping) {
243
- return this.traverseAlg(grouping.alg) * Math.abs(grouping.amount);
244
- }
245
- traverseMove(_move) {
246
- return 1;
247
- }
248
- traverseCommutator(commutator) {
249
- return 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B));
250
- }
251
- traverseConjugate(conjugate) {
252
- return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);
253
- }
254
- traversePause(_pause) {
255
- return 1;
256
- }
257
- traverseNewline(_newline) {
258
- return 0;
259
- }
260
- traverseLineComment(_comment) {
261
- return 0;
262
- }
263
- };
264
- var countAnimatedLeaves = functionFromTraversal(CountAnimatedLeaves);
265
-
266
264
  export {
265
+ countAnimatedLeaves,
267
266
  CommonMetric,
268
267
  CommonMetricAlias,
269
268
  countMoves,
270
269
  countMovesETM,
271
270
  countLeavesInExpansionForSimultaneousMoveIndexer,
272
- countMetricMoves,
273
- countAnimatedLeaves
271
+ countMetricMoves
274
272
  };
275
- //# sourceMappingURL=chunk-MA47PABE.js.map
273
+ //# sourceMappingURL=chunk-3C5XG4SC.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cubing/notation/CountAnimatedLeaves.ts", "../../../../src/cubing/notation/commonMetrics.ts", "../../../../src/cubing/notation/cube3x3x3Metrics.ts", "../../../../src/cubing/notation/CountMoves.ts"],
4
+ "sourcesContent": ["import {\n type Alg,\n type Commutator,\n type Conjugate,\n functionFromTraversal,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n TraversalUp,\n} from \"../alg\";\n\n// TODO: Include Pause, include amounts\nclass CountAnimatedLeaves extends TraversalUp<number, number> {\n public traverseAlg(alg: Alg): number {\n let total = 0;\n for (const part of alg.childAlgNodes()) {\n total += this.traverseAlgNode(part);\n }\n return total;\n }\n\n public traverseGrouping(grouping: Grouping): number {\n return this.traverseAlg(grouping.alg) * Math.abs(grouping.amount);\n }\n\n public traverseMove(_move: Move): number {\n return 1;\n }\n\n public traverseCommutator(commutator: Commutator): number {\n return (\n 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B))\n );\n }\n\n public traverseConjugate(conjugate: Conjugate): number {\n return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);\n }\n\n public traversePause(_pause: Pause): number {\n return 1;\n }\n\n public traverseNewline(_newline: Newline): number {\n return 0;\n }\n\n public traverseLineComment(_comment: LineComment): number {\n return 0;\n }\n}\n\nexport const countAnimatedLeaves = functionFromTraversal(CountAnimatedLeaves);\n", "export enum CommonMetric {\n // OBTM (Outer Block Turn Metric)\n OuterBlockTurnMetric = \"OBTM\",\n // RBTM (Range Block Turn Metric)\n RangeBlockTurnMetric = \"RBTM\",\n // SSTM (Single Slice Turn Metric)\n SingleSliceTurnMetric = \"SSTM\",\n // OBQTM (Outer Block Quantum Turn Metric)\n OuterBlockQuantumTurnMetric = \"OBQTM\",\n // RBQTM (Range Block Quantum Turn Metric)\n RangeBlockQuantumTurnMetric = \"RBQTM\",\n // SSQTM (Single Slice Quantum Turn Metric)\n SingleSliceQuantumTurnMetric = \"SSQTM\",\n ExecutionTurnMetric = \"ETM\",\n}\n\nexport enum CommonMetricAlias {\n // QTM (Quantum Turn Metric)\n QuantumTurnMetric = \"OBQTM\",\n // HTM (Hand Turn Metric)\n HandTurnMetric = \"OBTM\",\n // STM (Slice Turn Metric)\n SliceTurnMetric = \"RBTM\",\n}\n", "// TODO: move this into the 3x3x3 puzzle loader.\n\nimport type { Move } from \"../alg\";\nimport { experimentalCube3x3x3KPuzzleDefinition } from \"../puzzles/cubing-private\";\nimport { CommonMetric } from \"./commonMetrics\";\n\nenum MoveType {\n Rotation = \"Rotation\",\n Outer = \"Outer\",\n Inner = \"Inner\",\n}\n\nfunction uncachedMoveCount(moveQuantumString: string): MoveType {\n if (\n moveQuantumString.endsWith(\"v\") ||\n [\"x\", \"y\", \"z\"].includes(moveQuantumString)\n ) {\n // Rv\n return MoveType.Rotation;\n }\n if (\n moveQuantumString.startsWith(\"2\") ||\n [\"M\", \"E\", \"S\"].includes(moveQuantumString)\n ) {\n return MoveType.Inner;\n }\n return MoveType.Outer;\n}\n\nlet cache: Record<string, MoveType> | undefined;\nfunction getCache(): Record<string, MoveType> {\n if (cache) {\n return cache;\n }\n cache = {};\n const moveQuantumStrings = [\n ...Object.keys(experimentalCube3x3x3KPuzzleDefinition.moves),\n ...Object.keys(experimentalCube3x3x3KPuzzleDefinition.derivedMoves!),\n ];\n for (const moveQuantumString of moveQuantumStrings) {\n cache[moveQuantumString] = uncachedMoveCount(moveQuantumString);\n }\n return cache;\n}\n\n// Ancient wisdom: https://github.com/cubing/alg.js/blob/0599fad84d81b8d943ad3ea3e5dc191db8b6c157/alg.js#L638-L651\n/**\n * A move with an amount of 0 always has 0 cost. Else, the cost is\n *\n * constantFactor + amountFactor * Math.abs(move.amount)\n *\n */\nexport const costFactorsByMetric: Partial<\n Record<\n CommonMetric,\n Record<\n MoveType,\n {\n constantFactor: number;\n amountFactor: number;\n zeroAmount: number;\n }\n >\n >\n> = {\n // Note: these are hardcoded for 3x3x3. They will not automatically generalize to any other puzzles.\n [CommonMetric.OuterBlockTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 1, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 2, amountFactor: 0, zeroAmount: 0 },\n },\n [CommonMetric.RangeBlockTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 1, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 1, amountFactor: 0, zeroAmount: 0 },\n },\n [CommonMetric.OuterBlockQuantumTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 0, amountFactor: 1, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 0, amountFactor: 2, zeroAmount: 0 },\n },\n [CommonMetric.RangeBlockQuantumTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 0, amountFactor: 0, zeroAmount: 0 },\n [MoveType.Outer]: { constantFactor: 0, amountFactor: 1, zeroAmount: 0 },\n [MoveType.Inner]: { constantFactor: 0, amountFactor: 1, zeroAmount: 0 },\n },\n [CommonMetric.ExecutionTurnMetric]: {\n [MoveType.Rotation]: { constantFactor: 1, amountFactor: 0, zeroAmount: 1 },\n [MoveType.Outer]: { constantFactor: 1, amountFactor: 0, zeroAmount: 1 },\n [MoveType.Inner]: { constantFactor: 1, amountFactor: 0, zeroAmount: 1 },\n },\n};\n\nexport function countMove3x3x3(metric: CommonMetric, move: Move): number {\n const costFactors = costFactorsByMetric[metric];\n if (!costFactors) {\n throw new Error(`Invalid metric for 3x3x3: ${metric}`);\n }\n const cache = getCache();\n const moveQuantumString = move.quantum.toString();\n if (!(moveQuantumString in cache)) {\n throw new Error(`Invalid move for 3x3x3 ${metric}: ${moveQuantumString}`);\n }\n const costType = cache[moveQuantumString];\n const { constantFactor, amountFactor, zeroAmount } = costFactors[costType];\n if (move.amount === 0) {\n return zeroAmount;\n }\n return constantFactor + amountFactor * Math.abs(move.amount);\n}\n", "// TODO: move this file somewhere permanent.\nimport {\n type Alg,\n type Commutator,\n type Conjugate,\n functionFromTraversal,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n TraversalUp,\n} from \"../alg\";\nimport type { PuzzleLoader } from \"../puzzles\";\nimport { CommonMetric } from \"./commonMetrics\";\nimport { costFactorsByMetric, countMove3x3x3 } from \"./cube3x3x3Metrics\";\n\n/*\n * For movecount, that understands puzzle rotations. This code\n * should be moved to the alg class, probably.\n */\nclass CountMoves extends TraversalUp<number> {\n constructor(private metric: (move: Move) => number) {\n super();\n }\n\n public traverseAlg(alg: Alg): number {\n let r = 0;\n for (const algNode of alg.childAlgNodes()) {\n r += this.traverseAlgNode(algNode);\n }\n return r;\n }\n\n public traverseGrouping(grouping: Grouping): number {\n const alg: Alg = grouping.alg;\n return this.traverseAlg(alg) * Math.abs(grouping.amount);\n }\n\n public traverseMove(move: Move): number {\n return this.metric(move);\n }\n\n public traverseCommutator(commutator: Commutator): number {\n return (\n 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B))\n );\n }\n\n public traverseConjugate(conjugate: Conjugate): number {\n return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);\n }\n\n // TODO: Remove spaces between repeated pauses (in traverseSequence)\n public traversePause(_pause: Pause): number {\n return 0;\n }\n\n public traverseNewline(_newLine: Newline): number {\n return 0;\n }\n\n // TODO: Enforce being followed by a newline (or the end of the alg)?\n public traverseLineComment(_comment: LineComment): number {\n return 0;\n }\n}\n\n// TODO\nclass CountLeavesInExpansionForSimultaneousMoveIndexer extends TraversalUp<number> {\n public traverseAlg(alg: Alg): number {\n let r = 0;\n for (const algNode of alg.childAlgNodes()) {\n r += this.traverseAlgNode(algNode);\n }\n return r;\n }\n\n public traverseGrouping(grouping: Grouping): number {\n const alg: Alg = grouping.alg;\n return this.traverseAlg(alg) * Math.abs(grouping.amount);\n }\n\n public traverseMove(_move: Move): number {\n return 1;\n }\n\n public traverseCommutator(commutator: Commutator): number {\n return (\n 2 * (this.traverseAlg(commutator.A) + this.traverseAlg(commutator.B))\n );\n }\n\n public traverseConjugate(conjugate: Conjugate): number {\n return 2 * this.traverseAlg(conjugate.A) + this.traverseAlg(conjugate.B);\n }\n\n // TODO: Remove spaces between repeated pauses (in traverseSequence)\n public traversePause(_pause: Pause): number {\n return 1;\n }\n\n public traverseNewline(_newLine: Newline): number {\n return 1;\n }\n\n // TODO: Enforce being followed by a newline (or the end of the alg)?\n public traverseLineComment(_comment: LineComment): number {\n return 1;\n }\n}\n\nfunction isCharUppercase(c: string): boolean {\n return \"A\" <= c && c <= \"Z\";\n}\n\n// TODO: Implement a puzzle-specific way to calculate this.\nfunction baseMetric(move: Move): number {\n const fam = move.family;\n if (\n (isCharUppercase(fam[0]) && fam[fam.length - 1] === \"v\") ||\n fam === \"x\" ||\n fam === \"y\" ||\n fam === \"z\" ||\n fam === \"T\"\n ) {\n return 0;\n } else {\n return 1;\n }\n}\n\nfunction etmMetric(_move: Move): number {\n return 1;\n}\n\n// TODO: Implement a puzzle-specific way to calculate this.\nfunction rangeBlockTurnMetric(move: Move): number {\n const fam = move.family;\n if (\n (isCharUppercase(fam[0]) && fam[fam.length - 1] === \"v\") ||\n fam === \"x\" ||\n fam === \"y\" ||\n fam === \"z\" ||\n fam === \"T\"\n ) {\n return 0;\n } else {\n return 1;\n }\n}\n\n// TODO: Implement a puzzle-specific way to calculate this.\nfunction quantumMetric(move: Move): number {\n return Math.abs(move.amount) * rangeBlockTurnMetric(move);\n}\n\nexport const countMoves = functionFromTraversal(CountMoves, [baseMetric]);\nexport const countMovesETM = functionFromTraversal(CountMoves, [etmMetric]);\nexport const countRangeBlockQuantumMovesPG = functionFromTraversal(CountMoves, [\n quantumMetric,\n]);\nexport const countRangeBlockMovesPG = functionFromTraversal(CountMoves, [\n rangeBlockTurnMetric,\n]);\n\nexport const countLeavesInExpansionForSimultaneousMoveIndexer =\n functionFromTraversal(CountLeavesInExpansionForSimultaneousMoveIndexer, []);\n\n/**\n * Only implemented so far:\n *\n * - 3x3x3: OBTM, RBTM, ETM\n */\nexport function countMetricMoves(\n puzzleLoader: PuzzleLoader,\n metric: CommonMetric,\n alg: Alg,\n): number {\n if (puzzleLoader.id === \"3x3x3\") {\n if (metric in costFactorsByMetric) {\n return functionFromTraversal(CountMoves, [\n (move: Move) => countMove3x3x3(metric, move),\n ])(alg);\n }\n } else {\n switch (metric) {\n case CommonMetric.ExecutionTurnMetric:\n return countMovesETM(alg);\n case CommonMetric.RangeBlockTurnMetric: {\n if (puzzleLoader.pg) {\n return countRangeBlockMovesPG(alg);\n }\n break;\n }\n case CommonMetric.RangeBlockQuantumTurnMetric: {\n if (puzzleLoader.pg) {\n return countRangeBlockQuantumMovesPG(alg);\n }\n break;\n }\n }\n }\n throw new Error(\"Unsupported puzzle or metric.\");\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["CommonMetric", "CommonMetricAlias", "cache"]
7
+ }
@@ -3,7 +3,7 @@ import {
3
3
  Move,
4
4
  TraversalDownUp,
5
5
  functionFromTraversal
6
- } from "./chunk-2SBMIHZV.js";
6
+ } from "./chunk-SWKNZGJF.js";
7
7
 
8
8
  // src/cubing/kpuzzle/combine.ts
9
9
  function combineTransformationData(definition, transformationData1, transformationData2) {
@@ -160,82 +160,6 @@ function moveToTransformationUncached(kpuzzle, move) {
160
160
  throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);
161
161
  }
162
162
 
163
- // src/cubing/kpuzzle/KPattern.ts
164
- var KPattern = class _KPattern {
165
- constructor(kpuzzle, patternData) {
166
- this.kpuzzle = kpuzzle;
167
- this.patternData = patternData;
168
- }
169
- toJSON() {
170
- return {
171
- experimentalPuzzleName: this.kpuzzle.name(),
172
- patternData: this.patternData
173
- };
174
- }
175
- static fromTransformation(transformation) {
176
- const newPatternData = applyTransformationDataToKPatternData(
177
- transformation.kpuzzle.definition,
178
- transformation.kpuzzle.definition.defaultPattern,
179
- transformation.transformationData
180
- );
181
- return new _KPattern(transformation.kpuzzle, newPatternData);
182
- }
183
- // Convenience function
184
- /** @deprecated */
185
- apply(source) {
186
- return this.applyTransformation(this.kpuzzle.toTransformation(source));
187
- }
188
- applyTransformation(transformation) {
189
- if (transformation.isIdentityTransformation()) {
190
- return new _KPattern(this.kpuzzle, this.patternData);
191
- }
192
- const newPatternData = applyTransformationDataToKPatternData(
193
- this.kpuzzle.definition,
194
- this.patternData,
195
- transformation.transformationData
196
- );
197
- return new _KPattern(this.kpuzzle, newPatternData);
198
- }
199
- applyMove(move) {
200
- return this.applyTransformation(this.kpuzzle.moveToTransformation(move));
201
- }
202
- applyAlg(alg) {
203
- return this.applyTransformation(this.kpuzzle.algToTransformation(alg));
204
- }
205
- isIdentical(other) {
206
- return isPatternDataIdentical(
207
- this.kpuzzle,
208
- this.patternData,
209
- other.patternData
210
- );
211
- }
212
- /** @deprecated */
213
- experimentalToTransformation() {
214
- if (!this.kpuzzle.canConvertDefaultPatternToUniqueTransformation()) {
215
- return null;
216
- }
217
- const transformationData = {};
218
- for (const [orbitName, patternOrbitData] of Object.entries(
219
- this.patternData
220
- )) {
221
- const transformationOrbit = {
222
- permutation: patternOrbitData.pieces,
223
- orientationDelta: patternOrbitData.orientation
224
- };
225
- transformationData[orbitName] = transformationOrbit;
226
- }
227
- return new KTransformation(this.kpuzzle, transformationData);
228
- }
229
- experimentalIsSolved(options) {
230
- if (!this.kpuzzle.definition.experimentalIsPatternSolved) {
231
- throw new Error(
232
- "`KPattern.experimentalIsPatternSolved()` is not supported for this puzzle at the moment."
233
- );
234
- }
235
- return this.kpuzzle.definition.experimentalIsPatternSolved(this, options);
236
- }
237
- };
238
-
239
163
  // src/cubing/kpuzzle/KTransformation.ts
240
164
  var KTransformation = class _KTransformation {
241
165
  constructor(kpuzzle, transformationData) {
@@ -559,6 +483,82 @@ function transformationRepetitionOrder(definition, transformation) {
559
483
  return order;
560
484
  }
561
485
 
486
+ // src/cubing/kpuzzle/KPattern.ts
487
+ var KPattern = class _KPattern {
488
+ constructor(kpuzzle, patternData) {
489
+ this.kpuzzle = kpuzzle;
490
+ this.patternData = patternData;
491
+ }
492
+ toJSON() {
493
+ return {
494
+ experimentalPuzzleName: this.kpuzzle.name(),
495
+ patternData: this.patternData
496
+ };
497
+ }
498
+ static fromTransformation(transformation) {
499
+ const newPatternData = applyTransformationDataToKPatternData(
500
+ transformation.kpuzzle.definition,
501
+ transformation.kpuzzle.definition.defaultPattern,
502
+ transformation.transformationData
503
+ );
504
+ return new _KPattern(transformation.kpuzzle, newPatternData);
505
+ }
506
+ // Convenience function
507
+ /** @deprecated */
508
+ apply(source) {
509
+ return this.applyTransformation(this.kpuzzle.toTransformation(source));
510
+ }
511
+ applyTransformation(transformation) {
512
+ if (transformation.isIdentityTransformation()) {
513
+ return new _KPattern(this.kpuzzle, this.patternData);
514
+ }
515
+ const newPatternData = applyTransformationDataToKPatternData(
516
+ this.kpuzzle.definition,
517
+ this.patternData,
518
+ transformation.transformationData
519
+ );
520
+ return new _KPattern(this.kpuzzle, newPatternData);
521
+ }
522
+ applyMove(move) {
523
+ return this.applyTransformation(this.kpuzzle.moveToTransformation(move));
524
+ }
525
+ applyAlg(alg) {
526
+ return this.applyTransformation(this.kpuzzle.algToTransformation(alg));
527
+ }
528
+ isIdentical(other) {
529
+ return isPatternDataIdentical(
530
+ this.kpuzzle,
531
+ this.patternData,
532
+ other.patternData
533
+ );
534
+ }
535
+ /** @deprecated */
536
+ experimentalToTransformation() {
537
+ if (!this.kpuzzle.canConvertDefaultPatternToUniqueTransformation()) {
538
+ return null;
539
+ }
540
+ const transformationData = {};
541
+ for (const [orbitName, patternOrbitData] of Object.entries(
542
+ this.patternData
543
+ )) {
544
+ const transformationOrbit = {
545
+ permutation: patternOrbitData.pieces,
546
+ orientationDelta: patternOrbitData.orientation
547
+ };
548
+ transformationData[orbitName] = transformationOrbit;
549
+ }
550
+ return new KTransformation(this.kpuzzle, transformationData);
551
+ }
552
+ experimentalIsSolved(options) {
553
+ if (!this.kpuzzle.definition.experimentalIsPatternSolved) {
554
+ throw new Error(
555
+ "`KPattern.experimentalIsPatternSolved()` is not supported for this puzzle at the moment."
556
+ );
557
+ }
558
+ return this.kpuzzle.definition.experimentalIsPatternSolved(this, options);
559
+ }
560
+ };
561
+
562
562
  // src/cubing/kpuzzle/KPuzzle.ts
563
563
  var KPuzzle = class {
564
564
  constructor(definition, options) {
@@ -653,8 +653,8 @@ var KPuzzle = class {
653
653
  };
654
654
 
655
655
  export {
656
- KPattern,
657
656
  KTransformation,
657
+ KPattern,
658
658
  KPuzzle
659
659
  };
660
- //# sourceMappingURL=chunk-TQF5J7MH.js.map
660
+ //# sourceMappingURL=chunk-3YVVF3KK.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/KTransformation.ts", "../../../../src/cubing/kpuzzle/calculate.ts", "../../../../src/cubing/kpuzzle/KPattern.ts", "../../../../src/cubing/kpuzzle/KPuzzle.ts"],
4
+ "sourcesContent": ["import { isOrbitTransformationDataIdentityUncached } from \"./calculate\";\nimport type {\n KPatternData,\n KPatternOrbitData,\n KPuzzleDefinition,\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 function getTransformationData(\n key: {\n toString: () => string;\n },\n multiplyAmount: number,\n ): KTransformationData | undefined {\n const s = key.toString();\n const movesDef = kpuzzle.definition.moves[s];\n if (movesDef) {\n return repeatTransformationUncached(kpuzzle, movesDef, multiplyAmount);\n }\n const derivedDef = kpuzzle.definition.derivedMoves?.[s];\n if (derivedDef) {\n return repeatTransformationUncached(\n kpuzzle,\n kpuzzle.algToTransformation(derivedDef).transformationData,\n multiplyAmount,\n );\n }\n return undefined;\n }\n\n // TODO: Use Euclid's algorithm to pre-calculate the GCD of moves for each\n // quantum, along with its transformation. This will make lookup `O(1)` for multiples of e.g. `y2`.\n\n const data =\n getTransformationData(move.quantum, move.amount) ??\n // Handle e.g. `y2` if `y2` is defined.\n // Note: this doesn't handle multiples.\n getTransformationData(move, 1) ??\n // Handle e.g. `y2'` if `y2` is defined.\n // Note: this doesn't handle multiples.\n getTransformationData(move.invert, -1);\n\n if (data) {\n return data;\n }\n throw new Error(`Invalid move for KPuzzle (${kpuzzle.name()}): ${move}`);\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 { KPattern } from \"./KPattern\";\nimport type { KPuzzle, KTransformationSource } from \"./KPuzzle\";\nimport type { KTransformationData } from \"./KPuzzleDefinition\";\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 // TODO: support calculating this for a given start state. (For `R U R' U` on 3x3x3, should this default to 5 or 10?)\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 type Alg,\n type Commutator,\n type Conjugate,\n functionFromTraversal,\n type Grouping,\n type LineComment,\n type Move,\n type Newline,\n type Pause,\n TraversalDownUp,\n} from \"../alg\";\nimport { combineTransformationData } from \"./combine\";\nimport type { KPuzzle } from \"./KPuzzle\";\nimport type {\n KPatternData,\n KPatternOrbitData,\n KPuzzleDefinition,\n KPuzzleOrbitDefinition,\n KTransformationData,\n KTransformationOrbitData,\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 ignorePieceOrientations?: boolean;\n ignorePiecePermutation?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignorePieceOrientations &&\n orbitTransformationData1.orientationDelta[idx] !==\n orbitTransformationData2.orientationDelta[idx]\n ) {\n return false;\n }\n if (\n !options?.ignorePiecePermutation &&\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\nfunction isOrbitPatternDataIdentical(\n orbitDefinition: KPuzzleOrbitDefinition,\n orbitPatternData1: KPatternOrbitData,\n orbitPatternData2: KPatternOrbitData,\n options: {\n ignorePieceOrientations?: boolean;\n ignorePieceIndices?: boolean;\n } = {},\n): boolean {\n for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {\n if (\n !options?.ignorePieceOrientations &&\n (orbitPatternData1.orientation[idx] !==\n orbitPatternData2.orientation[idx] ||\n (orbitPatternData1.orientationMod?.[idx] ?? 0) !==\n (orbitPatternData2.orientationMod?.[idx] ?? 0))\n ) {\n return false;\n }\n if (\n !options?.ignorePieceIndices &&\n orbitPatternData1.pieces[idx] !== orbitPatternData2.pieces[idx]\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function isPatternDataIdentical(\n kpuzzle: KPuzzle,\n patternData1: KPatternData,\n patternData2: KPatternData,\n): boolean {\n for (const orbitDefinition of kpuzzle.definition.orbits) {\n if (\n !isOrbitPatternDataIdentical(\n orbitDefinition,\n patternData1[orbitDefinition.orbitName],\n patternData2[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\n// export 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 definition.defaultPattern[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 type { Alg, Move } from \"../alg\";\nimport { isPatternDataIdentical } from \"./calculate\";\nimport { applyTransformationDataToKPatternData } from \"./combine\";\nimport type { KPuzzle, 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 isIdentical(other: KPattern): boolean {\n return isPatternDataIdentical(\n this.kpuzzle,\n this.patternData,\n other.patternData,\n );\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 // Note: `ignoreCenterOrientation` must currently be specified even if the puzzle does not have centers with indistinguishable orientations (in which case the value will be ignored).\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 { Alg, Move } from \"../alg\";\nimport type { PGNotation } from \"../puzzle-geometry/PuzzleGeometry\";\nimport { algToTransformation } from \"./calculate\";\nimport { moveToTransformationUncached } from \"./construct\";\nimport { KPattern } from \"./KPattern\";\nimport type {\n KPuzzleDefinition,\n KPuzzleOrbitDefinition,\n KTransformationData,\n} from \"./KPuzzleDefinition\";\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
+ }