@classytic/labs 0.1.0 → 0.2.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 (455) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +18 -0
  2. package/dist/biology/enzyme-rate/preset.mjs +5 -5
  3. package/dist/biology/genetic-cross/core.d.mts +7 -7
  4. package/dist/biology/genetic-cross/core.mjs +4 -4
  5. package/dist/biology/genetic-cross/grid.mjs +132 -123
  6. package/dist/biology/genetic-cross/preset.mjs +4 -4
  7. package/dist/biology/genetic-cross/sex-linked.mjs +7 -7
  8. package/dist/biology/photosynthesis-factors/preset.mjs +8 -8
  9. package/dist/biology/respiration/preset.mjs +4 -4
  10. package/dist/biology/sequence/central-dogma.mjs +5 -5
  11. package/dist/biology/sequence/core.d.mts +6 -6
  12. package/dist/biology/sequence/core.mjs +1 -1
  13. package/dist/biology/sequence/preset.mjs +6 -6
  14. package/dist/blocks/authoring.mjs +5 -5
  15. package/dist/blocks/biology.d.mts +2 -2
  16. package/dist/blocks/biology.mjs +5 -5
  17. package/dist/blocks/chem.d.mts +2 -2
  18. package/dist/blocks/chem.mjs +13 -13
  19. package/dist/blocks/circuits.d.mts +293 -4
  20. package/dist/blocks/circuits.mjs +874 -9
  21. package/dist/blocks/discrete.d.mts +30 -2
  22. package/dist/blocks/discrete.mjs +74 -4
  23. package/dist/blocks/economics.mjs +1 -1
  24. package/dist/blocks/geography.mjs +1 -1
  25. package/dist/blocks/geometry.mjs +3 -3
  26. package/dist/blocks/ict.d.mts +90 -1
  27. package/dist/blocks/ict.mjs +217 -7
  28. package/dist/blocks/index.d.mts +3064 -657
  29. package/dist/blocks/index.mjs +9 -9
  30. package/dist/blocks/lab-block.mjs +5 -5
  31. package/dist/blocks/lab-config.d.mts +1 -1
  32. package/dist/blocks/lab-config.mjs +4 -4
  33. package/dist/blocks/lab-gallery.d.mts +1 -1
  34. package/dist/blocks/lab-gallery.mjs +2 -2
  35. package/dist/blocks/language.d.mts +6 -6
  36. package/dist/blocks/language.mjs +12 -12
  37. package/dist/blocks/lesson.mjs +4 -4
  38. package/dist/blocks/math.d.mts +577 -11
  39. package/dist/blocks/math.mjs +1648 -14
  40. package/dist/blocks/ml.d.mts +45 -1
  41. package/dist/blocks/ml.mjs +80 -6
  42. package/dist/blocks/physics.d.mts +9 -4
  43. package/dist/blocks/physics.mjs +75 -28
  44. package/dist/blocks/statistics.mjs +1 -1
  45. package/dist/build/CircuitEditor.d.mts +14 -0
  46. package/dist/build/CircuitEditor.mjs +787 -0
  47. package/dist/build/CircuitPlayer.d.mts +19 -0
  48. package/dist/build/CircuitPlayer.mjs +53 -0
  49. package/dist/build/CircuitScene.d.mts +61 -0
  50. package/dist/build/CircuitScene.mjs +383 -0
  51. package/dist/build/contract.d.mts +116 -0
  52. package/dist/build/editor-ops.d.mts +65 -0
  53. package/dist/build/editor-ops.mjs +306 -0
  54. package/dist/build/editor-ui.mjs +121 -0
  55. package/dist/build/flow.d.mts +14 -0
  56. package/dist/build/flow.mjs +119 -0
  57. package/dist/build/index.d.mts +10 -0
  58. package/dist/build/index.mjs +10 -0
  59. package/dist/build/parts/ammeter.d.mts +1 -0
  60. package/dist/build/parts/ammeter.mjs +32 -0
  61. package/dist/build/parts/bulb.d.mts +1 -0
  62. package/dist/build/parts/bulb.mjs +50 -0
  63. package/dist/build/parts/capacitor.d.mts +1 -0
  64. package/dist/build/parts/capacitor.mjs +26 -0
  65. package/dist/build/parts/cell.d.mts +1 -0
  66. package/dist/build/parts/cell.mjs +40 -0
  67. package/dist/build/parts/diode.d.mts +1 -0
  68. package/dist/build/parts/diode.mjs +33 -0
  69. package/dist/build/parts/index.d.mts +5 -0
  70. package/dist/build/parts/index.mjs +43 -0
  71. package/dist/build/parts/mosfet.d.mts +1 -0
  72. package/dist/build/parts/mosfet.mjs +95 -0
  73. package/dist/build/parts/node.d.mts +1 -0
  74. package/dist/build/parts/node.mjs +32 -0
  75. package/dist/build/parts/resistor.d.mts +1 -0
  76. package/dist/build/parts/resistor.mjs +49 -0
  77. package/dist/build/parts/shared.mjs +42 -0
  78. package/dist/build/parts/switch.d.mts +1 -0
  79. package/dist/build/parts/switch.mjs +34 -0
  80. package/dist/build/parts.d.mts +1 -0
  81. package/dist/build/registry.d.mts +9 -0
  82. package/dist/build/registry.mjs +15 -0
  83. package/dist/build/solve.d.mts +8 -0
  84. package/dist/build/solve.mjs +0 -0
  85. package/dist/catalog/registry.d.mts +2 -2
  86. package/dist/catalog/templates.d.mts +1 -1
  87. package/dist/catalog/templates.mjs +6 -6
  88. package/dist/chem/battery.mjs +1 -1
  89. package/dist/chem/bohr-atom.mjs +4 -4
  90. package/dist/chem/diffusion/preset.mjs +4 -4
  91. package/dist/chem/electrochem/preset.mjs +5 -5
  92. package/dist/chem/equilibrium/preset.d.mts +1 -1
  93. package/dist/chem/equilibrium/preset.mjs +6 -6
  94. package/dist/chem/gas-box/preset.mjs +6 -6
  95. package/dist/chem/kinetics/preset.mjs +6 -6
  96. package/dist/chem/periodic-trends/preset.mjs +7 -7
  97. package/dist/chem/reaction-lab.mjs +3 -3
  98. package/dist/chem/reaction-profile.mjs +4 -4
  99. package/dist/chem/solution/dilution.mjs +6 -6
  100. package/dist/chem/solution/field.d.mts +2 -2
  101. package/dist/chem/solution/field.mjs +2 -2
  102. package/dist/chem/solution/solution-box.mjs +7 -7
  103. package/dist/chem/stoichiometry/preset.mjs +5 -5
  104. package/dist/chem/titration/preset.mjs +5 -5
  105. package/dist/circuits/ac-dc/asset.mjs +1 -1
  106. package/dist/circuits/ac-dc/preset.mjs +2 -2
  107. package/dist/circuits/brownout/index.d.mts +1 -0
  108. package/dist/circuits/brownout/preset.d.mts +22 -0
  109. package/dist/circuits/brownout/preset.mjs +399 -0
  110. package/dist/circuits/capacitor-leak/preset.mjs +13 -8
  111. package/dist/circuits/circuit/asset.mjs +71 -14
  112. package/dist/circuits/circuit/preset.mjs +23 -5
  113. package/dist/circuits/circuit-builder.mjs +60 -132
  114. package/dist/circuits/circuit-lab.mjs +60 -40
  115. package/dist/circuits/cmos-gate/index.d.mts +1 -0
  116. package/dist/circuits/cmos-gate/preset.d.mts +75 -0
  117. package/dist/circuits/cmos-gate/preset.mjs +1491 -0
  118. package/dist/circuits/diode/index.d.mts +1 -0
  119. package/dist/circuits/diode/preset.d.mts +25 -0
  120. package/dist/circuits/diode/preset.mjs +266 -0
  121. package/dist/circuits/index.d.mts +7 -1
  122. package/dist/circuits/index.mjs +7 -1
  123. package/dist/circuits/rc-charging/index.d.mts +1 -0
  124. package/dist/circuits/rc-charging/preset.d.mts +27 -0
  125. package/dist/circuits/rc-charging/preset.mjs +329 -0
  126. package/dist/circuits/semiconductor/index.d.mts +1 -0
  127. package/dist/circuits/semiconductor/preset.d.mts +102 -0
  128. package/dist/circuits/semiconductor/preset.mjs +1855 -0
  129. package/dist/circuits/transistor/index.d.mts +1 -0
  130. package/dist/circuits/transistor/preset.d.mts +27 -0
  131. package/dist/circuits/transistor/preset.mjs +329 -0
  132. package/dist/commerce/accounting/core.d.mts +1 -1
  133. package/dist/commerce/accounting/equation-balance.mjs +5 -5
  134. package/dist/commerce/accounting/journal-poster.mjs +8 -8
  135. package/dist/commerce/accounting/statement-sorter.mjs +4 -4
  136. package/dist/commerce/economics/core.d.mts +2 -2
  137. package/dist/commerce/economics/core.mjs +1 -1
  138. package/dist/commerce/economics/demand-shift-vs-move.mjs +6 -6
  139. package/dist/commerce/economics/elasticity-revenue.mjs +6 -6
  140. package/dist/commerce/economics/market-equilibrium.mjs +5 -5
  141. package/dist/core/easing.d.mts +3 -3
  142. package/dist/core/easing.mjs +2 -2
  143. package/dist/core/numeric.d.mts +3 -3
  144. package/dist/core/numeric.mjs +2 -2
  145. package/dist/core/reactive.d.mts +1 -1
  146. package/dist/core/reactive.mjs +1 -1
  147. package/dist/core/rng.d.mts +2 -2
  148. package/dist/core/rng.mjs +1 -1
  149. package/dist/core/tex.mjs +2 -2
  150. package/dist/core/timeline.d.mts +1 -1
  151. package/dist/core/timeline.mjs +1 -1
  152. package/dist/core/util.mjs +11 -1
  153. package/dist/discrete/arrangements/preset.mjs +6 -14
  154. package/dist/discrete/bayes/preset.mjs +43 -35
  155. package/dist/discrete/binomial/preset.mjs +2 -2
  156. package/dist/discrete/combination-studio/figure.d.mts +6 -0
  157. package/dist/discrete/combination-studio/figure.mjs +159 -0
  158. package/dist/discrete/combination-studio/index.d.mts +2 -0
  159. package/dist/discrete/combination-studio/preset.d.mts +44 -0
  160. package/dist/discrete/combination-studio/preset.mjs +440 -0
  161. package/dist/discrete/core/combinatorics.d.mts +23 -3
  162. package/dist/discrete/core/combinatorics.mjs +38 -3
  163. package/dist/discrete/core/pigeonhole.d.mts +1 -1
  164. package/dist/discrete/core/pigeonhole.mjs +1 -1
  165. package/dist/discrete/core/probability.d.mts +3 -3
  166. package/dist/discrete/core/probability.mjs +3 -3
  167. package/dist/discrete/core/sets.d.mts +1 -1
  168. package/dist/discrete/counting-slots/preset.mjs +8 -8
  169. package/dist/discrete/counting-tree/preset.mjs +65 -8
  170. package/dist/discrete/expected-value/preset.mjs +13 -13
  171. package/dist/discrete/hypergeometric/preset.mjs +48 -15
  172. package/dist/discrete/index.d.mts +4 -2
  173. package/dist/discrete/index.mjs +4 -2
  174. package/dist/discrete/karnaugh/preset.mjs +26 -20
  175. package/dist/discrete/lln/preset.mjs +44 -3
  176. package/dist/discrete/logic-circuit/preset.mjs +2 -2
  177. package/dist/discrete/monte-carlo/preset.d.mts +1 -1
  178. package/dist/discrete/monte-carlo/preset.mjs +14 -14
  179. package/dist/discrete/monty-hall/preset.mjs +6 -6
  180. package/dist/discrete/outcome-builder/preset.mjs +3 -3
  181. package/dist/discrete/pascal/preset.mjs +37 -7
  182. package/dist/discrete/rules.d.mts +20 -0
  183. package/dist/discrete/rules.mjs +264 -0
  184. package/dist/discrete/sample-space/preset.mjs +4 -4
  185. package/dist/discrete/selection/preset.mjs +7 -13
  186. package/dist/discrete/truth-table/preset.mjs +32 -9
  187. package/dist/discrete/venn/preset.mjs +71 -48
  188. package/dist/geography/cycle-lab/preset.mjs +17 -10
  189. package/dist/geography/cycles.d.mts +3 -3
  190. package/dist/geography/cycles.mjs +3 -3
  191. package/dist/geometry/board/preset.d.mts +2 -0
  192. package/dist/geometry/board/preset.mjs +11 -15
  193. package/dist/geometry/builder.mjs +3 -3
  194. package/dist/ict/number-systems/base-odometer.mjs +4 -4
  195. package/dist/ict/number-systems/bit-grouper.d.mts +1 -1
  196. package/dist/ict/number-systems/bit-grouper.mjs +4 -4
  197. package/dist/ict/number-systems/place-value-dial.d.mts +1 -1
  198. package/dist/ict/number-systems/place-value-dial.mjs +3 -3
  199. package/dist/ict/number-systems/wheel.d.mts +3 -3
  200. package/dist/ict/number-systems/wheel.mjs +4 -4
  201. package/dist/kit/annotate.mjs +3 -3
  202. package/dist/kit/answer-check.d.mts +2 -2
  203. package/dist/kit/answer-check.mjs +34 -6
  204. package/dist/kit/ask.d.mts +19 -0
  205. package/dist/kit/ask.mjs +46 -0
  206. package/dist/kit/bar-strip.mjs +53 -0
  207. package/dist/kit/calc.d.mts +33 -0
  208. package/dist/kit/calc.mjs +27 -0
  209. package/dist/kit/carrier-engine.mjs +147 -0
  210. package/dist/kit/clue-scene.d.mts +86 -0
  211. package/dist/kit/clue-scene.mjs +424 -0
  212. package/dist/kit/cluster.d.mts +30 -0
  213. package/dist/kit/cluster.mjs +81 -0
  214. package/dist/kit/controls.mjs +11 -5
  215. package/dist/kit/coords.d.mts +88 -0
  216. package/dist/kit/coords.mjs +192 -0
  217. package/dist/kit/data-scene.d.mts +27 -0
  218. package/dist/kit/data-scene.mjs +199 -0
  219. package/dist/kit/diagram.mjs +111 -50
  220. package/dist/kit/electronics.mjs +552 -60
  221. package/dist/kit/expr-analysis.d.mts +18 -6
  222. package/dist/kit/expr-analysis.mjs +82 -28
  223. package/dist/kit/frame.d.mts +3 -3
  224. package/dist/kit/frame.mjs +25 -6
  225. package/dist/kit/gameshow.mjs +2 -2
  226. package/dist/kit/index.d.mts +14 -2
  227. package/dist/kit/index.mjs +13 -1
  228. package/dist/kit/logic-gates.mjs +246 -47
  229. package/dist/kit/palette.mjs +26 -0
  230. package/dist/kit/pedagogy.d.mts +4 -4
  231. package/dist/kit/pedagogy.mjs +21 -17
  232. package/dist/kit/play.d.mts +1 -1
  233. package/dist/kit/play.mjs +3 -3
  234. package/dist/kit/predict.d.mts +55 -0
  235. package/dist/kit/predict.mjs +146 -0
  236. package/dist/kit/receipt.d.mts +29 -0
  237. package/dist/kit/receipt.mjs +94 -0
  238. package/dist/kit/rich.mjs +2 -2
  239. package/dist/kit/rule.d.mts +59 -0
  240. package/dist/kit/rule.mjs +215 -0
  241. package/dist/kit/scale.mjs +1 -1
  242. package/dist/kit/scene-library.d.mts +22 -0
  243. package/dist/kit/scene-library.mjs +311 -0
  244. package/dist/kit/scene-studio.d.mts +14 -0
  245. package/dist/kit/scene-studio.mjs +338 -0
  246. package/dist/kit/scenes.d.mts +31 -0
  247. package/dist/kit/scenes.mjs +569 -0
  248. package/dist/kit/slot-fill.d.mts +61 -0
  249. package/dist/kit/slot-fill.mjs +207 -0
  250. package/dist/kit/solve.d.mts +21 -0
  251. package/dist/kit/solve.mjs +75 -0
  252. package/dist/kit/space.mjs +5 -5
  253. package/dist/kit/steps.mjs +2 -2
  254. package/dist/kit/vessel.d.mts +69 -0
  255. package/dist/kit/vessel.mjs +191 -0
  256. package/dist/language/agreement/preset.mjs +2 -2
  257. package/dist/language/article-lens/preset.d.mts +1 -1
  258. package/dist/language/article-lens/preset.mjs +8 -8
  259. package/dist/language/deck.d.mts +3 -3
  260. package/dist/language/deck.mjs +1 -1
  261. package/dist/language/preposition-scene/preset.d.mts +2 -2
  262. package/dist/language/preposition-scene/preset.mjs +5 -5
  263. package/dist/language/sentence-builder/preset.mjs +5 -5
  264. package/dist/language/transform/preset.d.mts +2 -2
  265. package/dist/language/transform/preset.mjs +5 -5
  266. package/dist/language/ui.d.mts +3 -3
  267. package/dist/language/ui.mjs +4 -4
  268. package/dist/language/word-match/preset.mjs +3 -3
  269. package/dist/logic/LogicBuildLab.d.mts +22 -0
  270. package/dist/logic/LogicBuildLab.mjs +170 -0
  271. package/dist/logic/LogicEditScene.d.mts +31 -0
  272. package/dist/logic/LogicEditScene.mjs +276 -0
  273. package/dist/logic/LogicEditor.d.mts +14 -0
  274. package/dist/logic/LogicEditor.mjs +413 -0
  275. package/dist/logic/LogicScene.d.mts +32 -0
  276. package/dist/logic/LogicScene.mjs +277 -0
  277. package/dist/logic/contract.d.mts +72 -0
  278. package/dist/logic/display.d.mts +24 -0
  279. package/dist/logic/display.mjs +127 -0
  280. package/dist/logic/edit-ops.d.mts +44 -0
  281. package/dist/logic/edit-ops.mjs +177 -0
  282. package/dist/logic/evaluate.d.mts +11 -0
  283. package/dist/logic/evaluate.mjs +93 -0
  284. package/dist/logic/gates.d.mts +10 -0
  285. package/dist/logic/gates.mjs +73 -0
  286. package/dist/logic/index.d.mts +14 -0
  287. package/dist/logic/index.mjs +13 -0
  288. package/dist/logic/lab.d.mts +32 -0
  289. package/dist/logic/lab.mjs +160 -0
  290. package/dist/logic/presets.d.mts +12 -0
  291. package/dist/logic/presets.mjs +241 -0
  292. package/dist/logic/registry.d.mts +9 -0
  293. package/dist/logic/registry.mjs +15 -0
  294. package/dist/math/area-model/preset.mjs +70 -44
  295. package/dist/math/balance-algebra/preset.mjs +14 -5
  296. package/dist/math/broken-tree/index.d.mts +1 -0
  297. package/dist/math/broken-tree/preset.d.mts +26 -0
  298. package/dist/math/broken-tree/preset.mjs +435 -0
  299. package/dist/math/circle/index.d.mts +1 -0
  300. package/dist/math/circle/preset.d.mts +44 -0
  301. package/dist/math/circle/preset.mjs +198 -0
  302. package/dist/math/complex/core.d.mts +93 -0
  303. package/dist/math/complex/core.mjs +239 -0
  304. package/dist/math/complex/index.d.mts +3 -0
  305. package/dist/math/complex/preset.d.mts +31 -0
  306. package/dist/math/complex/preset.mjs +377 -0
  307. package/dist/math/complex/rules.d.mts +6 -0
  308. package/dist/math/complex/rules.mjs +121 -0
  309. package/dist/math/conic/index.d.mts +1 -0
  310. package/dist/math/conic/preset.d.mts +30 -0
  311. package/dist/math/conic/preset.mjs +334 -0
  312. package/dist/math/derivation.mjs +5 -5
  313. package/dist/math/derivative-explorer/preset.mjs +5 -5
  314. package/dist/math/domain-range/index.d.mts +1 -0
  315. package/dist/math/domain-range/preset.d.mts +33 -0
  316. package/dist/math/domain-range/preset.mjs +313 -0
  317. package/dist/math/fraction-bar/index.d.mts +1 -0
  318. package/dist/math/fraction-bar/preset.d.mts +27 -0
  319. package/dist/math/fraction-bar/preset.mjs +197 -0
  320. package/dist/math/function-machine/preset.mjs +2 -2
  321. package/dist/math/gradient-descent.mjs +6 -6
  322. package/dist/math/grapher/preset.d.mts +1 -1
  323. package/dist/math/grapher/preset.mjs +4 -4
  324. package/dist/math/harmonic-form/preset.mjs +6 -6
  325. package/dist/math/index.d.mts +27 -2
  326. package/dist/math/index.mjs +27 -2
  327. package/dist/math/integral-explorer/preset.mjs +2 -2
  328. package/dist/math/interactive/preset.mjs +3 -3
  329. package/dist/math/limit-explorer/preset.mjs +4 -4
  330. package/dist/math/linear-model/index.d.mts +1 -0
  331. package/dist/math/linear-model/preset.d.mts +53 -0
  332. package/dist/math/linear-model/preset.mjs +164 -0
  333. package/dist/math/linear-system/preset.mjs +4 -4
  334. package/dist/math/mystery-bucket/preset.mjs +6 -6
  335. package/dist/math/number-line/preset.mjs +3 -2
  336. package/dist/math/parabola/preset.mjs +4 -3
  337. package/dist/math/pattern/preset.mjs +7 -13
  338. package/dist/math/percent-bar/index.d.mts +1 -0
  339. package/dist/math/percent-bar/preset.d.mts +37 -0
  340. package/dist/math/percent-bar/preset.mjs +275 -0
  341. package/dist/math/poly/core.d.mts +50 -0
  342. package/dist/math/poly/core.mjs +268 -0
  343. package/dist/math/poly/index.d.mts +3 -0
  344. package/dist/math/poly/preset.d.mts +23 -0
  345. package/dist/math/poly/preset.mjs +141 -0
  346. package/dist/math/poly/steps.d.mts +10 -0
  347. package/dist/math/poly/steps.mjs +99 -0
  348. package/dist/math/rate-machine/index.d.mts +1 -0
  349. package/dist/math/rate-machine/preset.d.mts +35 -0
  350. package/dist/math/rate-machine/preset.mjs +281 -0
  351. package/dist/math/ratio-share/index.d.mts +1 -0
  352. package/dist/math/ratio-share/preset.d.mts +24 -0
  353. package/dist/math/ratio-share/preset.mjs +204 -0
  354. package/dist/math/receipt/index.d.mts +1 -0
  355. package/dist/math/receipt/preset.d.mts +22 -0
  356. package/dist/math/receipt/preset.mjs +137 -0
  357. package/dist/math/sequence-predict/index.d.mts +1 -0
  358. package/dist/math/sequence-predict/preset.d.mts +34 -0
  359. package/dist/math/sequence-predict/preset.mjs +130 -0
  360. package/dist/math/straight-line/index.d.mts +1 -0
  361. package/dist/math/straight-line/preset.d.mts +37 -0
  362. package/dist/math/straight-line/preset.mjs +374 -0
  363. package/dist/math/system-solve/index.d.mts +1 -0
  364. package/dist/math/system-solve/preset.d.mts +21 -0
  365. package/dist/math/system-solve/preset.mjs +227 -0
  366. package/dist/math/transform/index.d.mts +1 -0
  367. package/dist/math/transform/preset.d.mts +41 -0
  368. package/dist/math/transform/preset.mjs +343 -0
  369. package/dist/math/triangle-trig/preset.mjs +12 -9
  370. package/dist/math/trig/core.d.mts +37 -0
  371. package/dist/math/trig/core.mjs +150 -0
  372. package/dist/math/trig/diagrams.d.mts +1 -0
  373. package/dist/math/trig/diagrams.mjs +321 -0
  374. package/dist/math/trig/index.d.mts +3 -0
  375. package/dist/math/trig/preset.d.mts +25 -0
  376. package/dist/math/trig/preset.mjs +260 -0
  377. package/dist/math/trig/rules.d.mts +6 -0
  378. package/dist/math/trig/rules.mjs +159 -0
  379. package/dist/math/trig-explorer.mjs +4 -4
  380. package/dist/ml/boundary/preset.mjs +8 -3
  381. package/dist/ml/classifier/preset.mjs +31 -6
  382. package/dist/ml/kmeans/preset.mjs +4 -4
  383. package/dist/ml/knn/preset.mjs +47 -12
  384. package/dist/ml/regression/preset.mjs +36 -7
  385. package/dist/physics/atwood/preset.mjs +4 -4
  386. package/dist/physics/bullet-walls/preset.d.mts +1 -1
  387. package/dist/physics/bullet-walls/preset.mjs +7 -7
  388. package/dist/physics/carnot/preset.mjs +6 -6
  389. package/dist/physics/circular-motion/preset.mjs +36 -5
  390. package/dist/physics/collision-track/preset.mjs +35 -5
  391. package/dist/physics/efficiency/preset.d.mts +2 -2
  392. package/dist/physics/efficiency/preset.mjs +5 -5
  393. package/dist/physics/electric-field/preset.mjs +32 -23
  394. package/dist/physics/electric-flux/index.d.mts +1 -0
  395. package/dist/physics/electric-flux/preset.d.mts +29 -0
  396. package/dist/physics/electric-flux/preset.mjs +264 -0
  397. package/dist/physics/energy-skate/preset.mjs +5 -5
  398. package/dist/physics/entropy/preset.mjs +7 -7
  399. package/dist/physics/expansion/preset.mjs +13 -13
  400. package/dist/physics/exponential/asset.mjs +1 -1
  401. package/dist/physics/exponential/preset.mjs +4 -4
  402. package/dist/physics/gas-process/preset.mjs +3 -3
  403. package/dist/physics/gauss-law/index.d.mts +1 -0
  404. package/dist/physics/gauss-law/preset.d.mts +20 -0
  405. package/dist/physics/gauss-law/preset.mjs +286 -0
  406. package/dist/physics/gravitation/preset.mjs +7 -7
  407. package/dist/physics/gravity-drop.mjs +4 -4
  408. package/dist/physics/heat-transfer/preset.d.mts +1 -1
  409. package/dist/physics/heat-transfer/preset.mjs +10 -10
  410. package/dist/physics/impulse/preset.mjs +5 -5
  411. package/dist/physics/index.d.mts +4 -1
  412. package/dist/physics/index.mjs +4 -1
  413. package/dist/physics/kepler/preset.mjs +4 -4
  414. package/dist/physics/lever/preset.mjs +3 -3
  415. package/dist/physics/lorentz/preset.mjs +11 -11
  416. package/dist/physics/magnetism/preset.mjs +3 -3
  417. package/dist/physics/optics/preset.mjs +2 -2
  418. package/dist/physics/orbit-lab.mjs +5 -5
  419. package/dist/physics/projectile-lab.mjs +4 -4
  420. package/dist/physics/rain-relative/preset.mjs +5 -5
  421. package/dist/physics/ramp-forces/preset.mjs +5 -5
  422. package/dist/physics/river-boat.mjs +6 -6
  423. package/dist/physics/shm/preset.mjs +9 -9
  424. package/dist/physics/stopping-distance/preset.mjs +3 -3
  425. package/dist/physics/temperature-scales/preset.mjs +105 -116
  426. package/dist/physics/terminal-velocity/preset.mjs +5 -5
  427. package/dist/physics/thermal/preset.mjs +5 -5
  428. package/dist/physics/vector-board/preset.mjs +7 -6
  429. package/dist/physics/vector-scene.mjs +2 -2
  430. package/dist/physics/vector-types/preset.mjs +37 -3
  431. package/dist/physics/water-density/preset.mjs +12 -12
  432. package/dist/physics/waves/doppler.mjs +2 -2
  433. package/dist/physics/waves/preset.mjs +4 -4
  434. package/dist/physics/waves/ripple.mjs +6 -6
  435. package/dist/physics/waves/string.mjs +5 -5
  436. package/dist/physics/work-energy/preset.mjs +4 -4
  437. package/dist/physics/work-potential/index.d.mts +1 -0
  438. package/dist/physics/work-potential/preset.d.mts +20 -0
  439. package/dist/physics/work-potential/preset.mjs +276 -0
  440. package/dist/schemas/index.d.mts +6 -6
  441. package/dist/schemas/index.mjs +3 -3
  442. package/dist/statistics/center-spread/preset.mjs +3 -3
  443. package/dist/statistics/core/descriptive.d.mts +2 -2
  444. package/dist/statistics/core/descriptive.mjs +2 -2
  445. package/dist/statistics/core/normal.d.mts +3 -3
  446. package/dist/statistics/core/normal.mjs +3 -3
  447. package/dist/statistics/core/sequences.d.mts +1 -1
  448. package/dist/statistics/galton/preset.mjs +2 -2
  449. package/dist/statistics/histogram/preset.mjs +6 -6
  450. package/dist/statistics/normal/preset.mjs +2 -2
  451. package/dist/statistics/sampling/preset.mjs +4 -4
  452. package/dist/statistics/sequence/preset.mjs +58 -15
  453. package/dist/statistics/z-table/preset.mjs +17 -4
  454. package/package.json +11 -3
  455. package/styles.css +4 -1
@@ -0,0 +1,440 @@
1
+ 'use client';
2
+
3
+ import { Chip } from "../../kit/controls.mjs";
4
+ import { Callout, ControlBar, LabFrame } from "../../kit/frame.mjs";
5
+ import { ChallengeCard, HintLadder, useChallenge, useCheckpoint, useHints } from "../../kit/pedagogy.mjs";
6
+ import { ruleOfProduct } from "../core/combinatorics.mjs";
7
+ import { CharacterFigure, ComboCard, OptionSwatch } from "./figure.mjs";
8
+ import { useMemo, useState } from "react";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
+
11
+ //#region src/discrete/combination-studio/preset.tsx
12
+ /**
13
+ * CombinationStudioLab, the rule of product you can FEEL. Instead of reading
14
+ * "3 × 2 = 6", the learner:
15
+ * 1. picks one option from each rack (a shirt, some trousers) and watches a
16
+ * little character assemble live, so every outcome is a thing, not a label;
17
+ * 2. PREDICTS how many different ones exist before exploring (predict-first);
18
+ * 3. fills a discovery wall by making each combination, the wall is literally a
19
+ * rows × columns grid, so the product IS an area they complete;
20
+ * 4. adds a third variable (a hat) and watches 3 × 2 = 6 become 3 × 2 × 2 = 12,
21
+ * feeling why a new choice MULTIPLIES.
22
+ *
23
+ * Fully authorable: a creator supplies any scenario (outfits, sundaes, number
24
+ * plates, routes) as categories of options. Pure cartesian-product enumeration;
25
+ * the count uses ruleOfProduct from the discrete kernel.
26
+ */
27
+ const DEFAULT_CATS = [
28
+ {
29
+ id: "shirt",
30
+ label: "Shirt",
31
+ slot: "top",
32
+ options: [
33
+ {
34
+ id: "r",
35
+ label: "red",
36
+ color: "#e5484d"
37
+ },
38
+ {
39
+ id: "b",
40
+ label: "blue",
41
+ color: "#3e63dd"
42
+ },
43
+ {
44
+ id: "g",
45
+ label: "green",
46
+ color: "#30a46c"
47
+ }
48
+ ]
49
+ },
50
+ {
51
+ id: "trousers",
52
+ label: "Trousers",
53
+ slot: "bottom",
54
+ options: [{
55
+ id: "d",
56
+ label: "denim",
57
+ color: "#2b4a8b"
58
+ }, {
59
+ id: "k",
60
+ label: "khaki",
61
+ color: "#a18249"
62
+ }]
63
+ },
64
+ {
65
+ id: "hat",
66
+ label: "Hat",
67
+ slot: "hat",
68
+ options: [{
69
+ id: "o",
70
+ label: "orange",
71
+ color: "#f76808"
72
+ }, {
73
+ id: "p",
74
+ label: "purple",
75
+ color: "#8e4ec6"
76
+ }]
77
+ }
78
+ ];
79
+ /** cartesian product of the active categories' option lists. */
80
+ function enumerate(cats) {
81
+ let acc = [[]];
82
+ for (const c of cats) acc = acc.flatMap((row) => c.options.map((o) => [...row, o]));
83
+ return acc.map((picks) => ({
84
+ key: picks.map((o) => o.id).join("|"),
85
+ picks
86
+ }));
87
+ }
88
+ function partsOf(cats, picks) {
89
+ const p = {};
90
+ cats.forEach((c, i) => {
91
+ const o = picks[i];
92
+ if (!o) return;
93
+ if (c.slot === "top") p.top = o.color;
94
+ else if (c.slot === "bottom") p.bottom = o.color;
95
+ else if (c.slot === "hat") p.hat = o.color;
96
+ else if (c.slot === "hold") p.hold = o.emoji;
97
+ });
98
+ return p;
99
+ }
100
+ function CombinationStudioLab({ scenario = "outfit", categories = DEFAULT_CATS, figure = "character", startActive, maxWall = 60, title = `How many ${scenario}s can you make?`, prompt = "Pick one from each rack, make it, and fill the wall. Each new choice multiplies the total.", objectives, hints: hintList } = {}) {
101
+ const minActive = Math.min(2, categories.length);
102
+ const [active, setActive] = useState(Math.max(1, Math.min(startActive ?? minActive, categories.length)));
103
+ const cats = categories.slice(0, active);
104
+ const [picks, setPicks] = useState(() => Object.fromEntries(categories.map((c) => [c.id, c.options[0].id])));
105
+ const [found, setFound] = useState(/* @__PURE__ */ new Set());
106
+ const hints = useHints(hintList);
107
+ const combos = useMemo(() => enumerate(cats), [cats]);
108
+ const sizes = cats.map((c) => c.options.length);
109
+ const total = ruleOfProduct(...sizes);
110
+ const tooMany = total > maxWall;
111
+ const currentPicks = cats.map((c) => c.options.find((o) => o.id === picks[c.id]) ?? c.options[0]);
112
+ const currentKey = currentPicks.map((o) => o.id).join("|");
113
+ const madeCurrent = found.has(currentKey);
114
+ const choices = [total, ...[
115
+ total + sizes[active - 1],
116
+ sizes.reduce((a, b) => a + b, 0),
117
+ Math.max(1, total - 2)
118
+ ].filter((d) => d !== total).slice(0, 2)].sort((a, b) => a - b).map((n) => ({
119
+ value: String(n),
120
+ label: String(n)
121
+ }));
122
+ const questions = useMemo(() => [{
123
+ id: `q-${active}-${total}`,
124
+ prompt: `With ${cats.map((c, i) => `${sizes[i]} ${c.label.toLowerCase()}${sizes[i] > 1 ? "s" : ""}`).join(" and ")}, how many different ${scenario}s?`,
125
+ choices,
126
+ answer: String(total),
127
+ explain: `Yes: ${sizes.join(" × ")} = ${total}. Each independent choice multiplies.`
128
+ }], [active, total]);
129
+ const challenge = useChallenge(questions);
130
+ const allFound = found.size >= total && total > 0;
131
+ useCheckpoint({
132
+ solved: allFound,
133
+ activity: `combination-studio:${scenario}`,
134
+ hintsUsed: hints.count
135
+ });
136
+ const make = () => setFound((f) => new Set(f).add(currentKey));
137
+ const pickOpt = (catId, optId) => setPicks((p) => ({
138
+ ...p,
139
+ [catId]: optId
140
+ }));
141
+ const addVar = () => {
142
+ setActive((a) => Math.min(categories.length, a + 1));
143
+ setFound(/* @__PURE__ */ new Set());
144
+ };
145
+ const dropVar = () => {
146
+ setActive((a) => Math.max(1, a - 1));
147
+ setFound(/* @__PURE__ */ new Set());
148
+ };
149
+ const reset = () => setFound(/* @__PURE__ */ new Set());
150
+ const FoundFig = ({ combo, size }) => figure === "character" ? /* @__PURE__ */ jsx(CharacterFigure, {
151
+ parts: partsOf(cats, combo.picks),
152
+ size,
153
+ dim: !found.has(combo.key)
154
+ }) : /* @__PURE__ */ jsx(ComboCard, {
155
+ cells: cats.map((c, i) => ({
156
+ emoji: combo.picks[i].emoji,
157
+ color: combo.picks[i].color
158
+ })),
159
+ size,
160
+ dim: !found.has(combo.key)
161
+ });
162
+ const grid2d = active === 2 && !tooMany;
163
+ const rows = grid2d ? cats[0].options : [];
164
+ const cols = grid2d ? cats[1].options : [];
165
+ const figureEl = /* @__PURE__ */ jsxs("div", {
166
+ style: {
167
+ display: "grid",
168
+ gap: 16
169
+ },
170
+ children: [
171
+ /* @__PURE__ */ jsxs("div", {
172
+ style: {
173
+ display: "flex",
174
+ alignItems: "center",
175
+ justifyContent: "center",
176
+ gap: 8,
177
+ flexWrap: "wrap",
178
+ fontSize: 20,
179
+ fontWeight: 800
180
+ },
181
+ children: [
182
+ cats.map((c, i) => /* @__PURE__ */ jsxs("span", {
183
+ style: {
184
+ display: "inline-flex",
185
+ alignItems: "baseline",
186
+ gap: 5
187
+ },
188
+ children: [
189
+ i > 0 && /* @__PURE__ */ jsx("span", {
190
+ style: { color: "var(--stage-muted)" },
191
+ children: "×"
192
+ }),
193
+ /* @__PURE__ */ jsx("span", {
194
+ style: { color: "var(--stage-accent)" },
195
+ children: sizes[i]
196
+ }),
197
+ /* @__PURE__ */ jsxs("span", {
198
+ style: {
199
+ fontSize: 12,
200
+ color: "var(--stage-muted)",
201
+ fontWeight: 600
202
+ },
203
+ children: [c.label.toLowerCase(), sizes[i] > 1 ? "s" : ""]
204
+ })
205
+ ]
206
+ }, c.id)),
207
+ /* @__PURE__ */ jsx("span", {
208
+ style: { color: "var(--stage-muted)" },
209
+ children: "="
210
+ }),
211
+ /* @__PURE__ */ jsx("span", {
212
+ style: { color: "var(--stage-good)" },
213
+ children: total
214
+ }),
215
+ /* @__PURE__ */ jsxs("span", {
216
+ style: {
217
+ fontSize: 13,
218
+ color: "var(--stage-muted)",
219
+ fontWeight: 600
220
+ },
221
+ children: [
222
+ found.size,
223
+ "/",
224
+ total,
225
+ " found"
226
+ ]
227
+ })
228
+ ]
229
+ }),
230
+ /* @__PURE__ */ jsxs("div", {
231
+ style: {
232
+ display: "flex",
233
+ gap: 18,
234
+ alignItems: "center",
235
+ justifyContent: "center",
236
+ flexWrap: "wrap",
237
+ padding: "10px 6px",
238
+ borderRadius: 14,
239
+ background: "var(--stage-bg)",
240
+ border: "1px solid var(--stage-grid)"
241
+ },
242
+ children: [/* @__PURE__ */ jsx("div", {
243
+ style: {
244
+ display: "grid",
245
+ gap: 8
246
+ },
247
+ children: cats.map((c) => /* @__PURE__ */ jsxs("div", {
248
+ style: {
249
+ display: "flex",
250
+ alignItems: "center",
251
+ gap: 8,
252
+ flexWrap: "wrap"
253
+ },
254
+ children: [/* @__PURE__ */ jsx("span", {
255
+ style: {
256
+ width: 64,
257
+ fontSize: 12,
258
+ fontWeight: 700,
259
+ color: "var(--stage-muted)",
260
+ textAlign: "right"
261
+ },
262
+ children: c.label
263
+ }), c.options.map((o) => /* @__PURE__ */ jsx(OptionSwatch, {
264
+ emoji: o.emoji,
265
+ color: o.color,
266
+ label: o.label,
267
+ selected: picks[c.id] === o.id,
268
+ onClick: () => pickOpt(c.id, o.id)
269
+ }, o.id))]
270
+ }, c.id))
271
+ }), /* @__PURE__ */ jsxs("div", {
272
+ style: {
273
+ display: "grid",
274
+ justifyItems: "center",
275
+ gap: 6
276
+ },
277
+ children: [figure === "character" ? /* @__PURE__ */ jsx(CharacterFigure, {
278
+ parts: partsOf(cats, currentPicks),
279
+ size: 96
280
+ }) : /* @__PURE__ */ jsx(ComboCard, {
281
+ cells: cats.map((c, i) => ({
282
+ emoji: currentPicks[i].emoji,
283
+ color: currentPicks[i].color
284
+ })),
285
+ size: 84
286
+ }), /* @__PURE__ */ jsx("button", {
287
+ type: "button",
288
+ onClick: make,
289
+ disabled: madeCurrent,
290
+ className: "lab-btn",
291
+ style: { opacity: madeCurrent ? .5 : 1 },
292
+ children: madeCurrent ? "✓ already made" : "+ make this one"
293
+ })]
294
+ })]
295
+ }),
296
+ tooMany ? /* @__PURE__ */ jsxs("p", {
297
+ style: {
298
+ margin: 0,
299
+ padding: 12,
300
+ borderRadius: 10,
301
+ border: "1px dashed var(--stage-grid)",
302
+ color: "var(--stage-muted)"
303
+ },
304
+ children: [
305
+ "That is ",
306
+ /* @__PURE__ */ jsx("b", { children: total }),
307
+ " combinations, too many to draw, but the rule of product still gives the count without listing them. Drop a variable to see them all."
308
+ ]
309
+ }) : grid2d ? /* @__PURE__ */ jsxs("div", {
310
+ style: {
311
+ display: "grid",
312
+ gridTemplateColumns: `auto repeat(${cols.length}, 1fr)`,
313
+ gap: 6,
314
+ alignItems: "center",
315
+ justifyItems: "center"
316
+ },
317
+ children: [
318
+ /* @__PURE__ */ jsx("span", {}),
319
+ cols.map((o) => /* @__PURE__ */ jsx("span", {
320
+ style: {
321
+ fontSize: 11,
322
+ fontWeight: 700,
323
+ color: "var(--stage-muted)"
324
+ },
325
+ children: o.label
326
+ }, o.id)),
327
+ rows.map((r, ri) => /* @__PURE__ */ jsx(FragmentRow, {
328
+ label: r.label,
329
+ children: cols.map((cOpt, ci) => {
330
+ const combo = combos[ri * cols.length + ci];
331
+ const isFound = found.has(combo.key);
332
+ return /* @__PURE__ */ jsx("div", {
333
+ style: {
334
+ padding: 4,
335
+ borderRadius: 10,
336
+ border: `1.5px solid ${isFound ? "var(--stage-good)" : "var(--stage-grid)"}`,
337
+ background: isFound ? "color-mix(in oklab, var(--stage-good) 12%, transparent)" : "transparent"
338
+ },
339
+ children: /* @__PURE__ */ jsx(FoundFig, {
340
+ combo,
341
+ size: 48
342
+ })
343
+ }, cOpt.id);
344
+ })
345
+ }, r.id))
346
+ ]
347
+ }) : /* @__PURE__ */ jsx("div", {
348
+ style: {
349
+ display: "flex",
350
+ flexWrap: "wrap",
351
+ gap: 6,
352
+ justifyContent: "center"
353
+ },
354
+ children: combos.map((combo) => {
355
+ const isFound = found.has(combo.key);
356
+ return /* @__PURE__ */ jsx("div", {
357
+ style: {
358
+ padding: 4,
359
+ borderRadius: 10,
360
+ border: `1.5px solid ${isFound ? "var(--stage-good)" : "var(--stage-grid)"}`,
361
+ background: isFound ? "color-mix(in oklab, var(--stage-good) 12%, transparent)" : "transparent"
362
+ },
363
+ children: /* @__PURE__ */ jsx(FoundFig, {
364
+ combo,
365
+ size: 46
366
+ })
367
+ }, combo.key);
368
+ })
369
+ })
370
+ ]
371
+ });
372
+ return /* @__PURE__ */ jsx(LabFrame, {
373
+ title,
374
+ prompt,
375
+ objectives,
376
+ aside: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(ChallengeCard, {
377
+ questions,
378
+ state: challenge,
379
+ title: "Predict first"
380
+ }), /* @__PURE__ */ jsx(Callout, {
381
+ tone: allFound ? "result" : "info",
382
+ children: allFound ? /* @__PURE__ */ jsxs("span", {
383
+ style: {
384
+ color: "var(--stage-good)",
385
+ fontWeight: 700
386
+ },
387
+ children: [
388
+ "You made all ",
389
+ total,
390
+ ". That is exactly ",
391
+ sizes.join(" × "),
392
+ " = ",
393
+ total,
394
+ ": every choice multiplied."
395
+ ]
396
+ }) : /* @__PURE__ */ jsxs("span", {
397
+ style: { color: "var(--stage-muted)" },
398
+ children: [
399
+ "Make every ",
400
+ scenario,
401
+ " to fill the wall. Then add a variable and watch the total multiply."
402
+ ]
403
+ })
404
+ })] }),
405
+ controls: /* @__PURE__ */ jsxs(ControlBar, { children: [
406
+ /* @__PURE__ */ jsx(Chip, {
407
+ selected: false,
408
+ onClick: addVar,
409
+ children: "+ add a variable"
410
+ }),
411
+ /* @__PURE__ */ jsx(Chip, {
412
+ selected: false,
413
+ onClick: dropVar,
414
+ children: "− drop a variable"
415
+ }),
416
+ /* @__PURE__ */ jsx(Chip, {
417
+ selected: false,
418
+ onClick: reset,
419
+ children: "clear wall"
420
+ })
421
+ ] }),
422
+ footer: /* @__PURE__ */ jsx(HintLadder, { hints }),
423
+ children: figureEl
424
+ });
425
+ }
426
+ /** A grid row: the row label cell + its children cells (keeps JSX flat above). */
427
+ function FragmentRow({ label, children }) {
428
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
429
+ style: {
430
+ fontSize: 11,
431
+ fontWeight: 700,
432
+ color: "var(--stage-muted)",
433
+ justifySelf: "end"
434
+ },
435
+ children: label
436
+ }), children] });
437
+ }
438
+
439
+ //#endregion
440
+ export { CombinationStudioLab };
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/combinatorics.d.ts
2
2
  /**
3
- * Combinatorics kernel — the counting source-of-truth every discrete-math lab
3
+ * Combinatorics kernel, the counting source-of-truth every discrete-math lab
4
4
  * trusts (so an agent narrates these, never computes its own). Pure, integer,
5
5
  * dependency-free. The headline identity the Counting lab is built on:
6
6
  * nCr(n,k) = nPr(n,k) / k! ("overcount by order, then divide it out").
@@ -10,14 +10,34 @@ declare function factorial(n: number): number;
10
10
  declare function nPr(n: number, r: number): number;
11
11
  /** Unordered selections: nPr/k!, via the exact step-wise multiplicative form. */
12
12
  declare function nCr(n: number, r: number): number;
13
- /** Binomial coefficient — alias of nCr (the "n choose k"). */
13
+ /** Binomial coefficient, alias of nCr (the "n choose k"). */
14
14
  declare const binomial: typeof nCr;
15
15
  /** Arrangements of a multiset: n! / (k1! k2! …), where Σki = n. */
16
16
  declare function multinomial(...counts: number[]): number;
17
17
  /** Stars and bars: ways to place n identical items into k distinct bins =
18
18
  * C(n+k−1, k−1). */
19
19
  declare function starsAndBars(n: number, k: number): number;
20
+ /** Rule of PRODUCT (multiplication principle): a task done as a SEQUENCE of
21
+ * independent stages — do stage 1 AND stage 2 AND … — multiplies the choice
22
+ * counts. ruleOfProduct(4, 3, 2) = 24. The spine under nPr / nʳ / factorial. */
23
+ declare function ruleOfProduct(...stages: number[]): number;
24
+ /** Rule of SUM (addition principle): MUTUALLY EXCLUSIVE cases — do this OR that,
25
+ * with no overlap — add their counts. ruleOfSum(3, 5) = 8. If the cases can
26
+ * overlap, use {@link inclusionExclusion} (sum, then subtract the double-count). */
27
+ declare function ruleOfSum(...cases: number[]): number;
28
+ /** Permutations WITH repetition: r positions, each independently filled from n
29
+ * options = nʳ. PIN codes, license plates, binary strings, functions A→B. */
30
+ declare function permutationsWithRepetition(n: number, r: number): number;
31
+ /** Circular permutations: distinct arrangements of n around a round table where
32
+ * only RELATIVE order matters = (n−1)!. (1 for n ≤ 1.) */
33
+ declare function circularPermutations(n: number): number;
34
+ /** Combinations WITH repetition ("n multichoose k"): choose k from n types,
35
+ * repetition allowed, order irrelevant = C(n+k−1, k). Same stars-and-bars
36
+ * family as {@link starsAndBars}, re-parameterized for selection (e.g. k scoops
37
+ * from n ice-cream flavours). */
38
+ declare function multichoose(n: number, k: number): number;
39
+ declare const combinationsWithRepetition: typeof multichoose;
20
40
  declare function gcd(a: number, b: number): number;
21
41
  declare function lcm(a: number, b: number): number;
22
42
  //#endregion
23
- export { binomial, factorial, gcd, lcm, multinomial, nCr, nPr, starsAndBars };
43
+ export { binomial, circularPermutations, combinationsWithRepetition, factorial, gcd, lcm, multichoose, multinomial, nCr, nPr, permutationsWithRepetition, ruleOfProduct, ruleOfSum, starsAndBars };
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/combinatorics.ts
2
2
  /**
3
- * Combinatorics kernel — the counting source-of-truth every discrete-math lab
3
+ * Combinatorics kernel, the counting source-of-truth every discrete-math lab
4
4
  * trusts (so an agent narrates these, never computes its own). Pure, integer,
5
5
  * dependency-free. The headline identity the Counting lab is built on:
6
6
  * nCr(n,k) = nPr(n,k) / k! ("overcount by order, then divide it out").
@@ -28,7 +28,7 @@ function nCr(n, r) {
28
28
  for (let i = 1; i <= k; i++) res = res * (n - k + i) / i;
29
29
  return Math.round(res);
30
30
  }
31
- /** Binomial coefficient — alias of nCr (the "n choose k"). */
31
+ /** Binomial coefficient, alias of nCr (the "n choose k"). */
32
32
  const binomial = nCr;
33
33
  /** Arrangements of a multiset: n! / (k1! k2! …), where Σki = n. */
34
34
  function multinomial(...counts) {
@@ -42,6 +42,41 @@ function starsAndBars(n, k) {
42
42
  if (!isCount(n) || !isCount(k) || k < 1) return NaN;
43
43
  return nCr(n + k - 1, k - 1);
44
44
  }
45
+ /** Rule of PRODUCT (multiplication principle): a task done as a SEQUENCE of
46
+ * independent stages — do stage 1 AND stage 2 AND … — multiplies the choice
47
+ * counts. ruleOfProduct(4, 3, 2) = 24. The spine under nPr / nʳ / factorial. */
48
+ function ruleOfProduct(...stages) {
49
+ if (!stages.length || stages.some((c) => !Number.isFinite(c))) return NaN;
50
+ return stages.reduce((p, c) => p * c, 1);
51
+ }
52
+ /** Rule of SUM (addition principle): MUTUALLY EXCLUSIVE cases — do this OR that,
53
+ * with no overlap — add their counts. ruleOfSum(3, 5) = 8. If the cases can
54
+ * overlap, use {@link inclusionExclusion} (sum, then subtract the double-count). */
55
+ function ruleOfSum(...cases) {
56
+ if (!cases.length || cases.some((c) => !Number.isFinite(c))) return NaN;
57
+ return cases.reduce((s, c) => s + c, 0);
58
+ }
59
+ /** Permutations WITH repetition: r positions, each independently filled from n
60
+ * options = nʳ. PIN codes, license plates, binary strings, functions A→B. */
61
+ function permutationsWithRepetition(n, r) {
62
+ if (!isCount(n) || !isCount(r)) return NaN;
63
+ return n ** r;
64
+ }
65
+ /** Circular permutations: distinct arrangements of n around a round table where
66
+ * only RELATIVE order matters = (n−1)!. (1 for n ≤ 1.) */
67
+ function circularPermutations(n) {
68
+ if (!isCount(n)) return NaN;
69
+ return n <= 1 ? 1 : factorial(n - 1);
70
+ }
71
+ /** Combinations WITH repetition ("n multichoose k"): choose k from n types,
72
+ * repetition allowed, order irrelevant = C(n+k−1, k). Same stars-and-bars
73
+ * family as {@link starsAndBars}, re-parameterized for selection (e.g. k scoops
74
+ * from n ice-cream flavours). */
75
+ function multichoose(n, k) {
76
+ if (!isCount(n) || !isCount(k)) return NaN;
77
+ return nCr(n + k - 1, k);
78
+ }
79
+ const combinationsWithRepetition = multichoose;
45
80
  function gcd(a, b) {
46
81
  a = Math.abs(a);
47
82
  b = Math.abs(b);
@@ -54,4 +89,4 @@ function lcm(a, b) {
54
89
  }
55
90
 
56
91
  //#endregion
57
- export { binomial, factorial, gcd, lcm, multinomial, nCr, nPr, starsAndBars };
92
+ export { binomial, circularPermutations, combinationsWithRepetition, factorial, gcd, lcm, multichoose, multinomial, nCr, nPr, permutationsWithRepetition, ruleOfProduct, ruleOfSum, starsAndBars };
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/pigeonhole.d.ts
2
2
  /**
3
- * Pigeonhole kernel — the certainty math behind "guarantee ≠ likely". With more
3
+ * Pigeonhole kernel, the certainty math behind "guarantee ≠ likely". With more
4
4
  * pigeons than holes some hole holds ≥ ⌈n/k⌉. The lab's adversary deals the
5
5
  * worst case; these functions say exactly when a collision is FORCED.
6
6
  */
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/pigeonhole.ts
2
2
  /**
3
- * Pigeonhole kernel — the certainty math behind "guarantee ≠ likely". With more
3
+ * Pigeonhole kernel, the certainty math behind "guarantee ≠ likely". With more
4
4
  * pigeons than holes some hole holds ≥ ⌈n/k⌉. The lab's adversary deals the
5
5
  * worst case; these functions say exactly when a collision is FORCED.
6
6
  */
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/probability.d.ts
2
2
  /**
3
- * Probability kernel — equally-likely sample spaces, conditioning, Bayes,
3
+ * Probability kernel, equally-likely sample spaces, conditioning, Bayes,
4
4
  * independence, expectation. This is the "truth" the base-rate / Monty labs read
5
5
  * (the agent narrates these numbers; it never invents them). Conditioning =
6
6
  * shrink the sample space: P(A|B) = |A∩B| / |B|.
@@ -8,7 +8,7 @@
8
8
  /** Favourable / total over an equally-likely space. */
9
9
  declare function probability(favorable: number, total: number): number;
10
10
  declare function complement(p: number): number;
11
- /** P(A|B) = P(A∩B) / P(B) — restrict the world to B, then re-count. */
11
+ /** P(A|B) = P(A∩B) / P(B), restrict the world to B, then re-count. */
12
12
  declare function conditional(pAandB: number, pB: number): number;
13
13
  /**
14
14
  * P(A|B) from the natural inputs: the true-positive rate P(B|A), the prior P(A),
@@ -16,7 +16,7 @@ declare function conditional(pAandB: number, pB: number): number;
16
16
  */
17
17
  declare function bayes(pBgivenA: number, pA: number, pBgivenNotA: number): number;
18
18
  /** A and B are independent iff P(A∩B) = P(A)·P(B) (within eps). NOT the same as
19
- * disjoint — disjoint events are maximally DEPENDENT. */
19
+ * disjoint, disjoint events are maximally DEPENDENT. */
20
20
  declare function independent(pA: number, pB: number, pAandB: number, eps?: number): boolean;
21
21
  /** Expected value Σ p·value (probabilities should sum to 1). */
22
22
  declare function expectedValue(outcomes: ReadonlyArray<{
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/probability.ts
2
2
  /**
3
- * Probability kernel — equally-likely sample spaces, conditioning, Bayes,
3
+ * Probability kernel, equally-likely sample spaces, conditioning, Bayes,
4
4
  * independence, expectation. This is the "truth" the base-rate / Monty labs read
5
5
  * (the agent narrates these numbers; it never invents them). Conditioning =
6
6
  * shrink the sample space: P(A|B) = |A∩B| / |B|.
@@ -12,7 +12,7 @@ function probability(favorable, total) {
12
12
  function complement(p) {
13
13
  return 1 - p;
14
14
  }
15
- /** P(A|B) = P(A∩B) / P(B) — restrict the world to B, then re-count. */
15
+ /** P(A|B) = P(A∩B) / P(B), restrict the world to B, then re-count. */
16
16
  function conditional(pAandB, pB) {
17
17
  return pB > 0 ? pAandB / pB : NaN;
18
18
  }
@@ -26,7 +26,7 @@ function bayes(pBgivenA, pA, pBgivenNotA) {
26
26
  return den > 0 ? num / den : NaN;
27
27
  }
28
28
  /** A and B are independent iff P(A∩B) = P(A)·P(B) (within eps). NOT the same as
29
- * disjoint — disjoint events are maximally DEPENDENT. */
29
+ * disjoint, disjoint events are maximally DEPENDENT. */
30
30
  function independent(pA, pB, pAandB, eps = 1e-9) {
31
31
  return Math.abs(pAandB - pA * pB) <= eps;
32
32
  }
@@ -1,6 +1,6 @@
1
1
  //#region src/discrete/core/sets.d.ts
2
2
  /**
3
- * Finite-set kernel — set algebra over arrays of primitives (the Venn /
3
+ * Finite-set kernel, set algebra over arrays of primitives (the Venn /
4
4
  * inclusion–exclusion labs run on these). De Morgan here mirrors the logic
5
5
  * kernel's De Morgan: ∩↔∧, ∪↔∨, complement↔¬ (the "trinity" spine). Order is
6
6
  * first-seen (insertion) and duplicates are collapsed, so results are clean sets.