@vscubing/cubing
Version:
A collection of JavaScript cubing libraries.
90 lines (87 loc) • 3.21 kB
JavaScript
import {
Alg
} from "./chunk-T3WO4S5D.js";
// src/cubing/search/inside/solve/parseSGS.ts
function parseSGS(kpuzzle, sgs) {
const subgroupSizes = [];
const sgsActions = [];
for (const line of sgs.split("\n")) {
const lineTokens = line.split(" ");
if (line.startsWith("SetOrder ")) {
} else if (line.startsWith("Alg ")) {
const alg = Alg.fromString(line.substring(4));
sgsActions.push({
alg,
transformation: kpuzzle.algToTransformation(alg)
});
} else if (line.startsWith("SubgroupSizes ")) {
for (let j = 1; j < lineTokens.length; j++) {
subgroupSizes.push(parseInt(lineTokens[j]));
}
}
}
const sgsCachedData = {
ordering: new Array(subgroupSizes.length)
};
const subgroupAlgOffsets = [];
let sum = 0;
subgroupAlgOffsets.push(0);
const emptyAlg = Alg.fromString("");
const identity = kpuzzle.identityTransformation();
for (let i = 0; i < subgroupSizes.length; i++) {
sum += subgroupSizes[i];
subgroupAlgOffsets.push(sum);
sgsActions.splice(sum - 1, 0, { alg: emptyAlg, transformation: identity });
}
if (sgsActions.length !== sum) {
throw Error(
`Bad sgs; expected ${sum - subgroupSizes.length} algs but saw ${sgsActions.length - subgroupSizes.length}`
);
}
const processedPieces = {};
for (const orbitDefinition of kpuzzle.definition.orbits) {
processedPieces[orbitDefinition.orbitName] = new Array(
orbitDefinition.numPieces
).fill(false);
}
for (let i = subgroupSizes.length - 1; i >= 0; i--) {
const pieceOrdering = [];
for (let j = subgroupAlgOffsets[i]; j < subgroupAlgOffsets[i + 1]; j++) {
const transformation = sgsActions[j].transformation;
for (const orbitDefinition of kpuzzle.definition.orbits) {
for (let idx = 0; idx < orbitDefinition.numPieces; idx++) {
if (transformation.transformationData[orbitDefinition.orbitName].permutation[idx] !== idx || transformation.transformationData[orbitDefinition.orbitName].orientationDelta[idx] !== 0) {
if (!processedPieces[orbitDefinition.orbitName][idx]) {
pieceOrdering.push({
orbitName: orbitDefinition.orbitName,
permutationIdx: idx
});
processedPieces[orbitDefinition.orbitName][idx] = true;
}
}
}
}
}
const lookup = {};
for (let j = subgroupAlgOffsets[i]; j < subgroupAlgOffsets[i + 1]; j++) {
const transformation = sgsActions[j].transformation.invert();
let key = "";
for (let k = 0; k < pieceOrdering.length; k++) {
const loc = pieceOrdering[k];
key = `${key} ${transformation.transformationData[loc.orbitName].permutation[loc.permutationIdx]} ${transformation.transformationData[loc.orbitName].orientationDelta[loc.permutationIdx]}`;
}
lookup[key] = sgsActions[j];
sgsActions[j].alg = sgsActions[j].alg.invert();
sgsActions[j].transformation = sgsActions[j].transformation.invert();
}
sgsCachedData.ordering[i] = {
pieceOrdering,
lookup
};
}
return sgsCachedData;
}
export {
parseSGS
};
//# sourceMappingURL=chunk-36F7D4VI.js.map