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