@pie-element/number-line 12.1.1-next.4 → 12.2.0-next.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.
- package/CHANGELOG.md +16 -0
- package/configure/CHANGELOG.md +6 -0
- package/configure/package.json +3 -3
- package/controller/CHANGELOG.md +10 -0
- package/controller/lib/index.js +76 -3
- package/controller/lib/index.js.map +1 -1
- package/controller/package.json +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [12.2.0-next.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line@12.1.1-next.5...@pie-element/number-line@12.2.0-next.0) (2026-03-18)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- test ([223f696](https://github.com/pie-framework/pie-elements/commit/223f696635273950e1726b4a9f15120d73019d20))
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- **number-line:** add scoring trace in outcome function PD-5458 ([c5c4513](https://github.com/pie-framework/pie-elements/commit/c5c451393559dcf67086bc1564c546126beb3cae))
|
|
15
|
+
|
|
16
|
+
## [12.1.1-next.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line@12.1.1-next.4...@pie-element/number-line@12.1.1-next.5) (2026-03-12)
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
- bump libs, update mathquill, switch interface PD-5791 ([686a7c0](https://github.com/pie-framework/pie-elements/commit/686a7c0d41ff82f5ddad7cecd93cc0c18324a81b))
|
|
21
|
+
|
|
6
22
|
## [12.1.1-next.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line@12.1.1-next.3...@pie-element/number-line@12.1.1-next.4) (2026-03-09)
|
|
7
23
|
|
|
8
24
|
### Bug Fixes
|
package/configure/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [10.1.1-next.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line-configure@10.1.1-next.3...@pie-element/number-line-configure@10.1.1-next.4) (2026-03-12)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- bump libs, update mathquill, switch interface PD-5791 ([686a7c0](https://github.com/pie-framework/pie-elements/commit/686a7c0d41ff82f5ddad7cecd93cc0c18324a81b))
|
|
11
|
+
|
|
6
12
|
## [10.1.1-next.3](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line-configure@10.1.1-next.2...@pie-element/number-line-configure@10.1.1-next.3) (2026-03-06)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @pie-element/number-line-configure
|
package/configure/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/number-line-configure",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "10.1.1-next.
|
|
4
|
+
"version": "10.1.1-next.4",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "src/index.js",
|
|
7
7
|
"dependencies": {
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"@mui/icons-material": "^7.3.4",
|
|
11
11
|
"@mui/material": "^7.3.4",
|
|
12
12
|
"@pie-framework/pie-configure-events": "^1.3.0",
|
|
13
|
-
"@pie-lib/config-ui": "12.2.0-next.
|
|
14
|
-
"@pie-lib/editable-html-tip-tap": "1.2.0-next.
|
|
13
|
+
"@pie-lib/config-ui": "12.2.0-next.17",
|
|
14
|
+
"@pie-lib/editable-html-tip-tap": "1.2.0-next.16",
|
|
15
15
|
"@pie-lib/render-ui": "5.2.0-next.4",
|
|
16
16
|
"lodash-es": "^4.17.23",
|
|
17
17
|
"react": "18.3.1",
|
package/controller/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [8.2.0-next.0](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line-controller@8.1.1-next.1...@pie-element/number-line-controller@8.2.0-next.0) (2026-03-18)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- test ([223f696](https://github.com/pie-framework/pie-elements/commit/223f696635273950e1726b4a9f15120d73019d20))
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- **number-line:** add scoring trace in outcome function PD-5458 ([c5c4513](https://github.com/pie-framework/pie-elements/commit/c5c451393559dcf67086bc1564c546126beb3cae))
|
|
15
|
+
|
|
6
16
|
## [8.1.1-next.1](https://github.com/pie-framework/pie-elements/compare/@pie-element/number-line-controller@8.1.0-next.2...@pie-element/number-line-controller@8.1.1-next.1) (2026-02-26)
|
|
7
17
|
|
|
8
18
|
**Note:** Version bump only for package @pie-element/number-line-controller
|
package/controller/lib/index.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.createCorrectResponseSession = exports.closeTo = exports.CLOSE_TO_PRECISION = void 0;
|
|
8
8
|
exports.createDefaultModel = createDefaultModel;
|
|
9
|
-
exports.getCorrectness = exports.getCorrected = void 0;
|
|
9
|
+
exports.getLogTrace = exports.getCorrectness = exports.getCorrected = void 0;
|
|
10
10
|
exports.getScore = getScore;
|
|
11
11
|
exports.model = model;
|
|
12
12
|
exports.normalize = normalize;
|
|
@@ -43,13 +43,85 @@ const accumulateAnswer = correctResponse => (total, answer) => {
|
|
|
43
43
|
};
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
|
+
* Generates detailed trace log for scoring evaluation
|
|
47
|
+
* @param {Object} model - the question model
|
|
48
|
+
* @param {Object} session - the student session
|
|
49
|
+
* @param {Object} env - the environment
|
|
50
|
+
* @returns {Array} traceLog - array of trace messages
|
|
46
51
|
*/
|
|
52
|
+
const getLogTrace = (model, session, env) => {
|
|
53
|
+
const traceLog = [];
|
|
54
|
+
const studentAnswers = session?.answer || [];
|
|
55
|
+
const correctResponse = model?.correctResponse || [];
|
|
56
|
+
if (!studentAnswers.length) {
|
|
57
|
+
return ['Student did not interact with the number line.'];
|
|
58
|
+
}
|
|
59
|
+
const corrected = getCorrected(studentAnswers, (0, _lodashEs.cloneDeep)(correctResponse));
|
|
60
|
+
const {
|
|
61
|
+
correct,
|
|
62
|
+
incorrect,
|
|
63
|
+
notInAnswer,
|
|
64
|
+
noCorrectResponse
|
|
65
|
+
} = corrected;
|
|
66
|
+
if (noCorrectResponse) {
|
|
67
|
+
return ['No correct response is defined for this item.'];
|
|
68
|
+
}
|
|
69
|
+
const correctCount = correct.length;
|
|
70
|
+
const incorrectCount = incorrect.length;
|
|
71
|
+
const missingCount = notInAnswer.length;
|
|
72
|
+
if (correctCount > 0) {
|
|
73
|
+
traceLog.push(`${correctCount} object(s) correctly placed.`);
|
|
74
|
+
}
|
|
75
|
+
if (incorrectCount > 0) {
|
|
76
|
+
traceLog.push(`${incorrectCount} incorrect object(s) placed.`);
|
|
77
|
+
}
|
|
78
|
+
if (missingCount > 0) {
|
|
79
|
+
traceLog.push(`${missingCount} expected object(s) were not placed.`);
|
|
80
|
+
}
|
|
81
|
+
const studentAnswersCopy = [...studentAnswers];
|
|
82
|
+
const correctResponseCopy = [...correctResponse];
|
|
83
|
+
correct.forEach(index => {
|
|
84
|
+
const answer = studentAnswersCopy[index];
|
|
85
|
+
const objectType = answer?.type || 'object';
|
|
86
|
+
traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} is correct.`);
|
|
87
|
+
});
|
|
88
|
+
incorrect.forEach(index => {
|
|
89
|
+
const answer = studentAnswersCopy[index];
|
|
90
|
+
const objectType = answer?.type || 'object';
|
|
91
|
+
traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} does not match the expected response.`);
|
|
92
|
+
});
|
|
93
|
+
notInAnswer.forEach(expectedObject => {
|
|
94
|
+
const objectType = expectedObject?.type || 'object';
|
|
95
|
+
traceLog.push(`Expected ${objectType} at position ${expectedObject.domainPosition} was not placed by the student.`);
|
|
96
|
+
});
|
|
97
|
+
const partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
|
|
98
|
+
if (partialScoringEnabled) {
|
|
99
|
+
traceLog.push('Score calculated using partial scoring.');
|
|
100
|
+
traceLog.push(`Partial scoring is based on the number of correct objects, with deductions for extras.`);
|
|
101
|
+
} else {
|
|
102
|
+
traceLog.push('Score calculated using all-or-nothing scoring.');
|
|
103
|
+
}
|
|
104
|
+
const total = correctResponse.length || 1;
|
|
105
|
+
const extraPlacements = studentAnswers.length > total ? studentAnswers.length - total : 0;
|
|
106
|
+
if (extraPlacements > 0) {
|
|
107
|
+
traceLog.push(`${extraPlacements} extra object(s) beyond the required amount were placed and deducted.`);
|
|
108
|
+
}
|
|
109
|
+
const rawScore = Math.max(0, (correctCount - extraPlacements) / total);
|
|
110
|
+
const finalScore = partialScoringEnabled ? rawScore : rawScore === 1 ? 1 : 0;
|
|
111
|
+
traceLog.push(`Final score: ${finalScore}.`);
|
|
112
|
+
return traceLog;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
*/
|
|
117
|
+
exports.getLogTrace = getLogTrace;
|
|
47
118
|
function outcome(model, session, env) {
|
|
48
119
|
return new Promise(resolve => {
|
|
49
120
|
if (!session || (0, _lodashEs.isEmpty)(session)) {
|
|
50
121
|
resolve({
|
|
51
122
|
score: 0,
|
|
52
|
-
empty: true
|
|
123
|
+
empty: true,
|
|
124
|
+
logTrace: ['Student did not interact with the number line.']
|
|
53
125
|
});
|
|
54
126
|
} else {
|
|
55
127
|
const partialScoringEnabled = _controllerUtils.partialScoring.enabled(model, env);
|
|
@@ -67,7 +139,8 @@ function outcome(model, session, env) {
|
|
|
67
139
|
score = 0;
|
|
68
140
|
}
|
|
69
141
|
resolve({
|
|
70
|
-
score: partialScoringEnabled ? score : score === 1 ? 1 : 0
|
|
142
|
+
score: partialScoringEnabled ? score : score === 1 ? 1 : 0,
|
|
143
|
+
logTrace: getLogTrace(model, session, env)
|
|
71
144
|
});
|
|
72
145
|
}
|
|
73
146
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_lodashEs","require","_feedback","_controllerUtils","math","_interopRequireWildcard","_defaults","_interopRequireDefault","_utils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","outcome","model","session","env","Promise","resolve","isEmpty","empty","partialScoringEnabled","partialScoring","enabled","numCorrect","reduce","numIncorrect","getScore","question","getCorrected","cloneDeep","correctness","getCorrectness","allowPartialScoring","filter","canDoPartialScoring","CLOSE_TO_PRECISION","exports","closeTo","a","b","precision","expectedDiff","Math","pow","receivedDiff","abs","close","v","isEqualWith","ov","incorrect","notInAnswer","noCorrectResponse","acc","index","match","push","splice","indexOf","normalize","feedback","merge","defaults","createDefaultModel","out","graph","colorContrast","omitBy","updateTicks","domain","labelStep","ticks","minor","major","min","Number","toFixed","max","fraction","tickIntervalType","step","evaluate","Error","normalizedQuestion","normalizedModel","reloadTicksData","evaluateMode","mode","exhibitOnly","disabled","teacherInstructions","role","feedbackMessage","getFeedbackForCorrectness","undefined","prompt","type","message","accessibility","language","extraCSSRules","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxMaxElements","numberLineDimensions","minWidth","maxWidth","width","maxNumberOfPoints","errors","forEach","field","required","widthError","MIN_DOMAIN","MAX_DOMAIN","domainError","maxError","pointsError","correctResponseError"],"sources":["../src/index.js"],"sourcesContent":["import { cloneDeep, find, isEmpty, isEqualWith, merge, omitBy } from 'lodash-es';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults';\nimport { reloadTicksData } from './utils';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ score: partialScoringEnabled ? score : score === 1 ? 1 : 0 });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport async function model(question, session, env) {\n if (!question) {\n throw new Error('question is null');\n }\n\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const feedbackMessage = evaluateMode\n ? await getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n return omitBy(out, (v) => !v);\n } else {\n throw new Error('graph is undefined');\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_lodashEs","require","_feedback","_controllerUtils","math","_interopRequireWildcard","_defaults","_interopRequireDefault","_utils","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","score","number","scaled","getPartialScore","corrected","ps","correct","rule","find","numberOfCorrect","length","scorePercentage","accumulateAnswer","correctResponse","total","answer","isCorrectResponse","some","cr","matches","getLogTrace","model","session","env","traceLog","studentAnswers","getCorrected","cloneDeep","incorrect","notInAnswer","noCorrectResponse","correctCount","incorrectCount","missingCount","push","studentAnswersCopy","correctResponseCopy","forEach","index","objectType","type","charAt","toUpperCase","slice","domainPosition","expectedObject","partialScoringEnabled","partialScoring","enabled","extraPlacements","rawScore","Math","max","finalScore","exports","outcome","Promise","resolve","isEmpty","empty","logTrace","numCorrect","reduce","numIncorrect","getScore","question","correctness","getCorrectness","allowPartialScoring","filter","canDoPartialScoring","CLOSE_TO_PRECISION","closeTo","a","b","precision","expectedDiff","pow","receivedDiff","abs","close","v","isEqualWith","ov","acc","match","splice","indexOf","normalize","feedback","merge","defaults","createDefaultModel","out","graph","colorContrast","omitBy","updateTicks","domain","labelStep","ticks","minor","major","min","Number","toFixed","fraction","tickIntervalType","step","evaluate","Error","normalizedQuestion","normalizedModel","reloadTicksData","evaluateMode","mode","exhibitOnly","disabled","teacherInstructions","role","feedbackMessage","getFeedbackForCorrectness","undefined","prompt","message","accessibility","language","extraCSSRules","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","maxMaxElements","numberLineDimensions","minWidth","maxWidth","width","maxNumberOfPoints","errors","field","required","widthError","MIN_DOMAIN","MAX_DOMAIN","domainError","maxError","pointsError","correctResponseError"],"sources":["../src/index.js"],"sourcesContent":["import { cloneDeep, find, isEmpty, isEqualWith, merge, omitBy } from 'lodash-es';\nimport { getFeedbackForCorrectness } from '@pie-lib/feedback';\nimport { partialScoring } from '@pie-lib/controller-utils';\nimport * as math from 'mathjs';\n\nimport defaults from './defaults';\nimport { reloadTicksData } from './utils';\n\nconst score = (number) => {\n return {\n score: {\n scaled: number,\n },\n };\n};\n\nconst getPartialScore = (corrected, ps) => {\n const { correct } = corrected;\n const rule = ps.find((r) => r.numberOfCorrect === correct.length);\n\n if (rule) {\n return 1.0 * (rule.scorePercentage / 100);\n } else {\n return 0;\n }\n};\n\nconst accumulateAnswer = (correctResponse) => (total, answer) => {\n const isCorrectResponse = correctResponse.some((cr) => matches(cr)(answer));\n return total + (isCorrectResponse ? 1 : 0);\n};\n\n/**\n * Generates detailed trace log for scoring evaluation\n * @param {Object} model - the question model\n * @param {Object} session - the student session\n * @param {Object} env - the environment\n * @returns {Array} traceLog - array of trace messages\n */\nexport const getLogTrace = (model, session, env) => {\n const traceLog = [];\n\n const studentAnswers = session?.answer || [];\n const correctResponse = model?.correctResponse || [];\n\n if (!studentAnswers.length) {\n return ['Student did not interact with the number line.'];\n }\n\n const corrected = getCorrected(studentAnswers, cloneDeep(correctResponse));\n const { correct, incorrect, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return ['No correct response is defined for this item.'];\n }\n\n const correctCount = correct.length;\n const incorrectCount = incorrect.length;\n const missingCount = notInAnswer.length;\n\n if (correctCount > 0) {\n traceLog.push(`${correctCount} object(s) correctly placed.`);\n }\n\n if (incorrectCount > 0) {\n traceLog.push(`${incorrectCount} incorrect object(s) placed.`);\n }\n\n if (missingCount > 0) {\n traceLog.push(`${missingCount} expected object(s) were not placed.`);\n }\n\n const studentAnswersCopy = [...studentAnswers];\n const correctResponseCopy = [...correctResponse];\n\n correct.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} is correct.`);\n });\n\n incorrect.forEach((index) => {\n const answer = studentAnswersCopy[index];\n const objectType = answer?.type || 'object';\n traceLog.push(`${objectType.charAt(0).toUpperCase() + objectType.slice(1)} at position ${answer.domainPosition} does not match the expected response.`);\n });\n\n notInAnswer.forEach((expectedObject) => {\n const objectType = expectedObject?.type || 'object';\n traceLog.push(`Expected ${objectType} at position ${expectedObject.domainPosition} was not placed by the student.`);\n });\n\n const partialScoringEnabled = partialScoring.enabled(model, env);\n\n if (partialScoringEnabled) {\n traceLog.push('Score calculated using partial scoring.');\n traceLog.push(`Partial scoring is based on the number of correct objects, with deductions for extras.`);\n } else {\n traceLog.push('Score calculated using all-or-nothing scoring.');\n }\n\n const total = correctResponse.length || 1;\n const extraPlacements =\n studentAnswers.length > total ? studentAnswers.length - total : 0;\n\n if (extraPlacements > 0) {\n traceLog.push(\n `${extraPlacements} extra object(s) beyond the required amount were placed and deducted.`,\n );\n }\n\n const rawScore = Math.max(0, (correctCount - extraPlacements) / total);\n const finalScore = partialScoringEnabled ? rawScore : rawScore === 1 ? 1 : 0;\n\n traceLog.push(`Final score: ${finalScore}.`);\n\n return traceLog;\n};\n\n\n/**\n */\nexport function outcome(model, session, env) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true, logTrace: ['Student did not interact with the number line.'] });\n } else {\n const partialScoringEnabled = partialScoring.enabled(model, env);\n const numCorrect = (session.answer || []).reduce(accumulateAnswer(model.correctResponse), 0);\n\n let total = model.correctResponse.length;\n let numIncorrect = 0;\n\n if ((session.answer || []).length > total) {\n numIncorrect = (session.answer || []).length - total;\n }\n\n if (total === 0) {\n total = 1;\n }\n\n let score = numCorrect < 0 ? 0 : (numCorrect - numIncorrect) / total;\n\n if (score < 0) {\n score = 0;\n }\n\n resolve({ \n score: partialScoringEnabled ? score : score === 1 ? 1 : 0,\n logTrace: getLogTrace(model, session, env)\n });\n }\n });\n}\n\nexport function getScore(question, session) {\n return new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: { scaled: 0 } });\n } else {\n session.answer = session.answer || [];\n\n const corrected = getCorrected(session.answer, cloneDeep(question.correctResponse));\n\n const correctness = getCorrectness(corrected);\n\n if (correctness === 'correct') {\n resolve(score(1.0));\n } else if (correctness === 'incorrect') {\n resolve(score(0.0));\n } else if (correctness === 'partial') {\n const { allowPartialScoring, partialScoring } = question;\n const ps = (partialScoring || []).filter((o) => !isEmpty(o));\n const canDoPartialScoring = allowPartialScoring && ps.length > 0;\n if (canDoPartialScoring) {\n resolve(score(getPartialScore(corrected, ps)));\n } else {\n resolve(score(0.0));\n }\n } else {\n resolve({ score: { scaled: -1 } });\n }\n }\n });\n}\n\nexport const CLOSE_TO_PRECISION = 3;\n\nexport const closeTo = (a, b, precision) => {\n precision = precision || 5;\n const expectedDiff = Math.pow(10, -precision) / 2;\n const receivedDiff = Math.abs(a - b);\n const close = receivedDiff <= expectedDiff;\n return close;\n};\n\nconst matches = (a) => (v) => {\n return isEqualWith(a, v, (v, ov) => {\n if (typeof v === 'number' && typeof ov === 'number') {\n return closeTo(v, ov, CLOSE_TO_PRECISION);\n }\n });\n};\n\nexport const getCorrected = (answer, correctResponse) => {\n if (isEmpty(correctResponse) && answer.length > 0) {\n return {\n correct: [],\n incorrect: [],\n notInAnswer: [],\n noCorrectResponse: true,\n };\n }\n\n return answer.reduce(\n (acc, a, index) => {\n const { correct, incorrect, notInAnswer } = acc;\n\n const match = find(notInAnswer, matches(a));\n if (match) {\n correct.push(index);\n notInAnswer.splice(notInAnswer.indexOf(match), 1);\n } else {\n incorrect.push(index);\n }\n\n return {\n correct: correct,\n incorrect: incorrect,\n notInAnswer: notInAnswer,\n };\n },\n {\n correct: [],\n incorrect: [],\n notInAnswer: correctResponse,\n },\n );\n};\n\nexport const getCorrectness = (corrected) => {\n const { incorrect, correct, notInAnswer, noCorrectResponse } = corrected;\n\n if (noCorrectResponse) {\n return 'unknown';\n }\n\n if (incorrect.length === 0 && correct.length === 0) {\n return 'unanswered';\n }\n\n if (incorrect.length === 0 && notInAnswer.length === 0) {\n return 'correct';\n }\n\n if (incorrect.length > 0 || notInAnswer.length > 0) {\n if (correct.length > 0) {\n return 'partial';\n } else {\n return 'incorrect';\n }\n }\n\n return 'unknown';\n};\n\n/**\n * A sample of a normalize function see:\n * https://github.com/pie-framework/pie-elements/issues/21\n */\nexport function normalize(question) {\n const feedback = merge(defaults.feedback, question.feedback);\n\n return { ...defaults, ...question, feedback };\n}\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n const out = {\n ...model,\n graph: {\n ...defaults.graph,\n ...model.graph,\n },\n colorContrast: 'black_on_white',\n };\n\n resolve(omitBy(out, (v) => !v));\n });\n}\n\n// this function is duplicated in configure; at some point, use the same shared function\nconst updateTicks = (model) => {\n const { graph: { domain, labelStep, ticks = {} } = {} } = model;\n const { minor, major } = ticks;\n\n if (domain) {\n domain.min = Number((domain.min || 0).toFixed(2));\n domain.max = Number((domain.max || 0).toFixed(2));\n }\n\n if (labelStep && typeof labelStep === 'string' && labelStep.match(/^[1-9][0-9]*\\/[1-9][0-9]*$/g)) {\n model.graph.fraction = true;\n ticks.tickIntervalType = 'Fraction';\n\n // update the ticks frequency and label value to match the label step if needed\n const step = math.evaluate(labelStep);\n\n if (step !== major) {\n ticks.major = step;\n ticks.minor = step / (major / minor);\n }\n }\n\n return model;\n};\n\nexport async function model(question, session, env) {\n if (!question) {\n throw new Error('question is null');\n }\n\n const normalizedQuestion = await normalize(question);\n const normalizedModel = updateTicks(normalizedQuestion);\n // this function is also called in configure, it is a duplicate to maintain consistency and correctness\n const graph = reloadTicksData(normalizedModel.graph);\n\n if (graph) {\n const evaluateMode = env.mode === 'evaluate';\n\n const correctResponse = cloneDeep(normalizedQuestion.correctResponse);\n const corrected = evaluateMode && getCorrected(session ? session.answer || [] : [], correctResponse);\n const correctness = evaluateMode && getCorrectness(corrected);\n\n const { exhibitOnly } = graph;\n const disabled = env.mode !== 'gather' || exhibitOnly === true;\n let teacherInstructions = null;\n\n if (env.role === 'instructor' && (env.mode === 'view' || evaluateMode)) {\n teacherInstructions = normalizedQuestion.teacherInstructions;\n }\n\n const feedbackMessage = evaluateMode\n ? await getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : undefined;\n\n const out = {\n prompt: normalizedQuestion.prompt,\n teacherInstructions,\n graph,\n disabled,\n corrected,\n correctResponse:\n evaluateMode && ['unanswered', 'correct'].indexOf(correctness) === -1 && normalizedQuestion.correctResponse,\n feedback: feedbackMessage && {\n type: correctness,\n message: feedbackMessage,\n },\n colorContrast: (env.accessibility && env.accessibility.colorContrast) || 'black_on_white',\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n return omitBy(out, (v) => !v);\n } else {\n throw new Error('graph is undefined');\n }\n}\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { correctResponse: answer } = question;\n\n resolve({\n answer,\n id: '1',\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { graph, correctResponse } = model || {};\n const { maxMaxElements = 20, numberLineDimensions: { min: minWidth = 200, max: maxWidth = 800 } = {} } = config || {};\n const { width, domain, maxNumberOfPoints } = graph || {};\n const { min, max } = domain || {};\n const errors = {};\n\n ['teacherInstructions', 'prompt'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n if (width < minWidth || width > maxWidth) {\n errors.widthError = `Width should be a value between ${minWidth} and ${maxWidth}.`;\n }\n\n const MIN_DOMAIN = -100000;\n const MAX_DOMAIN = 100000;\n\n if (min < MIN_DOMAIN || min > MAX_DOMAIN || max < MIN_DOMAIN || max > MAX_DOMAIN) {\n errors.domainError = `Min and max values must both be in the range [${MIN_DOMAIN}, ${MAX_DOMAIN}].`;\n }\n\n if (min >= max) {\n errors.maxError = 'Max value must be greater than min value.';\n }\n\n if (maxNumberOfPoints < 1 || maxNumberOfPoints > maxMaxElements) {\n errors.pointsError = `Max number of elements should be between 1 and ${maxMaxElements}.`;\n }\n\n if (correctResponse && correctResponse.length === 0) {\n errors.correctResponseError = 'The correct answer should include at least one number line object.';\n }\n\n return errors;\n};\n"],"mappings":"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","ignoreList":[]}
|
package/controller/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pie-element/number-line",
|
|
3
3
|
"repository": "pie-framework/pie-elements",
|
|
4
|
-
"version": "12.
|
|
4
|
+
"version": "12.2.0-next.0",
|
|
5
5
|
"description": "",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"author": "pie framework developers",
|
|
31
31
|
"license": "ISC",
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "11169f258ac462817f622c5272b360009b6675ab",
|
|
33
33
|
"scripts": {
|
|
34
34
|
"postpublish": "../../scripts/postpublish"
|
|
35
35
|
},
|