learngraph 0.4.0 → 0.7.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/dist/cjs/api/routes/analytics.js +288 -0
- package/dist/cjs/api/routes/analytics.js.map +1 -0
- package/dist/cjs/api/routes/assessments.js +269 -0
- package/dist/cjs/api/routes/assessments.js.map +1 -0
- package/dist/cjs/api/routes/curriculum.js +345 -0
- package/dist/cjs/api/routes/curriculum.js.map +1 -0
- package/dist/cjs/api/routes/edges.js +162 -0
- package/dist/cjs/api/routes/edges.js.map +1 -0
- package/dist/cjs/api/routes/explore.js +224 -0
- package/dist/cjs/api/routes/explore.js.map +1 -0
- package/dist/cjs/api/routes/learners.js +324 -0
- package/dist/cjs/api/routes/learners.js.map +1 -0
- package/dist/cjs/api/routes/me.js +404 -0
- package/dist/cjs/api/routes/me.js.map +1 -0
- package/dist/cjs/api/routes/skills.js +319 -0
- package/dist/cjs/api/routes/skills.js.map +1 -0
- package/dist/cjs/api/server.js +185 -0
- package/dist/cjs/api/server.js.map +1 -0
- package/dist/cjs/api/types.js +10 -0
- package/dist/cjs/api/types.js.map +1 -0
- package/dist/cjs/assessment/adaptive.js +390 -0
- package/dist/cjs/assessment/adaptive.js.map +1 -0
- package/dist/cjs/assessment/bkt.js +362 -0
- package/dist/cjs/assessment/bkt.js.map +1 -0
- package/dist/cjs/assessment/index.js +54 -0
- package/dist/cjs/assessment/index.js.map +1 -0
- package/dist/cjs/assessment/irt.js +420 -0
- package/dist/cjs/assessment/irt.js.map +1 -0
- package/dist/cjs/assessment/mastery-engine.js +411 -0
- package/dist/cjs/assessment/mastery-engine.js.map +1 -0
- package/dist/cjs/components/LearningPathView.js +320 -0
- package/dist/cjs/components/LearningPathView.js.map +1 -0
- package/dist/cjs/components/ProgressDashboard.js +308 -0
- package/dist/cjs/components/ProgressDashboard.js.map +1 -0
- package/dist/cjs/components/SkillCard.js +264 -0
- package/dist/cjs/components/SkillCard.js.map +1 -0
- package/dist/cjs/components/SkillExplorer.js +401 -0
- package/dist/cjs/components/SkillExplorer.js.map +1 -0
- package/dist/cjs/components/SkillGraph.js +435 -0
- package/dist/cjs/components/SkillGraph.js.map +1 -0
- package/dist/cjs/components/hooks.js +510 -0
- package/dist/cjs/components/hooks.js.map +1 -0
- package/dist/cjs/components/index.js +77 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/components/types.js +34 -0
- package/dist/cjs/components/types.js.map +1 -0
- package/dist/cjs/index.js +36 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/llm/adapters/anthropic.js +91 -3
- package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
- package/dist/cjs/llm/adapters/gemini.js +101 -8
- package/dist/cjs/llm/adapters/gemini.js.map +1 -1
- package/dist/cjs/llm/adapters/index.js +42 -1
- package/dist/cjs/llm/adapters/index.js.map +1 -1
- package/dist/cjs/llm/adapters/ollama.js +120 -3
- package/dist/cjs/llm/adapters/ollama.js.map +1 -1
- package/dist/cjs/llm/adapters/openai.js +108 -2
- package/dist/cjs/llm/adapters/openai.js.map +1 -1
- package/dist/cjs/mcp/cli.js +302 -0
- package/dist/cjs/mcp/cli.js.map +1 -0
- package/dist/cjs/mcp/index.js +79 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/mcp/prompts.js +425 -0
- package/dist/cjs/mcp/prompts.js.map +1 -0
- package/dist/cjs/mcp/resources.js +371 -0
- package/dist/cjs/mcp/resources.js.map +1 -0
- package/dist/cjs/mcp/server.js +410 -0
- package/dist/cjs/mcp/server.js.map +1 -0
- package/dist/cjs/mcp/tools.js +612 -0
- package/dist/cjs/mcp/tools.js.map +1 -0
- package/dist/cjs/mcp/types.js +10 -0
- package/dist/cjs/mcp/types.js.map +1 -0
- package/dist/cjs/query/index.js +23 -4
- package/dist/cjs/query/index.js.map +1 -1
- package/dist/cjs/query/path.js +313 -0
- package/dist/cjs/query/path.js.map +1 -0
- package/dist/cjs/query/spaced-repetition.js +298 -0
- package/dist/cjs/query/spaced-repetition.js.map +1 -0
- package/dist/cjs/query/zpd.js +216 -0
- package/dist/cjs/query/zpd.js.map +1 -0
- package/dist/cjs/types/assessment.js +46 -0
- package/dist/cjs/types/assessment.js.map +1 -0
- package/dist/cjs/types/bloom.js +12 -1
- package/dist/cjs/types/bloom.js.map +1 -1
- package/dist/cjs/types/index.js +7 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/api/routes/analytics.js +285 -0
- package/dist/esm/api/routes/analytics.js.map +1 -0
- package/dist/esm/api/routes/assessments.js +266 -0
- package/dist/esm/api/routes/assessments.js.map +1 -0
- package/dist/esm/api/routes/curriculum.js +342 -0
- package/dist/esm/api/routes/curriculum.js.map +1 -0
- package/dist/esm/api/routes/edges.js +159 -0
- package/dist/esm/api/routes/edges.js.map +1 -0
- package/dist/esm/api/routes/explore.js +221 -0
- package/dist/esm/api/routes/explore.js.map +1 -0
- package/dist/esm/api/routes/learners.js +321 -0
- package/dist/esm/api/routes/learners.js.map +1 -0
- package/dist/esm/api/routes/me.js +401 -0
- package/dist/esm/api/routes/me.js.map +1 -0
- package/dist/esm/api/routes/skills.js +316 -0
- package/dist/esm/api/routes/skills.js.map +1 -0
- package/dist/esm/api/server.js +179 -0
- package/dist/esm/api/server.js.map +1 -0
- package/dist/esm/api/types.js +9 -0
- package/dist/esm/api/types.js.map +1 -0
- package/dist/esm/assessment/adaptive.js +384 -0
- package/dist/esm/assessment/adaptive.js.map +1 -0
- package/dist/esm/assessment/bkt.js +354 -0
- package/dist/esm/assessment/bkt.js.map +1 -0
- package/dist/esm/assessment/index.js +21 -0
- package/dist/esm/assessment/index.js.map +1 -0
- package/dist/esm/assessment/irt.js +406 -0
- package/dist/esm/assessment/irt.js.map +1 -0
- package/dist/esm/assessment/mastery-engine.js +406 -0
- package/dist/esm/assessment/mastery-engine.js.map +1 -0
- package/dist/esm/components/LearningPathView.js +316 -0
- package/dist/esm/components/LearningPathView.js.map +1 -0
- package/dist/esm/components/ProgressDashboard.js +304 -0
- package/dist/esm/components/ProgressDashboard.js.map +1 -0
- package/dist/esm/components/SkillCard.js +260 -0
- package/dist/esm/components/SkillCard.js.map +1 -0
- package/dist/esm/components/SkillExplorer.js +397 -0
- package/dist/esm/components/SkillExplorer.js.map +1 -0
- package/dist/esm/components/SkillGraph.js +398 -0
- package/dist/esm/components/SkillGraph.js.map +1 -0
- package/dist/esm/components/hooks.js +502 -0
- package/dist/esm/components/hooks.js.map +1 -0
- package/dist/esm/components/index.js +61 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/components/types.js +31 -0
- package/dist/esm/components/types.js.map +1 -0
- package/dist/esm/index.js +13 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/llm/adapters/anthropic.js +88 -2
- package/dist/esm/llm/adapters/anthropic.js.map +1 -1
- package/dist/esm/llm/adapters/gemini.js +98 -7
- package/dist/esm/llm/adapters/gemini.js.map +1 -1
- package/dist/esm/llm/adapters/index.js +15 -4
- package/dist/esm/llm/adapters/index.js.map +1 -1
- package/dist/esm/llm/adapters/ollama.js +117 -2
- package/dist/esm/llm/adapters/ollama.js.map +1 -1
- package/dist/esm/llm/adapters/openai.js +105 -1
- package/dist/esm/llm/adapters/openai.js.map +1 -1
- package/dist/esm/mcp/cli.js +267 -0
- package/dist/esm/mcp/cli.js.map +1 -0
- package/dist/esm/mcp/index.js +39 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/mcp/prompts.js +419 -0
- package/dist/esm/mcp/prompts.js.map +1 -0
- package/dist/esm/mcp/resources.js +359 -0
- package/dist/esm/mcp/resources.js.map +1 -0
- package/dist/esm/mcp/server.js +372 -0
- package/dist/esm/mcp/server.js.map +1 -0
- package/dist/esm/mcp/tools.js +598 -0
- package/dist/esm/mcp/tools.js.map +1 -0
- package/dist/esm/mcp/types.js +9 -0
- package/dist/esm/mcp/types.js.map +1 -0
- package/dist/esm/query/index.js +11 -5
- package/dist/esm/query/index.js.map +1 -1
- package/dist/esm/query/path.js +308 -0
- package/dist/esm/query/path.js.map +1 -0
- package/dist/esm/query/spaced-repetition.js +292 -0
- package/dist/esm/query/spaced-repetition.js.map +1 -0
- package/dist/esm/query/zpd.js +211 -0
- package/dist/esm/query/zpd.js.map +1 -0
- package/dist/esm/types/assessment.js +40 -0
- package/dist/esm/types/assessment.js.map +1 -0
- package/dist/esm/types/bloom.js +11 -0
- package/dist/esm/types/bloom.js.map +1 -1
- package/dist/esm/types/index.js +2 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/api/routes/analytics.d.ts +14 -0
- package/dist/types/api/routes/analytics.d.ts.map +1 -0
- package/dist/types/api/routes/assessments.d.ts +14 -0
- package/dist/types/api/routes/assessments.d.ts.map +1 -0
- package/dist/types/api/routes/curriculum.d.ts +14 -0
- package/dist/types/api/routes/curriculum.d.ts.map +1 -0
- package/dist/types/api/routes/edges.d.ts +14 -0
- package/dist/types/api/routes/edges.d.ts.map +1 -0
- package/dist/types/api/routes/explore.d.ts +14 -0
- package/dist/types/api/routes/explore.d.ts.map +1 -0
- package/dist/types/api/routes/learners.d.ts +14 -0
- package/dist/types/api/routes/learners.d.ts.map +1 -0
- package/dist/types/api/routes/me.d.ts +14 -0
- package/dist/types/api/routes/me.d.ts.map +1 -0
- package/dist/types/api/routes/skills.d.ts +14 -0
- package/dist/types/api/routes/skills.d.ts.map +1 -0
- package/dist/types/api/server.d.ts +147 -0
- package/dist/types/api/server.d.ts.map +1 -0
- package/dist/types/api/types.d.ts +443 -0
- package/dist/types/api/types.d.ts.map +1 -0
- package/dist/types/assessment/adaptive.d.ts +155 -0
- package/dist/types/assessment/adaptive.d.ts.map +1 -0
- package/dist/types/assessment/bkt.d.ts +185 -0
- package/dist/types/assessment/bkt.d.ts.map +1 -0
- package/dist/types/assessment/index.d.ts +18 -0
- package/dist/types/assessment/index.d.ts.map +1 -0
- package/dist/types/assessment/irt.d.ts +159 -0
- package/dist/types/assessment/irt.d.ts.map +1 -0
- package/dist/types/assessment/mastery-engine.d.ts +178 -0
- package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
- package/dist/types/components/LearningPathView.d.ts +40 -0
- package/dist/types/components/LearningPathView.d.ts.map +1 -0
- package/dist/types/components/ProgressDashboard.d.ts +49 -0
- package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
- package/dist/types/components/SkillCard.d.ts +34 -0
- package/dist/types/components/SkillCard.d.ts.map +1 -0
- package/dist/types/components/SkillExplorer.d.ts +39 -0
- package/dist/types/components/SkillExplorer.d.ts.map +1 -0
- package/dist/types/components/SkillGraph.d.ts +38 -0
- package/dist/types/components/SkillGraph.d.ts.map +1 -0
- package/dist/types/components/hooks.d.ts +187 -0
- package/dist/types/components/hooks.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +59 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/components/types.d.ts +410 -0
- package/dist/types/components/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/anthropic.d.ts +84 -1
- package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
- package/dist/types/llm/adapters/gemini.d.ts +93 -6
- package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
- package/dist/types/llm/adapters/index.d.ts +13 -4
- package/dist/types/llm/adapters/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/ollama.d.ts +126 -1
- package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
- package/dist/types/llm/adapters/openai.d.ts +104 -1
- package/dist/types/llm/adapters/openai.d.ts.map +1 -1
- package/dist/types/mcp/cli.d.ts +15 -0
- package/dist/types/mcp/cli.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +32 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/prompts.d.ts +27 -0
- package/dist/types/mcp/prompts.d.ts.map +1 -0
- package/dist/types/mcp/resources.d.ts +59 -0
- package/dist/types/mcp/resources.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +136 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/tools.d.ts +344 -0
- package/dist/types/mcp/tools.d.ts.map +1 -0
- package/dist/types/mcp/types.d.ts +137 -0
- package/dist/types/mcp/types.d.ts.map +1 -0
- package/dist/types/query/index.d.ts +8 -0
- package/dist/types/query/index.d.ts.map +1 -1
- package/dist/types/query/path.d.ts +102 -0
- package/dist/types/query/path.d.ts.map +1 -0
- package/dist/types/query/spaced-repetition.d.ts +135 -0
- package/dist/types/query/spaced-repetition.d.ts.map +1 -0
- package/dist/types/query/zpd.d.ts +97 -0
- package/dist/types/query/zpd.d.ts.map +1 -0
- package/dist/types/types/assessment.d.ts +512 -0
- package/dist/types/types/assessment.d.ts.map +1 -0
- package/dist/types/types/bloom.d.ts +4 -0
- package/dist/types/types/bloom.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +3 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +48 -3
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bayesian Knowledge Tracing (BKT)
|
|
3
|
+
*
|
|
4
|
+
* Implements the classic BKT model for tracking learner mastery.
|
|
5
|
+
* BKT is a hidden Markov model with two hidden states (mastery/no mastery)
|
|
6
|
+
* and uses four parameters:
|
|
7
|
+
* - P(L₀): Prior probability of mastery (pInit)
|
|
8
|
+
* - P(T): Probability of learning/transition (pLearn)
|
|
9
|
+
* - P(S): Probability of slip (wrong despite mastery) (pSlip)
|
|
10
|
+
* - P(G): Probability of guess (correct despite no mastery) (pGuess)
|
|
11
|
+
*
|
|
12
|
+
* @see Corbett & Anderson (1994). Knowledge tracing: Modeling the acquisition
|
|
13
|
+
* of procedural knowledge. User Modeling and User-Adapted Interaction.
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { BKT_DEFAULTS } from '../types/assessment.js';
|
|
18
|
+
/**
|
|
19
|
+
* Default BKT configuration
|
|
20
|
+
*/
|
|
21
|
+
export const BKT_CONFIG_DEFAULTS = {
|
|
22
|
+
masteryThreshold: 0.95,
|
|
23
|
+
individualizedParams: false,
|
|
24
|
+
trackHistory: false,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Bayesian Knowledge Tracing Engine
|
|
28
|
+
*
|
|
29
|
+
* Tracks learner mastery using the classic BKT model.
|
|
30
|
+
* Can be used with skill-level or global parameters.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const bkt = new BKTEngine();
|
|
35
|
+
*
|
|
36
|
+
* // Initialize state for a skill
|
|
37
|
+
* let state = bkt.initializeState('skill-1');
|
|
38
|
+
*
|
|
39
|
+
* // Update after correct response
|
|
40
|
+
* state = bkt.update(state, true).state;
|
|
41
|
+
* console.log(`Mastery: ${state.pMastery.toFixed(2)}`);
|
|
42
|
+
*
|
|
43
|
+
* // Update after incorrect response
|
|
44
|
+
* state = bkt.update(state, false).state;
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class BKTEngine {
|
|
48
|
+
config;
|
|
49
|
+
skillParams;
|
|
50
|
+
globalParams;
|
|
51
|
+
constructor(config = {}, globalParams = BKT_DEFAULTS) {
|
|
52
|
+
this.config = { ...BKT_CONFIG_DEFAULTS, ...config };
|
|
53
|
+
this.globalParams = globalParams;
|
|
54
|
+
this.skillParams = new Map();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Set parameters for a specific skill
|
|
58
|
+
*/
|
|
59
|
+
setSkillParameters(skillId, params) {
|
|
60
|
+
this.skillParams.set(skillId, params);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get parameters for a skill (falls back to global)
|
|
64
|
+
*/
|
|
65
|
+
getParameters(skillId) {
|
|
66
|
+
if (skillId && this.config.individualizedParams) {
|
|
67
|
+
return this.skillParams.get(skillId) ?? this.globalParams;
|
|
68
|
+
}
|
|
69
|
+
return this.globalParams;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Initialize BKT state for a skill
|
|
73
|
+
*/
|
|
74
|
+
initializeState(skillId) {
|
|
75
|
+
const params = this.getParameters(skillId);
|
|
76
|
+
const baseState = {
|
|
77
|
+
skillId,
|
|
78
|
+
pMastery: params.pInit,
|
|
79
|
+
observations: 0,
|
|
80
|
+
};
|
|
81
|
+
if (this.config.trackHistory) {
|
|
82
|
+
baseState.history = [];
|
|
83
|
+
}
|
|
84
|
+
return baseState;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Update BKT state based on an observed response
|
|
88
|
+
*
|
|
89
|
+
* Uses Bayes' theorem to update the mastery probability:
|
|
90
|
+
* - For correct response: P(Lₙ|correct) ∝ P(correct|Lₙ) × P(Lₙ)
|
|
91
|
+
* - For incorrect response: P(Lₙ|incorrect) ∝ P(incorrect|Lₙ) × P(Lₙ)
|
|
92
|
+
*
|
|
93
|
+
* Then applies the learning transition.
|
|
94
|
+
*
|
|
95
|
+
* @param state - Current BKT state
|
|
96
|
+
* @param correct - Whether the response was correct
|
|
97
|
+
* @param skillId - Optional skill ID for skill-specific parameters
|
|
98
|
+
* @returns Updated state and result information
|
|
99
|
+
*/
|
|
100
|
+
update(state, correct, skillId) {
|
|
101
|
+
const params = this.getParameters(skillId ?? state.skillId);
|
|
102
|
+
const previousMastery = state.pMastery;
|
|
103
|
+
// Calculate likelihood of observation given each hidden state
|
|
104
|
+
// P(correct | mastered) = 1 - P(slip)
|
|
105
|
+
// P(correct | not mastered) = P(guess)
|
|
106
|
+
const pCorrectGivenMastery = 1 - params.pSlip;
|
|
107
|
+
const pCorrectGivenNoMastery = params.pGuess;
|
|
108
|
+
// Calculate posterior probability of mastery given observation
|
|
109
|
+
let pMasteryGivenObs;
|
|
110
|
+
let likelihood;
|
|
111
|
+
if (correct) {
|
|
112
|
+
// P(L|correct) = P(correct|L) × P(L) / P(correct)
|
|
113
|
+
const pCorrect = pCorrectGivenMastery * state.pMastery +
|
|
114
|
+
pCorrectGivenNoMastery * (1 - state.pMastery);
|
|
115
|
+
pMasteryGivenObs = (pCorrectGivenMastery * state.pMastery) / pCorrect;
|
|
116
|
+
likelihood = pCorrect;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// P(L|incorrect) = P(incorrect|L) × P(L) / P(incorrect)
|
|
120
|
+
const pIncorrect = params.pSlip * state.pMastery +
|
|
121
|
+
(1 - params.pGuess) * (1 - state.pMastery);
|
|
122
|
+
pMasteryGivenObs = (params.pSlip * state.pMastery) / pIncorrect;
|
|
123
|
+
likelihood = pIncorrect;
|
|
124
|
+
}
|
|
125
|
+
// Apply learning transition: P(Lₙ₊₁) = P(Lₙ|obs) + P(T) × (1 - P(Lₙ|obs))
|
|
126
|
+
// This accounts for the possibility of learning during the opportunity
|
|
127
|
+
const pMastery = pMasteryGivenObs + params.pLearn * (1 - pMasteryGivenObs);
|
|
128
|
+
// Build updated state
|
|
129
|
+
const newState = {
|
|
130
|
+
skillId: state.skillId,
|
|
131
|
+
pMastery,
|
|
132
|
+
observations: state.observations + 1,
|
|
133
|
+
};
|
|
134
|
+
if (this.config.trackHistory) {
|
|
135
|
+
newState.history = [...(state.history ?? []), correct];
|
|
136
|
+
}
|
|
137
|
+
const result = {
|
|
138
|
+
pMastery,
|
|
139
|
+
isMastered: pMastery >= this.config.masteryThreshold,
|
|
140
|
+
likelihood,
|
|
141
|
+
previousMastery,
|
|
142
|
+
};
|
|
143
|
+
return { state: newState, result };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Update from multiple responses
|
|
147
|
+
*/
|
|
148
|
+
updateBatch(state, responses, skillId) {
|
|
149
|
+
let currentState = state;
|
|
150
|
+
const results = [];
|
|
151
|
+
for (const correct of responses) {
|
|
152
|
+
const { state: newState, result } = this.update(currentState, correct, skillId);
|
|
153
|
+
currentState = newState;
|
|
154
|
+
results.push(result);
|
|
155
|
+
}
|
|
156
|
+
return { state: currentState, results };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Predict the probability of a correct response
|
|
160
|
+
*/
|
|
161
|
+
predict(state, skillId) {
|
|
162
|
+
const params = this.getParameters(skillId ?? state.skillId);
|
|
163
|
+
// P(correct) = P(correct|mastered) × P(mastered) + P(correct|not mastered) × P(not mastered)
|
|
164
|
+
const pCorrect = (1 - params.pSlip) * state.pMastery +
|
|
165
|
+
params.pGuess * (1 - state.pMastery);
|
|
166
|
+
// What would mastery be after correct/incorrect?
|
|
167
|
+
const { state: stateIfCorrect } = this.update({ ...state }, true, skillId);
|
|
168
|
+
const { state: stateIfIncorrect } = this.update({ ...state }, false, skillId);
|
|
169
|
+
return {
|
|
170
|
+
pCorrect,
|
|
171
|
+
masteryIfCorrect: stateIfCorrect.pMastery,
|
|
172
|
+
masteryIfIncorrect: stateIfIncorrect.pMastery,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Estimate number of opportunities until mastery
|
|
177
|
+
*
|
|
178
|
+
* Uses a forward simulation assuming consistent correct responses.
|
|
179
|
+
*/
|
|
180
|
+
estimateOpportunitiesToMastery(state, skillId, maxOpportunities = 100) {
|
|
181
|
+
if (state.pMastery >= this.config.masteryThreshold) {
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
let currentState = { ...state };
|
|
185
|
+
for (let i = 1; i <= maxOpportunities; i++) {
|
|
186
|
+
// Simulate correct response
|
|
187
|
+
const { state: newState } = this.update(currentState, true, skillId);
|
|
188
|
+
if (newState.pMastery >= this.config.masteryThreshold) {
|
|
189
|
+
return i;
|
|
190
|
+
}
|
|
191
|
+
currentState = newState;
|
|
192
|
+
}
|
|
193
|
+
return null; // Mastery not achievable within max opportunities
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check if mastery threshold is met
|
|
197
|
+
*/
|
|
198
|
+
isMastered(state) {
|
|
199
|
+
return state.pMastery >= this.config.masteryThreshold;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Convert BKT state to MasteryState for integration with other systems
|
|
203
|
+
*/
|
|
204
|
+
toMasteryState(state) {
|
|
205
|
+
return {
|
|
206
|
+
skillId: state.skillId,
|
|
207
|
+
mastery: state.pMastery,
|
|
208
|
+
attempts: state.observations,
|
|
209
|
+
streak: this.calculateStreak(state),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Calculate current streak from history
|
|
214
|
+
*/
|
|
215
|
+
calculateStreak(state) {
|
|
216
|
+
if (!state.history || state.history.length === 0) {
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
let streak = 0;
|
|
220
|
+
for (let i = state.history.length - 1; i >= 0; i--) {
|
|
221
|
+
if (state.history[i]) {
|
|
222
|
+
streak++;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return streak;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Fit BKT parameters to response data
|
|
233
|
+
*
|
|
234
|
+
* @param sequences - Array of response sequences (true = correct)
|
|
235
|
+
* @param gridSize - Number of values to try for each parameter
|
|
236
|
+
* @returns Best fitting parameters
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```typescript
|
|
240
|
+
* const sequences = [
|
|
241
|
+
* [false, false, true, true, true],
|
|
242
|
+
* [true, false, true, true, true],
|
|
243
|
+
* [false, true, true, true, true],
|
|
244
|
+
* ];
|
|
245
|
+
*
|
|
246
|
+
* const result = fitBKTParameters(sequences);
|
|
247
|
+
* console.log('Best parameters:', result.params);
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
250
|
+
export function fitBKTParameters(sequences, gridSize = 10) {
|
|
251
|
+
// Generate grid values
|
|
252
|
+
const values = Array.from({ length: gridSize }, (_, i) => (i + 1) / (gridSize + 1));
|
|
253
|
+
// Constraints on parameters
|
|
254
|
+
const pInitValues = values.filter((v) => v >= 0.1 && v <= 0.9);
|
|
255
|
+
const pLearnValues = values.filter((v) => v >= 0.01 && v <= 0.5);
|
|
256
|
+
const pSlipValues = values.filter((v) => v >= 0.01 && v <= 0.3);
|
|
257
|
+
const pGuessValues = values.filter((v) => v >= 0.01 && v <= 0.4);
|
|
258
|
+
let bestParams = BKT_DEFAULTS;
|
|
259
|
+
let bestLogLikelihood = -Infinity;
|
|
260
|
+
let evaluations = 0;
|
|
261
|
+
// Grid search
|
|
262
|
+
for (const pInit of pInitValues) {
|
|
263
|
+
for (const pLearn of pLearnValues) {
|
|
264
|
+
for (const pSlip of pSlipValues) {
|
|
265
|
+
for (const pGuess of pGuessValues) {
|
|
266
|
+
// Skip invalid combinations (guess + slip should be < 1 for identifiability)
|
|
267
|
+
if (pSlip + pGuess >= 1)
|
|
268
|
+
continue;
|
|
269
|
+
const params = { pInit, pLearn, pSlip, pGuess };
|
|
270
|
+
const logLikelihood = calculateLogLikelihood(sequences, params);
|
|
271
|
+
evaluations++;
|
|
272
|
+
if (logLikelihood > bestLogLikelihood) {
|
|
273
|
+
bestLogLikelihood = logLikelihood;
|
|
274
|
+
bestParams = params;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
params: bestParams,
|
|
282
|
+
logLikelihood: bestLogLikelihood,
|
|
283
|
+
evaluations,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Calculate log-likelihood of response sequences given BKT parameters
|
|
288
|
+
*/
|
|
289
|
+
export function calculateLogLikelihood(sequences, params) {
|
|
290
|
+
let totalLogLikelihood = 0;
|
|
291
|
+
for (const sequence of sequences) {
|
|
292
|
+
let pMastery = params.pInit;
|
|
293
|
+
for (const correct of sequence) {
|
|
294
|
+
// P(correct | state)
|
|
295
|
+
const pCorrectGivenMastery = 1 - params.pSlip;
|
|
296
|
+
const pCorrectGivenNoMastery = params.pGuess;
|
|
297
|
+
// P(observation)
|
|
298
|
+
const pObs = correct
|
|
299
|
+
? pCorrectGivenMastery * pMastery + pCorrectGivenNoMastery * (1 - pMastery)
|
|
300
|
+
: params.pSlip * pMastery + (1 - params.pGuess) * (1 - pMastery);
|
|
301
|
+
// Avoid log(0)
|
|
302
|
+
totalLogLikelihood += Math.log(Math.max(pObs, 1e-10));
|
|
303
|
+
// Update mastery
|
|
304
|
+
if (correct) {
|
|
305
|
+
const pCorrect = pCorrectGivenMastery * pMastery +
|
|
306
|
+
pCorrectGivenNoMastery * (1 - pMastery);
|
|
307
|
+
pMastery = (pCorrectGivenMastery * pMastery) / pCorrect;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
const pIncorrect = params.pSlip * pMastery + (1 - params.pGuess) * (1 - pMastery);
|
|
311
|
+
pMastery = (params.pSlip * pMastery) / pIncorrect;
|
|
312
|
+
}
|
|
313
|
+
// Learning transition
|
|
314
|
+
pMastery = pMastery + params.pLearn * (1 - pMastery);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return totalLogLikelihood;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Create a BKT engine with default configuration
|
|
321
|
+
*/
|
|
322
|
+
export function createBKTEngine(config, params) {
|
|
323
|
+
return new BKTEngine(config, params);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Quick mastery estimation using BKT
|
|
327
|
+
*
|
|
328
|
+
* Convenience function for simple use cases.
|
|
329
|
+
*
|
|
330
|
+
* @param responses - Sequence of correct/incorrect responses
|
|
331
|
+
* @param params - BKT parameters (optional, uses defaults)
|
|
332
|
+
* @returns Final mastery probability
|
|
333
|
+
*/
|
|
334
|
+
export function estimateMastery(responses, params = BKT_DEFAULTS) {
|
|
335
|
+
let pMastery = params.pInit;
|
|
336
|
+
for (const correct of responses) {
|
|
337
|
+
const pCorrectGivenMastery = 1 - params.pSlip;
|
|
338
|
+
const pCorrectGivenNoMastery = params.pGuess;
|
|
339
|
+
// Posterior
|
|
340
|
+
if (correct) {
|
|
341
|
+
const pCorrect = pCorrectGivenMastery * pMastery +
|
|
342
|
+
pCorrectGivenNoMastery * (1 - pMastery);
|
|
343
|
+
pMastery = (pCorrectGivenMastery * pMastery) / pCorrect;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
const pIncorrect = params.pSlip * pMastery + (1 - params.pGuess) * (1 - pMastery);
|
|
347
|
+
pMastery = (params.pSlip * pMastery) / pIncorrect;
|
|
348
|
+
}
|
|
349
|
+
// Learning transition
|
|
350
|
+
pMastery = pMastery + params.pLearn * (1 - pMastery);
|
|
351
|
+
}
|
|
352
|
+
return pMastery;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=bkt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bkt.js","sourceRoot":"","sources":["../../../src/assessment/bkt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessment Framework
|
|
3
|
+
*
|
|
4
|
+
* This module provides comprehensive assessment capabilities:
|
|
5
|
+
* - Bayesian Knowledge Tracing (BKT) for skill-level mastery
|
|
6
|
+
* - Item Response Theory (IRT) for ability estimation
|
|
7
|
+
* - Unified mastery estimation engine
|
|
8
|
+
* - Adaptive testing with intelligent item selection
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
export { createQuestionId, createAssessmentId, createResponseId, BKT_DEFAULTS, } from '../types/assessment.js';
|
|
13
|
+
// Bayesian Knowledge Tracing
|
|
14
|
+
export { BKTEngine, createBKTEngine, fitBKTParameters, calculateLogLikelihood, estimateMastery, BKT_CONFIG_DEFAULTS, } from './bkt.js';
|
|
15
|
+
// Item Response Theory
|
|
16
|
+
export { IRTEstimator, createIRTEstimator, calculateProbability, calculateProbabilityDerivative, calculateInformation, calculateTestInformation, calculateStandardError, selectNextItemMFI, abilityToPercentile, abilityToGradeLevel, estimateAbility, IRT_CONFIG_DEFAULTS, } from './irt.js';
|
|
17
|
+
// Mastery Engine
|
|
18
|
+
export { MasteryEngine, createMasteryEngine, MASTERY_ENGINE_DEFAULTS, } from './mastery-engine.js';
|
|
19
|
+
// Adaptive Testing
|
|
20
|
+
export { AdaptiveEngine, createAdaptiveEngine, createQuestionPool, ADAPTIVE_DEFAULTS, TERMINATION_DEFAULTS, } from './adaptive.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assessment/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA4CH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,6BAA6B;AAC7B,OAAO,EACL,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,GAIpB,MAAM,UAAU,CAAC;AAElB,uBAAuB;AACvB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GAEpB,MAAM,UAAU,CAAC;AAElB,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,uBAAuB,GAIxB,MAAM,qBAAqB,CAAC;AAE7B,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GAGrB,MAAM,eAAe,CAAC"}
|