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,406 @@
1
+ /**
2
+ * Item Response Theory (IRT)
3
+ *
4
+ * Implements the 1PL (Rasch), 2PL, and 3PL IRT models for:
5
+ * - Calculating probability of correct response
6
+ * - Estimating learner ability (theta)
7
+ * - Calculating item information
8
+ * - Adaptive item selection
9
+ *
10
+ * @see Lord, F.M. (1980). Applications of item response theory to practical testing problems.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ /**
15
+ * Default IRT configuration
16
+ */
17
+ export const IRT_CONFIG_DEFAULTS = {
18
+ model: '2PL',
19
+ abilityPrior: { mean: 0, sd: 1 },
20
+ maxIterations: 100,
21
+ convergenceThreshold: 0.001,
22
+ };
23
+ /**
24
+ * Calculate probability of correct response using IRT model
25
+ *
26
+ * 1PL (Rasch): P(θ) = 1 / (1 + exp(-(θ - b)))
27
+ * 2PL: P(θ) = 1 / (1 + exp(-a(θ - b)))
28
+ * 3PL: P(θ) = c + (1 - c) / (1 + exp(-a(θ - b)))
29
+ *
30
+ * @param theta - Ability parameter
31
+ * @param params - Item parameters
32
+ * @returns Probability of correct response (0-1)
33
+ */
34
+ export function calculateProbability(theta, params) {
35
+ const { difficulty: b, model } = params;
36
+ const a = params.discrimination ?? 1.0;
37
+ const c = params.guessing ?? 0.0;
38
+ // Logistic function
39
+ const z = a * (theta - b);
40
+ const pStar = 1 / (1 + Math.exp(-z));
41
+ switch (model) {
42
+ case '1PL':
43
+ return 1 / (1 + Math.exp(-(theta - b)));
44
+ case '2PL':
45
+ return pStar;
46
+ case '3PL':
47
+ return c + (1 - c) * pStar;
48
+ default:
49
+ return pStar;
50
+ }
51
+ }
52
+ /**
53
+ * Calculate the first derivative of P with respect to theta
54
+ * Used in ability estimation
55
+ */
56
+ export function calculateProbabilityDerivative(theta, params) {
57
+ const { difficulty: b, model } = params;
58
+ const a = params.discrimination ?? 1.0;
59
+ const c = params.guessing ?? 0.0;
60
+ const z = a * (theta - b);
61
+ const expNegZ = Math.exp(-z);
62
+ const pStar = 1 / (1 + expNegZ);
63
+ switch (model) {
64
+ case '1PL':
65
+ return pStar * (1 - pStar);
66
+ case '2PL':
67
+ return a * pStar * (1 - pStar);
68
+ case '3PL':
69
+ return a * (1 - c) * pStar * (1 - pStar);
70
+ default:
71
+ return a * pStar * (1 - pStar);
72
+ }
73
+ }
74
+ /**
75
+ * Calculate Fisher Information for an item at a given ability
76
+ *
77
+ * Information represents how precisely the item measures ability at theta.
78
+ * Higher information = more useful for measuring that ability level.
79
+ *
80
+ * I(θ) = [P'(θ)]² / [P(θ)(1-P(θ))]
81
+ */
82
+ export function calculateInformation(theta, params) {
83
+ const p = calculateProbability(theta, params);
84
+ const pPrime = calculateProbabilityDerivative(theta, params);
85
+ // Avoid division by zero
86
+ const denominator = p * (1 - p);
87
+ if (denominator < 1e-10) {
88
+ return 0;
89
+ }
90
+ return (pPrime * pPrime) / denominator;
91
+ }
92
+ /**
93
+ * Calculate test information (sum of item information)
94
+ */
95
+ export function calculateTestInformation(theta, items) {
96
+ return items.reduce((sum, item) => sum + calculateInformation(theta, item), 0);
97
+ }
98
+ /**
99
+ * Calculate standard error of ability estimate
100
+ * SE(θ) = 1 / √I(θ)
101
+ */
102
+ export function calculateStandardError(theta, items) {
103
+ const information = calculateTestInformation(theta, items);
104
+ if (information < 1e-10) {
105
+ return 10; // Large SE when no information
106
+ }
107
+ return 1 / Math.sqrt(information);
108
+ }
109
+ /**
110
+ * IRT Ability Estimator
111
+ *
112
+ * Estimates learner ability (theta) from response patterns using
113
+ * Maximum Likelihood Estimation (MLE) or Expected A Posteriori (EAP).
114
+ */
115
+ export class IRTEstimator {
116
+ config;
117
+ constructor(config = {}) {
118
+ this.config = { ...IRT_CONFIG_DEFAULTS, ...config };
119
+ }
120
+ /**
121
+ * Estimate ability using Maximum Likelihood Estimation (MLE)
122
+ *
123
+ * Uses Newton-Raphson iteration to find the theta that maximizes
124
+ * the likelihood of the observed response pattern.
125
+ */
126
+ estimateMLE(responses) {
127
+ if (responses.length === 0) {
128
+ return this.defaultEstimate();
129
+ }
130
+ // Check for extreme patterns
131
+ const allCorrect = responses.every((r) => r.correct);
132
+ const allIncorrect = responses.every((r) => !r.correct);
133
+ if (allCorrect) {
134
+ return this.extremeEstimate(responses, 3);
135
+ }
136
+ if (allIncorrect) {
137
+ return this.extremeEstimate(responses, -3);
138
+ }
139
+ // Newton-Raphson iteration
140
+ let theta = 0; // Start at mean
141
+ let iteration = 0;
142
+ while (iteration < this.config.maxIterations) {
143
+ const { firstDerivative, secondDerivative } = this.calculateDerivatives(theta, responses);
144
+ // Newton-Raphson update
145
+ if (Math.abs(secondDerivative) < 1e-10) {
146
+ break;
147
+ }
148
+ const delta = firstDerivative / secondDerivative;
149
+ theta = theta - delta;
150
+ // Bound theta to reasonable range
151
+ theta = Math.max(-4, Math.min(4, theta));
152
+ // Check convergence
153
+ if (Math.abs(delta) < this.config.convergenceThreshold) {
154
+ break;
155
+ }
156
+ iteration++;
157
+ }
158
+ return this.buildEstimate(theta, responses, 'MLE');
159
+ }
160
+ /**
161
+ * Estimate ability using Expected A Posteriori (EAP)
162
+ *
163
+ * Uses numerical integration with a prior distribution.
164
+ * More stable than MLE, especially with few responses.
165
+ */
166
+ estimateEAP(responses) {
167
+ if (responses.length === 0) {
168
+ return this.defaultEstimate();
169
+ }
170
+ // Quadrature points
171
+ const numPoints = 49;
172
+ const range = 4;
173
+ const points = Array.from({ length: numPoints }, (_, i) => -range + (2 * range * i) / (numPoints - 1));
174
+ // Calculate posterior at each point
175
+ let numerator = 0;
176
+ let denominator = 0;
177
+ let variance = 0;
178
+ for (const theta of points) {
179
+ const prior = this.normalPDF(theta, this.config.abilityPrior.mean, this.config.abilityPrior.sd);
180
+ const likelihood = this.calculateLikelihood(theta, responses);
181
+ const posterior = prior * likelihood;
182
+ numerator += theta * posterior;
183
+ denominator += posterior;
184
+ }
185
+ if (denominator < 1e-10) {
186
+ return this.defaultEstimate();
187
+ }
188
+ const thetaEAP = numerator / denominator;
189
+ // Calculate variance for SE
190
+ for (const theta of points) {
191
+ const prior = this.normalPDF(theta, this.config.abilityPrior.mean, this.config.abilityPrior.sd);
192
+ const likelihood = this.calculateLikelihood(theta, responses);
193
+ const posterior = prior * likelihood;
194
+ variance += (theta - thetaEAP) ** 2 * posterior;
195
+ }
196
+ const se = Math.sqrt(variance / denominator);
197
+ return {
198
+ theta: thetaEAP,
199
+ standardError: se,
200
+ itemCount: responses.length,
201
+ method: 'EAP',
202
+ confidenceInterval: {
203
+ lower: thetaEAP - 1.96 * se,
204
+ upper: thetaEAP + 1.96 * se,
205
+ },
206
+ };
207
+ }
208
+ /**
209
+ * Estimate ability using Maximum A Posteriori (MAP)
210
+ *
211
+ * Like MLE but includes prior distribution.
212
+ */
213
+ estimateMAP(responses) {
214
+ if (responses.length === 0) {
215
+ return this.defaultEstimate();
216
+ }
217
+ // Newton-Raphson with prior
218
+ let theta = this.config.abilityPrior.mean;
219
+ let iteration = 0;
220
+ while (iteration < this.config.maxIterations) {
221
+ const { firstDerivative, secondDerivative } = this.calculateDerivatives(theta, responses);
222
+ // Add prior contribution
223
+ const priorMean = this.config.abilityPrior.mean;
224
+ const priorVar = this.config.abilityPrior.sd ** 2;
225
+ const priorFirstDeriv = -(theta - priorMean) / priorVar;
226
+ const priorSecondDeriv = -1 / priorVar;
227
+ const totalFirst = firstDerivative + priorFirstDeriv;
228
+ const totalSecond = secondDerivative + priorSecondDeriv;
229
+ if (Math.abs(totalSecond) < 1e-10) {
230
+ break;
231
+ }
232
+ const delta = totalFirst / totalSecond;
233
+ theta = theta - delta;
234
+ // Bound theta
235
+ theta = Math.max(-4, Math.min(4, theta));
236
+ if (Math.abs(delta) < this.config.convergenceThreshold) {
237
+ break;
238
+ }
239
+ iteration++;
240
+ }
241
+ return this.buildEstimate(theta, responses, 'MAP');
242
+ }
243
+ /**
244
+ * Auto-select best estimation method based on response count
245
+ */
246
+ estimate(responses) {
247
+ if (responses.length < 5) {
248
+ return this.estimateEAP(responses); // EAP is more stable with few items
249
+ }
250
+ return this.estimateMLE(responses);
251
+ }
252
+ /**
253
+ * Calculate log-likelihood derivatives for Newton-Raphson
254
+ */
255
+ calculateDerivatives(theta, responses) {
256
+ let first = 0;
257
+ let second = 0;
258
+ for (const response of responses) {
259
+ const p = calculateProbability(theta, response.params);
260
+ const pPrime = calculateProbabilityDerivative(theta, response.params);
261
+ const q = 1 - p;
262
+ const u = response.correct ? 1 : 0;
263
+ // Avoid division by zero
264
+ if (p < 1e-10 || q < 1e-10)
265
+ continue;
266
+ // First derivative: Σ (u - P) × P' / (P × Q)
267
+ first += ((u - p) * pPrime) / (p * q);
268
+ // Second derivative (negative Hessian)
269
+ second -= (pPrime * pPrime) / (p * q);
270
+ }
271
+ return { firstDerivative: first, secondDerivative: second };
272
+ }
273
+ /**
274
+ * Calculate likelihood of response pattern
275
+ */
276
+ calculateLikelihood(theta, responses) {
277
+ let logLikelihood = 0;
278
+ for (const response of responses) {
279
+ const p = calculateProbability(theta, response.params);
280
+ logLikelihood += response.correct ? Math.log(p) : Math.log(1 - p);
281
+ }
282
+ return Math.exp(logLikelihood);
283
+ }
284
+ /**
285
+ * Normal PDF for prior
286
+ */
287
+ normalPDF(x, mean, sd) {
288
+ const z = (x - mean) / sd;
289
+ return Math.exp(-0.5 * z * z) / (sd * Math.sqrt(2 * Math.PI));
290
+ }
291
+ /**
292
+ * Build ability estimate result
293
+ */
294
+ buildEstimate(theta, responses, method) {
295
+ const items = responses.map((r) => r.params);
296
+ const se = calculateStandardError(theta, items);
297
+ return {
298
+ theta,
299
+ standardError: se,
300
+ itemCount: responses.length,
301
+ method,
302
+ confidenceInterval: {
303
+ lower: theta - 1.96 * se,
304
+ upper: theta + 1.96 * se,
305
+ },
306
+ };
307
+ }
308
+ /**
309
+ * Default estimate when no responses
310
+ */
311
+ defaultEstimate() {
312
+ return {
313
+ theta: this.config.abilityPrior.mean,
314
+ standardError: this.config.abilityPrior.sd,
315
+ itemCount: 0,
316
+ method: 'EAP',
317
+ confidenceInterval: {
318
+ lower: this.config.abilityPrior.mean - 1.96 * this.config.abilityPrior.sd,
319
+ upper: this.config.abilityPrior.mean + 1.96 * this.config.abilityPrior.sd,
320
+ },
321
+ };
322
+ }
323
+ /**
324
+ * Handle extreme response patterns
325
+ */
326
+ extremeEstimate(responses, theta) {
327
+ const items = responses.map((r) => r.params);
328
+ // Large SE for extreme patterns
329
+ const se = Math.max(calculateStandardError(theta, items), 1.5);
330
+ return {
331
+ theta,
332
+ standardError: se,
333
+ itemCount: responses.length,
334
+ method: 'MLE',
335
+ confidenceInterval: {
336
+ lower: theta - 1.96 * se,
337
+ upper: theta + 1.96 * se,
338
+ },
339
+ };
340
+ }
341
+ }
342
+ /**
343
+ * Select next item for adaptive testing using Maximum Fisher Information
344
+ *
345
+ * Selects the item that provides the most information at the current ability estimate.
346
+ */
347
+ export function selectNextItemMFI(currentTheta, availableItems, administeredIds) {
348
+ let bestItem = null;
349
+ let maxInfo = -Infinity;
350
+ for (const item of availableItems) {
351
+ if (administeredIds.has(item.id))
352
+ continue;
353
+ const info = calculateInformation(currentTheta, item.params);
354
+ if (info > maxInfo) {
355
+ maxInfo = info;
356
+ bestItem = item;
357
+ }
358
+ }
359
+ if (!bestItem)
360
+ return null;
361
+ return { ...bestItem, information: maxInfo };
362
+ }
363
+ /**
364
+ * Convert ability (theta) to percentile
365
+ *
366
+ * Assumes standard normal distribution of ability.
367
+ */
368
+ export function abilityToPercentile(theta) {
369
+ // Standard normal CDF approximation
370
+ const t = 1 / (1 + 0.2316419 * Math.abs(theta));
371
+ const d = 0.3989423 * Math.exp((-theta * theta) / 2);
372
+ const p = d *
373
+ t *
374
+ (0.3193815 +
375
+ t * (-0.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))));
376
+ return theta >= 0 ? (1 - p) * 100 : p * 100;
377
+ }
378
+ /**
379
+ * Convert ability to grade-level equivalent (rough approximation)
380
+ *
381
+ * Maps theta to approximate grade level (K-12 scale).
382
+ */
383
+ export function abilityToGradeLevel(theta) {
384
+ // Map -3 to +3 roughly to K-12
385
+ // 0 = 6th grade, -3 = K, +3 = 12+
386
+ return Math.max(0, Math.min(12, 6 + theta * 2));
387
+ }
388
+ /**
389
+ * Create an IRT estimator
390
+ */
391
+ export function createIRTEstimator(config) {
392
+ return new IRTEstimator(config);
393
+ }
394
+ /**
395
+ * Quick ability estimation using EAP
396
+ */
397
+ export function estimateAbility(responses, config) {
398
+ const estimator = new IRTEstimator(config);
399
+ const irtResponses = responses.map((r, i) => ({
400
+ questionId: `q-${i}`,
401
+ params: r.params,
402
+ correct: r.correct,
403
+ }));
404
+ return estimator.estimateEAP(irtResponses).theta;
405
+ }
406
+ //# sourceMappingURL=irt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"irt.js","sourceRoot":"","sources":["../../../src/assessment/irt.ts"],"names":[],"mappings":"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"}