Skip to content

Commit

Permalink
expand use of unique variants, unique variants randomized (#286)
Browse files Browse the repository at this point in the history
  • Loading branch information
dqnykamp authored Feb 11, 2025
1 parent 3f9abfe commit 5362afc
Show file tree
Hide file tree
Showing 16 changed files with 483 additions and 999 deletions.
15 changes: 9 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"@types/esprima": "^4.0.6",
"@types/react": "^18.3.10",
"@types/react-dom": "^18.3.0",
"@types/seedrandom": "^3.0.8",
"@uiw/react-codemirror": "^4.22.2",
"@vitejs/plugin-react": "^4.3.1",
"@vitest/web-worker": "^2.1.1",
Expand Down
4 changes: 2 additions & 2 deletions packages/doenetml-worker/src/Core.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import readOnlyProxyHandler from "./ReadOnlyProxyHandler";
import ParameterStack from "./ParameterStack";
import Numerics from "./Numerics";
import { prng_alea } from "esm-seedrandom";
import seedrandom from "seedrandom";
import me from "math-expressions";
import createStateProxyHandler from "./StateProxyHandler";
import {
Expand Down Expand Up @@ -178,7 +178,7 @@ export default class Core {

this.parameterStack = new ParameterStack();

this.parameterStack.parameters.rngClass = prng_alea;
this.parameterStack.parameters.rngClass = seedrandom.alea;
this.parameterStack.parameters.prerender = prerender;

this.initialized = false;
Expand Down
4 changes: 2 additions & 2 deletions packages/doenetml-worker/src/components/Document.js
Original file line number Diff line number Diff line change
Expand Up @@ -878,10 +878,10 @@ export default class Document extends BaseComponent {
variantIndex - 1
];

sharedParameters.variantRng = new sharedParameters.rngClass(
sharedParameters.variantRng = sharedParameters.rngClass(
sharedParameters.variantSeed,
);
sharedParameters.subpartVariantRng = new sharedParameters.rngClass(
sharedParameters.subpartVariantRng = sharedParameters.rngClass(
sharedParameters.variantSeed + "s",
);

Expand Down
5 changes: 2 additions & 3 deletions packages/doenetml-worker/src/components/SamplePrimeNumbers.js
Original file line number Diff line number Diff line change
Expand Up @@ -353,9 +353,8 @@ export default class SamplePrimeNumbers extends CompositeComponent {
// seed from date plus a few digits from variant
let seedForRandomNumbers =
sharedParameters.variantRng().toString().slice(2, 8) + +new Date();
sharedParameters.rngWithDateSeed = new sharedParameters.rngClass(
seedForRandomNumbers,
);
sharedParameters.rngWithDateSeed =
sharedParameters.rngClass(seedForRandomNumbers);
}

static determineNumberOfUniqueVariants({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1209,10 +1209,10 @@ export class SectioningComponent extends BlockComponent {
variantIndex - 1
];

sharedParameters.variantRng = new sharedParameters.rngClass(
sharedParameters.variantRng = sharedParameters.rngClass(
sharedParameters.variantSeed,
);
sharedParameters.subpartVariantRng = new sharedParameters.rngClass(
sharedParameters.subpartVariantRng = sharedParameters.rngClass(
sharedParameters.variantSeed + "s",
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1175,6 +1175,7 @@ describe("ChoiceInput tag tests", async () => {
let stateVariables = await returnAllStateVariables(core);
let choiceTexts = stateVariables["/ci"].stateValues.choiceTexts;
expect([...choiceTexts].sort()).eqls([...originalChoices].sort());
const order = choiceTexts.map((v) => originalChoices.indexOf(v));

async function check_items(selectedIndices: number[]) {
let selectedValues = selectedIndices.map((v) => choiceTexts[v - 1]);
Expand All @@ -1196,7 +1197,7 @@ describe("ChoiceInput tag tests", async () => {

for (let i = 1; i <= 4; i++) {
expect(stateVariables[`/choice${i}`].stateValues.selected).eq(
selectedIndices.includes(i),
selectedIndices.includes(order[i - 1] + 1),
);
}
}
Expand Down
28 changes: 15 additions & 13 deletions packages/doenetml-worker/src/test/tagSpecific/lorem.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,16 @@ describe("lorem tag tests", async () => {

let stateVariables = await returnAllStateVariables(core);

expect(stateVariables["/n"].stateValues.value).eq(1);
const n1 = stateVariables["/n"].stateValues.value;

expect(stateVariables["/lPars"].replacements!.length).eq(1);

let paragraph0 =
const paragraph1 =
stateVariables[
stateVariables["/lPars"].replacements![0].componentName
].activeChildren[0];

expect(stateVariables["/a"].stateValues.text).eq(paragraph0);
expect(stateVariables["/a"].stateValues.text).eq(paragraph1);

core = await createTestCore({
doenetML: `
Expand All @@ -186,16 +187,16 @@ describe("lorem tag tests", async () => {

stateVariables = await returnAllStateVariables(core);

expect(stateVariables["/n"].stateValues.value).eq(1);
expect(stateVariables["/n"].stateValues.value).eq(n1);
expect(stateVariables["/lPars"].replacements!.length).eq(1);

expect(
stateVariables[
stateVariables["/lPars"].replacements![0].componentName
].activeChildren[0],
).eq(paragraph0);
).eq(paragraph1);

expect(stateVariables["/a"].stateValues.text).eq(paragraph0);
expect(stateVariables["/a"].stateValues.text).eq(paragraph1);

core = await createTestCore({
doenetML: `
Expand All @@ -207,16 +208,17 @@ describe("lorem tag tests", async () => {

stateVariables = await returnAllStateVariables(core);

expect(stateVariables["/n"].stateValues.value).eq(2);
const n2 = stateVariables["/n"].stateValues.value;
expect(n2).eq(3 - n1);
expect(stateVariables["/lPars"].replacements!.length).eq(1);

let paragraph1 =
const paragraph2 =
stateVariables[
stateVariables["/lPars"].replacements![0].componentName
].activeChildren[0];
expect(paragraph1).not.eq(paragraph0);
expect(paragraph2).not.eq(paragraph1);

expect(stateVariables["/a"].stateValues.text).eq(paragraph1);
expect(stateVariables["/a"].stateValues.text).eq(paragraph2);

core = await createTestCore({
doenetML: `
Expand All @@ -229,15 +231,15 @@ describe("lorem tag tests", async () => {

stateVariables = await returnAllStateVariables(core);

expect(stateVariables["/n"].stateValues.value).eq(2);
expect(stateVariables["/n"].stateValues.value).eq(n2);
expect(stateVariables["/lPars"].replacements!.length).eq(1);

expect(
stateVariables[
stateVariables["/lPars"].replacements![0].componentName
].activeChildren[0],
).eq(paragraph1);
).eq(paragraph2);

expect(stateVariables["/a"].stateValues.text).eq(paragraph1);
expect(stateVariables["/a"].stateValues.text).eq(paragraph2);
});
});
14 changes: 12 additions & 2 deletions packages/doenetml-worker/src/test/tagSpecific/problem.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -394,10 +394,14 @@ describe("Problem tag tests", async () => {
stateVariables = await returnAllStateVariables(core);
expect(stateVariables["/hello"].stateValues.creditAchieved).eq(1);
expect(stateVariables[sectionName].stateValues.creditAchieved).eq(0.5);
const bananaInd =
stateVariables["/fruitInput"].stateValues.choiceTexts.indexOf(
"banana",
) + 1;

await updateSelectedIndices({
name: "/fruitInput",
selectedIndices: [1],
selectedIndices: [bananaInd],
core,
});
await submitAnswer({ name: "/fruit", core });
Expand Down Expand Up @@ -634,9 +638,15 @@ describe("Problem tag tests", async () => {
false,
);
expect(stateVariables["/subProblem"].stateValues.creditAchieved).eq(0);

const bananaInd =
stateVariables["/fruitInput"].stateValues.choiceTexts.indexOf(
"banana",
) + 1;

await updateSelectedIndices({
name: "/fruitInput",
selectedIndices: [1],
selectedIndices: [bananaInd],
core,
});
await core.requestAction({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1559,7 +1559,10 @@ describe("Specifying single variant tests", async () => {
});
});

it("variantsToInclude and variantsToExclude in problem, extra child", async () => {
// Now that we are shuffling the order of unique variants,
// the variants of the document and the problem no longer coincide with an extra child.
// I think we can delete this test, as I'm not sure if there is anything left to test. (DQN, 2/10/2025)
it.skip("variantsToInclude and variantsToExclude in problem, extra child", async () => {
function createDoenetML({
include = [],
exclude = [],
Expand Down
Loading

0 comments on commit 5362afc

Please sign in to comment.