learngraph 0.5.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.
Files changed (235) hide show
  1. package/dist/cjs/api/routes/analytics.js +288 -0
  2. package/dist/cjs/api/routes/analytics.js.map +1 -0
  3. package/dist/cjs/api/routes/assessments.js +269 -0
  4. package/dist/cjs/api/routes/assessments.js.map +1 -0
  5. package/dist/cjs/api/routes/curriculum.js +345 -0
  6. package/dist/cjs/api/routes/curriculum.js.map +1 -0
  7. package/dist/cjs/api/routes/edges.js +162 -0
  8. package/dist/cjs/api/routes/edges.js.map +1 -0
  9. package/dist/cjs/api/routes/explore.js +224 -0
  10. package/dist/cjs/api/routes/explore.js.map +1 -0
  11. package/dist/cjs/api/routes/learners.js +324 -0
  12. package/dist/cjs/api/routes/learners.js.map +1 -0
  13. package/dist/cjs/api/routes/me.js +404 -0
  14. package/dist/cjs/api/routes/me.js.map +1 -0
  15. package/dist/cjs/api/routes/skills.js +319 -0
  16. package/dist/cjs/api/routes/skills.js.map +1 -0
  17. package/dist/cjs/api/server.js +185 -0
  18. package/dist/cjs/api/server.js.map +1 -0
  19. package/dist/cjs/api/types.js +10 -0
  20. package/dist/cjs/api/types.js.map +1 -0
  21. package/dist/cjs/assessment/adaptive.js +390 -0
  22. package/dist/cjs/assessment/adaptive.js.map +1 -0
  23. package/dist/cjs/assessment/bkt.js +362 -0
  24. package/dist/cjs/assessment/bkt.js.map +1 -0
  25. package/dist/cjs/assessment/index.js +54 -0
  26. package/dist/cjs/assessment/index.js.map +1 -0
  27. package/dist/cjs/assessment/irt.js +420 -0
  28. package/dist/cjs/assessment/irt.js.map +1 -0
  29. package/dist/cjs/assessment/mastery-engine.js +411 -0
  30. package/dist/cjs/assessment/mastery-engine.js.map +1 -0
  31. package/dist/cjs/components/LearningPathView.js +320 -0
  32. package/dist/cjs/components/LearningPathView.js.map +1 -0
  33. package/dist/cjs/components/ProgressDashboard.js +308 -0
  34. package/dist/cjs/components/ProgressDashboard.js.map +1 -0
  35. package/dist/cjs/components/SkillCard.js +264 -0
  36. package/dist/cjs/components/SkillCard.js.map +1 -0
  37. package/dist/cjs/components/SkillExplorer.js +401 -0
  38. package/dist/cjs/components/SkillExplorer.js.map +1 -0
  39. package/dist/cjs/components/SkillGraph.js +435 -0
  40. package/dist/cjs/components/SkillGraph.js.map +1 -0
  41. package/dist/cjs/components/hooks.js +510 -0
  42. package/dist/cjs/components/hooks.js.map +1 -0
  43. package/dist/cjs/components/index.js +77 -0
  44. package/dist/cjs/components/index.js.map +1 -0
  45. package/dist/cjs/components/types.js +34 -0
  46. package/dist/cjs/components/types.js.map +1 -0
  47. package/dist/cjs/index.js +35 -1
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/llm/adapters/anthropic.js +91 -3
  50. package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
  51. package/dist/cjs/llm/adapters/gemini.js +101 -8
  52. package/dist/cjs/llm/adapters/gemini.js.map +1 -1
  53. package/dist/cjs/llm/adapters/index.js +42 -1
  54. package/dist/cjs/llm/adapters/index.js.map +1 -1
  55. package/dist/cjs/llm/adapters/ollama.js +120 -3
  56. package/dist/cjs/llm/adapters/ollama.js.map +1 -1
  57. package/dist/cjs/llm/adapters/openai.js +108 -2
  58. package/dist/cjs/llm/adapters/openai.js.map +1 -1
  59. package/dist/cjs/mcp/cli.js +302 -0
  60. package/dist/cjs/mcp/cli.js.map +1 -0
  61. package/dist/cjs/mcp/index.js +79 -0
  62. package/dist/cjs/mcp/index.js.map +1 -0
  63. package/dist/cjs/mcp/prompts.js +425 -0
  64. package/dist/cjs/mcp/prompts.js.map +1 -0
  65. package/dist/cjs/mcp/resources.js +371 -0
  66. package/dist/cjs/mcp/resources.js.map +1 -0
  67. package/dist/cjs/mcp/server.js +410 -0
  68. package/dist/cjs/mcp/server.js.map +1 -0
  69. package/dist/cjs/mcp/tools.js +612 -0
  70. package/dist/cjs/mcp/tools.js.map +1 -0
  71. package/dist/cjs/mcp/types.js +10 -0
  72. package/dist/cjs/mcp/types.js.map +1 -0
  73. package/dist/cjs/types/assessment.js +46 -0
  74. package/dist/cjs/types/assessment.js.map +1 -0
  75. package/dist/cjs/types/bloom.js +12 -1
  76. package/dist/cjs/types/bloom.js.map +1 -1
  77. package/dist/cjs/types/index.js +7 -1
  78. package/dist/cjs/types/index.js.map +1 -1
  79. package/dist/esm/api/routes/analytics.js +285 -0
  80. package/dist/esm/api/routes/analytics.js.map +1 -0
  81. package/dist/esm/api/routes/assessments.js +266 -0
  82. package/dist/esm/api/routes/assessments.js.map +1 -0
  83. package/dist/esm/api/routes/curriculum.js +342 -0
  84. package/dist/esm/api/routes/curriculum.js.map +1 -0
  85. package/dist/esm/api/routes/edges.js +159 -0
  86. package/dist/esm/api/routes/edges.js.map +1 -0
  87. package/dist/esm/api/routes/explore.js +221 -0
  88. package/dist/esm/api/routes/explore.js.map +1 -0
  89. package/dist/esm/api/routes/learners.js +321 -0
  90. package/dist/esm/api/routes/learners.js.map +1 -0
  91. package/dist/esm/api/routes/me.js +401 -0
  92. package/dist/esm/api/routes/me.js.map +1 -0
  93. package/dist/esm/api/routes/skills.js +316 -0
  94. package/dist/esm/api/routes/skills.js.map +1 -0
  95. package/dist/esm/api/server.js +179 -0
  96. package/dist/esm/api/server.js.map +1 -0
  97. package/dist/esm/api/types.js +9 -0
  98. package/dist/esm/api/types.js.map +1 -0
  99. package/dist/esm/assessment/adaptive.js +384 -0
  100. package/dist/esm/assessment/adaptive.js.map +1 -0
  101. package/dist/esm/assessment/bkt.js +354 -0
  102. package/dist/esm/assessment/bkt.js.map +1 -0
  103. package/dist/esm/assessment/index.js +21 -0
  104. package/dist/esm/assessment/index.js.map +1 -0
  105. package/dist/esm/assessment/irt.js +406 -0
  106. package/dist/esm/assessment/irt.js.map +1 -0
  107. package/dist/esm/assessment/mastery-engine.js +406 -0
  108. package/dist/esm/assessment/mastery-engine.js.map +1 -0
  109. package/dist/esm/components/LearningPathView.js +316 -0
  110. package/dist/esm/components/LearningPathView.js.map +1 -0
  111. package/dist/esm/components/ProgressDashboard.js +304 -0
  112. package/dist/esm/components/ProgressDashboard.js.map +1 -0
  113. package/dist/esm/components/SkillCard.js +260 -0
  114. package/dist/esm/components/SkillCard.js.map +1 -0
  115. package/dist/esm/components/SkillExplorer.js +397 -0
  116. package/dist/esm/components/SkillExplorer.js.map +1 -0
  117. package/dist/esm/components/SkillGraph.js +398 -0
  118. package/dist/esm/components/SkillGraph.js.map +1 -0
  119. package/dist/esm/components/hooks.js +502 -0
  120. package/dist/esm/components/hooks.js.map +1 -0
  121. package/dist/esm/components/index.js +61 -0
  122. package/dist/esm/components/index.js.map +1 -0
  123. package/dist/esm/components/types.js +31 -0
  124. package/dist/esm/components/types.js.map +1 -0
  125. package/dist/esm/index.js +12 -0
  126. package/dist/esm/index.js.map +1 -1
  127. package/dist/esm/llm/adapters/anthropic.js +88 -2
  128. package/dist/esm/llm/adapters/anthropic.js.map +1 -1
  129. package/dist/esm/llm/adapters/gemini.js +98 -7
  130. package/dist/esm/llm/adapters/gemini.js.map +1 -1
  131. package/dist/esm/llm/adapters/index.js +15 -4
  132. package/dist/esm/llm/adapters/index.js.map +1 -1
  133. package/dist/esm/llm/adapters/ollama.js +117 -2
  134. package/dist/esm/llm/adapters/ollama.js.map +1 -1
  135. package/dist/esm/llm/adapters/openai.js +105 -1
  136. package/dist/esm/llm/adapters/openai.js.map +1 -1
  137. package/dist/esm/mcp/cli.js +267 -0
  138. package/dist/esm/mcp/cli.js.map +1 -0
  139. package/dist/esm/mcp/index.js +39 -0
  140. package/dist/esm/mcp/index.js.map +1 -0
  141. package/dist/esm/mcp/prompts.js +419 -0
  142. package/dist/esm/mcp/prompts.js.map +1 -0
  143. package/dist/esm/mcp/resources.js +359 -0
  144. package/dist/esm/mcp/resources.js.map +1 -0
  145. package/dist/esm/mcp/server.js +372 -0
  146. package/dist/esm/mcp/server.js.map +1 -0
  147. package/dist/esm/mcp/tools.js +598 -0
  148. package/dist/esm/mcp/tools.js.map +1 -0
  149. package/dist/esm/mcp/types.js +9 -0
  150. package/dist/esm/mcp/types.js.map +1 -0
  151. package/dist/esm/types/assessment.js +40 -0
  152. package/dist/esm/types/assessment.js.map +1 -0
  153. package/dist/esm/types/bloom.js +11 -0
  154. package/dist/esm/types/bloom.js.map +1 -1
  155. package/dist/esm/types/index.js +2 -1
  156. package/dist/esm/types/index.js.map +1 -1
  157. package/dist/types/api/routes/analytics.d.ts +14 -0
  158. package/dist/types/api/routes/analytics.d.ts.map +1 -0
  159. package/dist/types/api/routes/assessments.d.ts +14 -0
  160. package/dist/types/api/routes/assessments.d.ts.map +1 -0
  161. package/dist/types/api/routes/curriculum.d.ts +14 -0
  162. package/dist/types/api/routes/curriculum.d.ts.map +1 -0
  163. package/dist/types/api/routes/edges.d.ts +14 -0
  164. package/dist/types/api/routes/edges.d.ts.map +1 -0
  165. package/dist/types/api/routes/explore.d.ts +14 -0
  166. package/dist/types/api/routes/explore.d.ts.map +1 -0
  167. package/dist/types/api/routes/learners.d.ts +14 -0
  168. package/dist/types/api/routes/learners.d.ts.map +1 -0
  169. package/dist/types/api/routes/me.d.ts +14 -0
  170. package/dist/types/api/routes/me.d.ts.map +1 -0
  171. package/dist/types/api/routes/skills.d.ts +14 -0
  172. package/dist/types/api/routes/skills.d.ts.map +1 -0
  173. package/dist/types/api/server.d.ts +147 -0
  174. package/dist/types/api/server.d.ts.map +1 -0
  175. package/dist/types/api/types.d.ts +443 -0
  176. package/dist/types/api/types.d.ts.map +1 -0
  177. package/dist/types/assessment/adaptive.d.ts +155 -0
  178. package/dist/types/assessment/adaptive.d.ts.map +1 -0
  179. package/dist/types/assessment/bkt.d.ts +185 -0
  180. package/dist/types/assessment/bkt.d.ts.map +1 -0
  181. package/dist/types/assessment/index.d.ts +18 -0
  182. package/dist/types/assessment/index.d.ts.map +1 -0
  183. package/dist/types/assessment/irt.d.ts +159 -0
  184. package/dist/types/assessment/irt.d.ts.map +1 -0
  185. package/dist/types/assessment/mastery-engine.d.ts +178 -0
  186. package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
  187. package/dist/types/components/LearningPathView.d.ts +40 -0
  188. package/dist/types/components/LearningPathView.d.ts.map +1 -0
  189. package/dist/types/components/ProgressDashboard.d.ts +49 -0
  190. package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
  191. package/dist/types/components/SkillCard.d.ts +34 -0
  192. package/dist/types/components/SkillCard.d.ts.map +1 -0
  193. package/dist/types/components/SkillExplorer.d.ts +39 -0
  194. package/dist/types/components/SkillExplorer.d.ts.map +1 -0
  195. package/dist/types/components/SkillGraph.d.ts +38 -0
  196. package/dist/types/components/SkillGraph.d.ts.map +1 -0
  197. package/dist/types/components/hooks.d.ts +187 -0
  198. package/dist/types/components/hooks.d.ts.map +1 -0
  199. package/dist/types/components/index.d.ts +59 -0
  200. package/dist/types/components/index.d.ts.map +1 -0
  201. package/dist/types/components/types.d.ts +410 -0
  202. package/dist/types/components/types.d.ts.map +1 -0
  203. package/dist/types/index.d.ts +1 -0
  204. package/dist/types/index.d.ts.map +1 -1
  205. package/dist/types/llm/adapters/anthropic.d.ts +84 -1
  206. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
  207. package/dist/types/llm/adapters/gemini.d.ts +93 -6
  208. package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
  209. package/dist/types/llm/adapters/index.d.ts +13 -4
  210. package/dist/types/llm/adapters/index.d.ts.map +1 -1
  211. package/dist/types/llm/adapters/ollama.d.ts +126 -1
  212. package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
  213. package/dist/types/llm/adapters/openai.d.ts +104 -1
  214. package/dist/types/llm/adapters/openai.d.ts.map +1 -1
  215. package/dist/types/mcp/cli.d.ts +15 -0
  216. package/dist/types/mcp/cli.d.ts.map +1 -0
  217. package/dist/types/mcp/index.d.ts +32 -0
  218. package/dist/types/mcp/index.d.ts.map +1 -0
  219. package/dist/types/mcp/prompts.d.ts +27 -0
  220. package/dist/types/mcp/prompts.d.ts.map +1 -0
  221. package/dist/types/mcp/resources.d.ts +59 -0
  222. package/dist/types/mcp/resources.d.ts.map +1 -0
  223. package/dist/types/mcp/server.d.ts +136 -0
  224. package/dist/types/mcp/server.d.ts.map +1 -0
  225. package/dist/types/mcp/tools.d.ts +344 -0
  226. package/dist/types/mcp/tools.d.ts.map +1 -0
  227. package/dist/types/mcp/types.d.ts +137 -0
  228. package/dist/types/mcp/types.d.ts.map +1 -0
  229. package/dist/types/types/assessment.d.ts +512 -0
  230. package/dist/types/types/assessment.d.ts.map +1 -0
  231. package/dist/types/types/bloom.d.ts +4 -0
  232. package/dist/types/types/bloom.d.ts.map +1 -1
  233. package/dist/types/types/index.d.ts +3 -1
  234. package/dist/types/types/index.d.ts.map +1 -1
  235. package/package.json +48 -3
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ /**
3
+ * Bayesian Knowledge Tracing (BKT)
4
+ *
5
+ * Implements the classic BKT model for tracking learner mastery.
6
+ * BKT is a hidden Markov model with two hidden states (mastery/no mastery)
7
+ * and uses four parameters:
8
+ * - P(L₀): Prior probability of mastery (pInit)
9
+ * - P(T): Probability of learning/transition (pLearn)
10
+ * - P(S): Probability of slip (wrong despite mastery) (pSlip)
11
+ * - P(G): Probability of guess (correct despite no mastery) (pGuess)
12
+ *
13
+ * @see Corbett & Anderson (1994). Knowledge tracing: Modeling the acquisition
14
+ * of procedural knowledge. User Modeling and User-Adapted Interaction.
15
+ *
16
+ * @packageDocumentation
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.BKTEngine = exports.BKT_CONFIG_DEFAULTS = void 0;
20
+ exports.fitBKTParameters = fitBKTParameters;
21
+ exports.calculateLogLikelihood = calculateLogLikelihood;
22
+ exports.createBKTEngine = createBKTEngine;
23
+ exports.estimateMastery = estimateMastery;
24
+ const assessment_js_1 = require("../types/assessment.js");
25
+ /**
26
+ * Default BKT configuration
27
+ */
28
+ exports.BKT_CONFIG_DEFAULTS = {
29
+ masteryThreshold: 0.95,
30
+ individualizedParams: false,
31
+ trackHistory: false,
32
+ };
33
+ /**
34
+ * Bayesian Knowledge Tracing Engine
35
+ *
36
+ * Tracks learner mastery using the classic BKT model.
37
+ * Can be used with skill-level or global parameters.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const bkt = new BKTEngine();
42
+ *
43
+ * // Initialize state for a skill
44
+ * let state = bkt.initializeState('skill-1');
45
+ *
46
+ * // Update after correct response
47
+ * state = bkt.update(state, true).state;
48
+ * console.log(`Mastery: ${state.pMastery.toFixed(2)}`);
49
+ *
50
+ * // Update after incorrect response
51
+ * state = bkt.update(state, false).state;
52
+ * ```
53
+ */
54
+ class BKTEngine {
55
+ config;
56
+ skillParams;
57
+ globalParams;
58
+ constructor(config = {}, globalParams = assessment_js_1.BKT_DEFAULTS) {
59
+ this.config = { ...exports.BKT_CONFIG_DEFAULTS, ...config };
60
+ this.globalParams = globalParams;
61
+ this.skillParams = new Map();
62
+ }
63
+ /**
64
+ * Set parameters for a specific skill
65
+ */
66
+ setSkillParameters(skillId, params) {
67
+ this.skillParams.set(skillId, params);
68
+ }
69
+ /**
70
+ * Get parameters for a skill (falls back to global)
71
+ */
72
+ getParameters(skillId) {
73
+ if (skillId && this.config.individualizedParams) {
74
+ return this.skillParams.get(skillId) ?? this.globalParams;
75
+ }
76
+ return this.globalParams;
77
+ }
78
+ /**
79
+ * Initialize BKT state for a skill
80
+ */
81
+ initializeState(skillId) {
82
+ const params = this.getParameters(skillId);
83
+ const baseState = {
84
+ skillId,
85
+ pMastery: params.pInit,
86
+ observations: 0,
87
+ };
88
+ if (this.config.trackHistory) {
89
+ baseState.history = [];
90
+ }
91
+ return baseState;
92
+ }
93
+ /**
94
+ * Update BKT state based on an observed response
95
+ *
96
+ * Uses Bayes' theorem to update the mastery probability:
97
+ * - For correct response: P(Lₙ|correct) ∝ P(correct|Lₙ) × P(Lₙ)
98
+ * - For incorrect response: P(Lₙ|incorrect) ∝ P(incorrect|Lₙ) × P(Lₙ)
99
+ *
100
+ * Then applies the learning transition.
101
+ *
102
+ * @param state - Current BKT state
103
+ * @param correct - Whether the response was correct
104
+ * @param skillId - Optional skill ID for skill-specific parameters
105
+ * @returns Updated state and result information
106
+ */
107
+ update(state, correct, skillId) {
108
+ const params = this.getParameters(skillId ?? state.skillId);
109
+ const previousMastery = state.pMastery;
110
+ // Calculate likelihood of observation given each hidden state
111
+ // P(correct | mastered) = 1 - P(slip)
112
+ // P(correct | not mastered) = P(guess)
113
+ const pCorrectGivenMastery = 1 - params.pSlip;
114
+ const pCorrectGivenNoMastery = params.pGuess;
115
+ // Calculate posterior probability of mastery given observation
116
+ let pMasteryGivenObs;
117
+ let likelihood;
118
+ if (correct) {
119
+ // P(L|correct) = P(correct|L) × P(L) / P(correct)
120
+ const pCorrect = pCorrectGivenMastery * state.pMastery +
121
+ pCorrectGivenNoMastery * (1 - state.pMastery);
122
+ pMasteryGivenObs = (pCorrectGivenMastery * state.pMastery) / pCorrect;
123
+ likelihood = pCorrect;
124
+ }
125
+ else {
126
+ // P(L|incorrect) = P(incorrect|L) × P(L) / P(incorrect)
127
+ const pIncorrect = params.pSlip * state.pMastery +
128
+ (1 - params.pGuess) * (1 - state.pMastery);
129
+ pMasteryGivenObs = (params.pSlip * state.pMastery) / pIncorrect;
130
+ likelihood = pIncorrect;
131
+ }
132
+ // Apply learning transition: P(Lₙ₊₁) = P(Lₙ|obs) + P(T) × (1 - P(Lₙ|obs))
133
+ // This accounts for the possibility of learning during the opportunity
134
+ const pMastery = pMasteryGivenObs + params.pLearn * (1 - pMasteryGivenObs);
135
+ // Build updated state
136
+ const newState = {
137
+ skillId: state.skillId,
138
+ pMastery,
139
+ observations: state.observations + 1,
140
+ };
141
+ if (this.config.trackHistory) {
142
+ newState.history = [...(state.history ?? []), correct];
143
+ }
144
+ const result = {
145
+ pMastery,
146
+ isMastered: pMastery >= this.config.masteryThreshold,
147
+ likelihood,
148
+ previousMastery,
149
+ };
150
+ return { state: newState, result };
151
+ }
152
+ /**
153
+ * Update from multiple responses
154
+ */
155
+ updateBatch(state, responses, skillId) {
156
+ let currentState = state;
157
+ const results = [];
158
+ for (const correct of responses) {
159
+ const { state: newState, result } = this.update(currentState, correct, skillId);
160
+ currentState = newState;
161
+ results.push(result);
162
+ }
163
+ return { state: currentState, results };
164
+ }
165
+ /**
166
+ * Predict the probability of a correct response
167
+ */
168
+ predict(state, skillId) {
169
+ const params = this.getParameters(skillId ?? state.skillId);
170
+ // P(correct) = P(correct|mastered) × P(mastered) + P(correct|not mastered) × P(not mastered)
171
+ const pCorrect = (1 - params.pSlip) * state.pMastery +
172
+ params.pGuess * (1 - state.pMastery);
173
+ // What would mastery be after correct/incorrect?
174
+ const { state: stateIfCorrect } = this.update({ ...state }, true, skillId);
175
+ const { state: stateIfIncorrect } = this.update({ ...state }, false, skillId);
176
+ return {
177
+ pCorrect,
178
+ masteryIfCorrect: stateIfCorrect.pMastery,
179
+ masteryIfIncorrect: stateIfIncorrect.pMastery,
180
+ };
181
+ }
182
+ /**
183
+ * Estimate number of opportunities until mastery
184
+ *
185
+ * Uses a forward simulation assuming consistent correct responses.
186
+ */
187
+ estimateOpportunitiesToMastery(state, skillId, maxOpportunities = 100) {
188
+ if (state.pMastery >= this.config.masteryThreshold) {
189
+ return 0;
190
+ }
191
+ let currentState = { ...state };
192
+ for (let i = 1; i <= maxOpportunities; i++) {
193
+ // Simulate correct response
194
+ const { state: newState } = this.update(currentState, true, skillId);
195
+ if (newState.pMastery >= this.config.masteryThreshold) {
196
+ return i;
197
+ }
198
+ currentState = newState;
199
+ }
200
+ return null; // Mastery not achievable within max opportunities
201
+ }
202
+ /**
203
+ * Check if mastery threshold is met
204
+ */
205
+ isMastered(state) {
206
+ return state.pMastery >= this.config.masteryThreshold;
207
+ }
208
+ /**
209
+ * Convert BKT state to MasteryState for integration with other systems
210
+ */
211
+ toMasteryState(state) {
212
+ return {
213
+ skillId: state.skillId,
214
+ mastery: state.pMastery,
215
+ attempts: state.observations,
216
+ streak: this.calculateStreak(state),
217
+ };
218
+ }
219
+ /**
220
+ * Calculate current streak from history
221
+ */
222
+ calculateStreak(state) {
223
+ if (!state.history || state.history.length === 0) {
224
+ return 0;
225
+ }
226
+ let streak = 0;
227
+ for (let i = state.history.length - 1; i >= 0; i--) {
228
+ if (state.history[i]) {
229
+ streak++;
230
+ }
231
+ else {
232
+ break;
233
+ }
234
+ }
235
+ return streak;
236
+ }
237
+ }
238
+ exports.BKTEngine = BKTEngine;
239
+ /**
240
+ * Fit BKT parameters to response data
241
+ *
242
+ * @param sequences - Array of response sequences (true = correct)
243
+ * @param gridSize - Number of values to try for each parameter
244
+ * @returns Best fitting parameters
245
+ *
246
+ * @example
247
+ * ```typescript
248
+ * const sequences = [
249
+ * [false, false, true, true, true],
250
+ * [true, false, true, true, true],
251
+ * [false, true, true, true, true],
252
+ * ];
253
+ *
254
+ * const result = fitBKTParameters(sequences);
255
+ * console.log('Best parameters:', result.params);
256
+ * ```
257
+ */
258
+ function fitBKTParameters(sequences, gridSize = 10) {
259
+ // Generate grid values
260
+ const values = Array.from({ length: gridSize }, (_, i) => (i + 1) / (gridSize + 1));
261
+ // Constraints on parameters
262
+ const pInitValues = values.filter((v) => v >= 0.1 && v <= 0.9);
263
+ const pLearnValues = values.filter((v) => v >= 0.01 && v <= 0.5);
264
+ const pSlipValues = values.filter((v) => v >= 0.01 && v <= 0.3);
265
+ const pGuessValues = values.filter((v) => v >= 0.01 && v <= 0.4);
266
+ let bestParams = assessment_js_1.BKT_DEFAULTS;
267
+ let bestLogLikelihood = -Infinity;
268
+ let evaluations = 0;
269
+ // Grid search
270
+ for (const pInit of pInitValues) {
271
+ for (const pLearn of pLearnValues) {
272
+ for (const pSlip of pSlipValues) {
273
+ for (const pGuess of pGuessValues) {
274
+ // Skip invalid combinations (guess + slip should be < 1 for identifiability)
275
+ if (pSlip + pGuess >= 1)
276
+ continue;
277
+ const params = { pInit, pLearn, pSlip, pGuess };
278
+ const logLikelihood = calculateLogLikelihood(sequences, params);
279
+ evaluations++;
280
+ if (logLikelihood > bestLogLikelihood) {
281
+ bestLogLikelihood = logLikelihood;
282
+ bestParams = params;
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return {
289
+ params: bestParams,
290
+ logLikelihood: bestLogLikelihood,
291
+ evaluations,
292
+ };
293
+ }
294
+ /**
295
+ * Calculate log-likelihood of response sequences given BKT parameters
296
+ */
297
+ function calculateLogLikelihood(sequences, params) {
298
+ let totalLogLikelihood = 0;
299
+ for (const sequence of sequences) {
300
+ let pMastery = params.pInit;
301
+ for (const correct of sequence) {
302
+ // P(correct | state)
303
+ const pCorrectGivenMastery = 1 - params.pSlip;
304
+ const pCorrectGivenNoMastery = params.pGuess;
305
+ // P(observation)
306
+ const pObs = correct
307
+ ? pCorrectGivenMastery * pMastery + pCorrectGivenNoMastery * (1 - pMastery)
308
+ : params.pSlip * pMastery + (1 - params.pGuess) * (1 - pMastery);
309
+ // Avoid log(0)
310
+ totalLogLikelihood += Math.log(Math.max(pObs, 1e-10));
311
+ // Update mastery
312
+ if (correct) {
313
+ const pCorrect = pCorrectGivenMastery * pMastery +
314
+ pCorrectGivenNoMastery * (1 - pMastery);
315
+ pMastery = (pCorrectGivenMastery * pMastery) / pCorrect;
316
+ }
317
+ else {
318
+ const pIncorrect = params.pSlip * pMastery + (1 - params.pGuess) * (1 - pMastery);
319
+ pMastery = (params.pSlip * pMastery) / pIncorrect;
320
+ }
321
+ // Learning transition
322
+ pMastery = pMastery + params.pLearn * (1 - pMastery);
323
+ }
324
+ }
325
+ return totalLogLikelihood;
326
+ }
327
+ /**
328
+ * Create a BKT engine with default configuration
329
+ */
330
+ function createBKTEngine(config, params) {
331
+ return new BKTEngine(config, params);
332
+ }
333
+ /**
334
+ * Quick mastery estimation using BKT
335
+ *
336
+ * Convenience function for simple use cases.
337
+ *
338
+ * @param responses - Sequence of correct/incorrect responses
339
+ * @param params - BKT parameters (optional, uses defaults)
340
+ * @returns Final mastery probability
341
+ */
342
+ function estimateMastery(responses, params = assessment_js_1.BKT_DEFAULTS) {
343
+ let pMastery = params.pInit;
344
+ for (const correct of responses) {
345
+ const pCorrectGivenMastery = 1 - params.pSlip;
346
+ const pCorrectGivenNoMastery = params.pGuess;
347
+ // Posterior
348
+ if (correct) {
349
+ const pCorrect = pCorrectGivenMastery * pMastery +
350
+ pCorrectGivenNoMastery * (1 - pMastery);
351
+ pMastery = (pCorrectGivenMastery * pMastery) / pCorrect;
352
+ }
353
+ else {
354
+ const pIncorrect = params.pSlip * pMastery + (1 - params.pGuess) * (1 - pMastery);
355
+ pMastery = (params.pSlip * pMastery) / pIncorrect;
356
+ }
357
+ // Learning transition
358
+ pMastery = pMastery + params.pLearn * (1 - pMastery);
359
+ }
360
+ return pMastery;
361
+ }
362
+ //# sourceMappingURL=bkt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bkt.js","sourceRoot":"","sources":["../../../src/assessment/bkt.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAwUH,4CA8CC;AAKD,wDAwCC;AAKD,0CAKC;AAWD,0CA2BC;AA1cD,0DAAsD;AAEtD;;GAEG;AACU,QAAA,mBAAmB,GAAwB;IACtD,gBAAgB,EAAE,IAAI;IACtB,oBAAoB,EAAE,KAAK;IAC3B,YAAY,EAAE,KAAK;CACpB,CAAC;AA4BF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,SAAS;IACH,MAAM,CAAsB;IAC5B,WAAW,CAA8B;IACzC,YAAY,CAAgB;IAE7C,YACE,SAAoB,EAAE,EACtB,eAA8B,4BAAY;QAE1C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,2BAAmB,EAAE,GAAG,MAAM,EAAE,CAAC;QACpD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAgB,EAAE,MAAqB;QACxD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAiB;QAC7B,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAgB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAa;YAC1B,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,KAAK;YACtB,YAAY,EAAE,CAAC;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,KAAe,EACf,OAAgB,EAChB,OAAiB;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEvC,8DAA8D;QAC9D,sCAAsC;QACtC,uCAAuC;QACvC,MAAM,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9C,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7C,+DAA+D;QAC/D,IAAI,gBAAwB,CAAC;QAC7B,IAAI,UAAkB,CAAC;QAEvB,IAAI,OAAO,EAAE,CAAC;YACZ,kDAAkD;YAClD,MAAM,QAAQ,GACZ,oBAAoB,GAAG,KAAK,CAAC,QAAQ;gBACrC,sBAAsB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChD,gBAAgB,GAAG,CAAC,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;YACtE,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ;gBAC7B,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7C,gBAAgB,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;YAChE,UAAU,GAAG,UAAU,CAAC;QAC1B,CAAC;QAED,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAE3E,sBAAsB;QACtB,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ;YACR,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC;SACrC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,MAAM,GAAoB;YAC9B,QAAQ;YACR,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB;YACpD,UAAU;YACV,eAAe;SAChB,CAAC;QAEF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,WAAW,CACT,KAAe,EACf,SAAoB,EACpB,OAAiB;QAEjB,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAChF,YAAY,GAAG,QAAQ,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAe,EAAE,OAAiB;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5D,6FAA6F;QAC7F,MAAM,QAAQ,GACZ,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ;YACnC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEvC,iDAAiD;QACjD,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3E,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAE9E,OAAO;YACL,QAAQ;YACR,gBAAgB,EAAE,cAAc,CAAC,QAAQ;YACzC,kBAAkB,EAAE,gBAAgB,CAAC,QAAQ;SAC9C,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,8BAA8B,CAC5B,KAAe,EACf,OAAiB,EACjB,gBAAgB,GAAG,GAAG;QAEtB,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACnD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,YAAY,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,4BAA4B;YAC5B,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACrE,IAAI,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACtD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,kDAAkD;IACjE,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAe;QACxB,OAAO,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAe;QAC5B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,QAAQ;YACvB,QAAQ,EAAE,KAAK,CAAC,YAAY;YAC5B,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;SACpC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAe;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAjOD,8BAiOC;AAiBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,gBAAgB,CAC9B,SAAsB,EACtB,QAAQ,GAAG,EAAE;IAEb,uBAAuB;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CACvB,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CACnC,CAAC;IAEF,4BAA4B;IAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAEjE,IAAI,UAAU,GAAG,4BAAY,CAAC;IAC9B,IAAI,iBAAiB,GAAG,CAAC,QAAQ,CAAC;IAClC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,cAAc;IACd,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAChC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;oBAClC,6EAA6E;oBAC7E,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC;wBAAE,SAAS;oBAElC,MAAM,MAAM,GAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;oBAC/D,MAAM,aAAa,GAAG,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBAChE,WAAW,EAAE,CAAC;oBAEd,IAAI,aAAa,GAAG,iBAAiB,EAAE,CAAC;wBACtC,iBAAiB,GAAG,aAAa,CAAC;wBAClC,UAAU,GAAG,MAAM,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,aAAa,EAAE,iBAAiB;QAChC,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CACpC,SAAsB,EACtB,MAAqB;IAErB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QAE5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,qBAAqB;YACrB,MAAM,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;YAC9C,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC;YAE7C,iBAAiB;YACjB,MAAM,IAAI,GAAG,OAAO;gBAClB,CAAC,CAAC,oBAAoB,GAAG,QAAQ,GAAG,sBAAsB,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;gBAC3E,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEnE,eAAe;YACf,kBAAkB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAEtD,iBAAiB;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,QAAQ,GACZ,oBAAoB,GAAG,QAAQ;oBAC/B,sBAAsB,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC1C,QAAQ,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;gBACjE,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC;YACpD,CAAC;YAED,sBAAsB;YACtB,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAC7B,MAAkB,EAClB,MAAsB;IAEtB,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,eAAe,CAC7B,SAAoB,EACpB,SAAwB,4BAAY;IAEpC,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;IAE5B,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,oBAAoB,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9C,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7C,YAAY;QACZ,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,QAAQ,GACZ,oBAAoB,GAAG,QAAQ;gBAC/B,sBAAsB,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC1C,QAAQ,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GACd,MAAM,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YACjE,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC;QACpD,CAAC;QAED,sBAAsB;QACtB,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Assessment Framework
4
+ *
5
+ * This module provides comprehensive assessment capabilities:
6
+ * - Bayesian Knowledge Tracing (BKT) for skill-level mastery
7
+ * - Item Response Theory (IRT) for ability estimation
8
+ * - Unified mastery estimation engine
9
+ * - Adaptive testing with intelligent item selection
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.TERMINATION_DEFAULTS = exports.ADAPTIVE_DEFAULTS = exports.createQuestionPool = exports.createAdaptiveEngine = exports.AdaptiveEngine = exports.MASTERY_ENGINE_DEFAULTS = exports.createMasteryEngine = exports.MasteryEngine = exports.IRT_CONFIG_DEFAULTS = exports.estimateAbility = exports.abilityToGradeLevel = exports.abilityToPercentile = exports.selectNextItemMFI = exports.calculateStandardError = exports.calculateTestInformation = exports.calculateInformation = exports.calculateProbabilityDerivative = exports.calculateProbability = exports.createIRTEstimator = exports.IRTEstimator = exports.BKT_CONFIG_DEFAULTS = exports.estimateMastery = exports.calculateLogLikelihood = exports.fitBKTParameters = exports.createBKTEngine = exports.BKTEngine = exports.BKT_DEFAULTS = exports.createResponseId = exports.createAssessmentId = exports.createQuestionId = void 0;
15
+ var assessment_js_1 = require("../types/assessment.js");
16
+ Object.defineProperty(exports, "createQuestionId", { enumerable: true, get: function () { return assessment_js_1.createQuestionId; } });
17
+ Object.defineProperty(exports, "createAssessmentId", { enumerable: true, get: function () { return assessment_js_1.createAssessmentId; } });
18
+ Object.defineProperty(exports, "createResponseId", { enumerable: true, get: function () { return assessment_js_1.createResponseId; } });
19
+ Object.defineProperty(exports, "BKT_DEFAULTS", { enumerable: true, get: function () { return assessment_js_1.BKT_DEFAULTS; } });
20
+ // Bayesian Knowledge Tracing
21
+ var bkt_js_1 = require("./bkt.js");
22
+ Object.defineProperty(exports, "BKTEngine", { enumerable: true, get: function () { return bkt_js_1.BKTEngine; } });
23
+ Object.defineProperty(exports, "createBKTEngine", { enumerable: true, get: function () { return bkt_js_1.createBKTEngine; } });
24
+ Object.defineProperty(exports, "fitBKTParameters", { enumerable: true, get: function () { return bkt_js_1.fitBKTParameters; } });
25
+ Object.defineProperty(exports, "calculateLogLikelihood", { enumerable: true, get: function () { return bkt_js_1.calculateLogLikelihood; } });
26
+ Object.defineProperty(exports, "estimateMastery", { enumerable: true, get: function () { return bkt_js_1.estimateMastery; } });
27
+ Object.defineProperty(exports, "BKT_CONFIG_DEFAULTS", { enumerable: true, get: function () { return bkt_js_1.BKT_CONFIG_DEFAULTS; } });
28
+ // Item Response Theory
29
+ var irt_js_1 = require("./irt.js");
30
+ Object.defineProperty(exports, "IRTEstimator", { enumerable: true, get: function () { return irt_js_1.IRTEstimator; } });
31
+ Object.defineProperty(exports, "createIRTEstimator", { enumerable: true, get: function () { return irt_js_1.createIRTEstimator; } });
32
+ Object.defineProperty(exports, "calculateProbability", { enumerable: true, get: function () { return irt_js_1.calculateProbability; } });
33
+ Object.defineProperty(exports, "calculateProbabilityDerivative", { enumerable: true, get: function () { return irt_js_1.calculateProbabilityDerivative; } });
34
+ Object.defineProperty(exports, "calculateInformation", { enumerable: true, get: function () { return irt_js_1.calculateInformation; } });
35
+ Object.defineProperty(exports, "calculateTestInformation", { enumerable: true, get: function () { return irt_js_1.calculateTestInformation; } });
36
+ Object.defineProperty(exports, "calculateStandardError", { enumerable: true, get: function () { return irt_js_1.calculateStandardError; } });
37
+ Object.defineProperty(exports, "selectNextItemMFI", { enumerable: true, get: function () { return irt_js_1.selectNextItemMFI; } });
38
+ Object.defineProperty(exports, "abilityToPercentile", { enumerable: true, get: function () { return irt_js_1.abilityToPercentile; } });
39
+ Object.defineProperty(exports, "abilityToGradeLevel", { enumerable: true, get: function () { return irt_js_1.abilityToGradeLevel; } });
40
+ Object.defineProperty(exports, "estimateAbility", { enumerable: true, get: function () { return irt_js_1.estimateAbility; } });
41
+ Object.defineProperty(exports, "IRT_CONFIG_DEFAULTS", { enumerable: true, get: function () { return irt_js_1.IRT_CONFIG_DEFAULTS; } });
42
+ // Mastery Engine
43
+ var mastery_engine_js_1 = require("./mastery-engine.js");
44
+ Object.defineProperty(exports, "MasteryEngine", { enumerable: true, get: function () { return mastery_engine_js_1.MasteryEngine; } });
45
+ Object.defineProperty(exports, "createMasteryEngine", { enumerable: true, get: function () { return mastery_engine_js_1.createMasteryEngine; } });
46
+ Object.defineProperty(exports, "MASTERY_ENGINE_DEFAULTS", { enumerable: true, get: function () { return mastery_engine_js_1.MASTERY_ENGINE_DEFAULTS; } });
47
+ // Adaptive Testing
48
+ var adaptive_js_1 = require("./adaptive.js");
49
+ Object.defineProperty(exports, "AdaptiveEngine", { enumerable: true, get: function () { return adaptive_js_1.AdaptiveEngine; } });
50
+ Object.defineProperty(exports, "createAdaptiveEngine", { enumerable: true, get: function () { return adaptive_js_1.createAdaptiveEngine; } });
51
+ Object.defineProperty(exports, "createQuestionPool", { enumerable: true, get: function () { return adaptive_js_1.createQuestionPool; } });
52
+ Object.defineProperty(exports, "ADAPTIVE_DEFAULTS", { enumerable: true, get: function () { return adaptive_js_1.ADAPTIVE_DEFAULTS; } });
53
+ Object.defineProperty(exports, "TERMINATION_DEFAULTS", { enumerable: true, get: function () { return adaptive_js_1.TERMINATION_DEFAULTS; } });
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assessment/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AA4CH,wDAKgC;AAJ9B,iHAAA,gBAAgB,OAAA;AAChB,mHAAA,kBAAkB,OAAA;AAClB,iHAAA,gBAAgB,OAAA;AAChB,6GAAA,YAAY,OAAA;AAGd,6BAA6B;AAC7B,mCAUkB;AAThB,mGAAA,SAAS,OAAA;AACT,yGAAA,eAAe,OAAA;AACf,0GAAA,gBAAgB,OAAA;AAChB,gHAAA,sBAAsB,OAAA;AACtB,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AAMrB,uBAAuB;AACvB,mCAckB;AAbhB,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAClB,8GAAA,oBAAoB,OAAA;AACpB,wHAAA,8BAA8B,OAAA;AAC9B,8GAAA,oBAAoB,OAAA;AACpB,kHAAA,wBAAwB,OAAA;AACxB,gHAAA,sBAAsB,OAAA;AACtB,2GAAA,iBAAiB,OAAA;AACjB,6GAAA,mBAAmB,OAAA;AACnB,6GAAA,mBAAmB,OAAA;AACnB,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AAIrB,iBAAiB;AACjB,yDAO6B;AAN3B,kHAAA,aAAa,OAAA;AACb,wHAAA,mBAAmB,OAAA;AACnB,4HAAA,uBAAuB,OAAA;AAMzB,mBAAmB;AACnB,6CAQuB;AAPrB,6GAAA,cAAc,OAAA;AACd,mHAAA,oBAAoB,OAAA;AACpB,iHAAA,kBAAkB,OAAA;AAClB,gHAAA,iBAAiB,OAAA;AACjB,mHAAA,oBAAoB,OAAA"}