@doenet/doenetml 0.6.0-alpha1

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 (549) hide show
  1. package/.prettierrc +3 -0
  2. package/LICENSE +661 -0
  3. package/README.md +146 -0
  4. package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
  5. package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
  6. package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
  7. package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
  8. package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
  9. package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
  10. package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
  11. package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
  12. package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
  13. package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
  14. package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
  15. package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
  16. package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
  17. package/cypress/e2e/assignNames/collections.cy.js +9247 -0
  18. package/cypress/e2e/assignNames/selects.cy.js +105 -0
  19. package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
  20. package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
  21. package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
  22. package/cypress/e2e/chemistry/atom.cy.js +201 -0
  23. package/cypress/e2e/chemistry/ion.cy.js +608 -0
  24. package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
  25. package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
  26. package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
  27. package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
  28. package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
  29. package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
  30. package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
  31. package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
  32. package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
  33. package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
  34. package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
  35. package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
  36. package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
  37. package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
  38. package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
  39. package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
  40. package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
  41. package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
  42. package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
  43. package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
  44. package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
  45. package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
  46. package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
  47. package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
  48. package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
  49. package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
  50. package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
  51. package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
  52. package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
  53. package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
  54. package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
  55. package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
  56. package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
  57. package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
  58. package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
  59. package/cypress/e2e/tagSpecific/document.cy.js +234 -0
  60. package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
  61. package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
  62. package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
  63. package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
  64. package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
  65. package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
  66. package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
  67. package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
  68. package/cypress/e2e/tagSpecific/group.cy.js +683 -0
  69. package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
  70. package/cypress/e2e/tagSpecific/image.cy.js +770 -0
  71. package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
  72. package/cypress/e2e/tagSpecific/label.cy.js +800 -0
  73. package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
  74. package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
  75. package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
  76. package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
  77. package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
  78. package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
  79. package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
  80. package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
  81. package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
  82. package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
  83. package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
  84. package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
  85. package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
  86. package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
  87. package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
  88. package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
  89. package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
  90. package/cypress/e2e/tagSpecific/p.cy.js +72 -0
  91. package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
  92. package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
  93. package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
  94. package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
  95. package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
  96. package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
  97. package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
  98. package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
  99. package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
  100. package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
  101. package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
  102. package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
  103. package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
  104. package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
  105. package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
  106. package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
  107. package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
  108. package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
  109. package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
  110. package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
  111. package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
  112. package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
  113. package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
  114. package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
  115. package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
  116. package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
  117. package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
  118. package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
  119. package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
  120. package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
  121. package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
  122. package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
  123. package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
  124. package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
  125. package/cypress/e2e/tagSpecific/text.cy.js +975 -0
  126. package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
  127. package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
  128. package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
  129. package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
  130. package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
  131. package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
  132. package/cypress/e2e/tagSpecific/video.cy.js +612 -0
  133. package/cypress/e2e/tagSpecific/when.cy.js +202 -0
  134. package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
  135. package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
  136. package/cypress/fixtures/example.json +5 -0
  137. package/cypress/support/commands.js +32 -0
  138. package/cypress/support/e2e.js +31 -0
  139. package/cypress.config.js +18 -0
  140. package/docs/codeSnippet.jsx +11 -0
  141. package/docs/index.html +133 -0
  142. package/docs/index.jsx +138 -0
  143. package/docs/prism.css +3 -0
  144. package/index.html +14 -0
  145. package/index.js +21 -0
  146. package/media/answer_example.png +0 -0
  147. package/media/graph_example.png +0 -0
  148. package/media/graph_markup_example.png +0 -0
  149. package/package.json +83 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
  152. package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  153. package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  154. package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  155. package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  156. package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  157. package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  158. package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  159. package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
  160. package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  161. package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  162. package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  163. package/src/Core/ComponentTypes.js +426 -0
  164. package/src/Core/Core.js +11852 -0
  165. package/src/Core/CoreWorker.js +127 -0
  166. package/src/Core/Dependencies.js +8226 -0
  167. package/src/Core/Numerics.js +473 -0
  168. package/src/Core/ParameterStack.js +36 -0
  169. package/src/Core/ReadOnlyProxyHandler.js +41 -0
  170. package/src/Core/StateProxyHandler.js +88 -0
  171. package/src/Core/components/Aliases.js +67 -0
  172. package/src/Core/components/Angle.js +758 -0
  173. package/src/Core/components/AnimateFromSequence.js +922 -0
  174. package/src/Core/components/Answer.js +2087 -0
  175. package/src/Core/components/AsList.js +83 -0
  176. package/src/Core/components/AttractTo.js +245 -0
  177. package/src/Core/components/AttractToAngles.js +262 -0
  178. package/src/Core/components/AttractToConstraint.js +104 -0
  179. package/src/Core/components/AttractToGrid.js +315 -0
  180. package/src/Core/components/Award.js +906 -0
  181. package/src/Core/components/BestFitLine.js +318 -0
  182. package/src/Core/components/BezierControls.js +719 -0
  183. package/src/Core/components/BlockQuote.js +35 -0
  184. package/src/Core/components/Boolean.js +500 -0
  185. package/src/Core/components/BooleanInput.js +330 -0
  186. package/src/Core/components/BooleanList.js +396 -0
  187. package/src/Core/components/BooleanOperators.js +35 -0
  188. package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
  189. package/src/Core/components/CallAction.js +261 -0
  190. package/src/Core/components/Caption.js +73 -0
  191. package/src/Core/components/Case.js +56 -0
  192. package/src/Core/components/Cell.js +439 -0
  193. package/src/Core/components/CellBlock.js +64 -0
  194. package/src/Core/components/Chart.js +795 -0
  195. package/src/Core/components/Choice.js +266 -0
  196. package/src/Core/components/ChoiceInput.js +1407 -0
  197. package/src/Core/components/Circle.js +2884 -0
  198. package/src/Core/components/CodeEditor.js +647 -0
  199. package/src/Core/components/CodeViewer.js +294 -0
  200. package/src/Core/components/CollaborateGroupSetup.js +46 -0
  201. package/src/Core/components/CollaborateGroups.js +119 -0
  202. package/src/Core/components/Collect.js +850 -0
  203. package/src/Core/components/Column.js +608 -0
  204. package/src/Core/components/ConditionalContent.js +468 -0
  205. package/src/Core/components/ConsiderAsResponses.js +49 -0
  206. package/src/Core/components/ConstrainTo.js +161 -0
  207. package/src/Core/components/ConstrainToAngles.js +244 -0
  208. package/src/Core/components/ConstrainToGraph.js +142 -0
  209. package/src/Core/components/ConstrainToGrid.js +175 -0
  210. package/src/Core/components/ConstraintUnion.js +119 -0
  211. package/src/Core/components/Constraints.js +497 -0
  212. package/src/Core/components/ContentBrowser.js +441 -0
  213. package/src/Core/components/ContentPicker.js +263 -0
  214. package/src/Core/components/ControlVectors.js +25 -0
  215. package/src/Core/components/Coords.js +63 -0
  216. package/src/Core/components/Copy.js +3412 -0
  217. package/src/Core/components/Curve.js +4130 -0
  218. package/src/Core/components/CustomAttribute.js +175 -0
  219. package/src/Core/components/DataFrame.js +357 -0
  220. package/src/Core/components/DiscreteSimulationResultList.js +342 -0
  221. package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
  222. package/src/Core/components/Divisions.js +55 -0
  223. package/src/Core/components/Document.js +888 -0
  224. package/src/Core/components/Embed.js +65 -0
  225. package/src/Core/components/Endpoint.js +62 -0
  226. package/src/Core/components/Evaluate.js +321 -0
  227. package/src/Core/components/Extract.js +656 -0
  228. package/src/Core/components/Extrema.js +556 -0
  229. package/src/Core/components/Feedback.js +200 -0
  230. package/src/Core/components/FeedbackDefinitions.js +97 -0
  231. package/src/Core/components/Figure.js +148 -0
  232. package/src/Core/components/Footnote.js +73 -0
  233. package/src/Core/components/Function.js +5344 -0
  234. package/src/Core/components/FunctionIterates.js +306 -0
  235. package/src/Core/components/FunctionOperators.js +702 -0
  236. package/src/Core/components/Graph.js +1679 -0
  237. package/src/Core/components/Group.js +7 -0
  238. package/src/Core/components/HasSameFactoring.js +407 -0
  239. package/src/Core/components/Hint.js +241 -0
  240. package/src/Core/components/Image.js +524 -0
  241. package/src/Core/components/Indexing.js +79 -0
  242. package/src/Core/components/IntComma.js +64 -0
  243. package/src/Core/components/Integer.js +81 -0
  244. package/src/Core/components/Intersection.js +328 -0
  245. package/src/Core/components/Interval.js +29 -0
  246. package/src/Core/components/Label.js +492 -0
  247. package/src/Core/components/Latex.js +104 -0
  248. package/src/Core/components/Legend.js +329 -0
  249. package/src/Core/components/Line.js +2040 -0
  250. package/src/Core/components/LineSegment.js +882 -0
  251. package/src/Core/components/Lists.js +180 -0
  252. package/src/Core/components/Lorem.js +249 -0
  253. package/src/Core/components/MMeMen.js +377 -0
  254. package/src/Core/components/Map.js +873 -0
  255. package/src/Core/components/Markers.js +101 -0
  256. package/src/Core/components/MatchesPattern.js +339 -0
  257. package/src/Core/components/Math.js +2552 -0
  258. package/src/Core/components/MathInput.js +948 -0
  259. package/src/Core/components/MathList.js +828 -0
  260. package/src/Core/components/MathOperators.js +1286 -0
  261. package/src/Core/components/Matrix.js +497 -0
  262. package/src/Core/components/MatrixInput.js +3157 -0
  263. package/src/Core/components/MdMdnMrow.js +394 -0
  264. package/src/Core/components/Module.js +16 -0
  265. package/src/Core/components/Number.js +1031 -0
  266. package/src/Core/components/NumberList.js +550 -0
  267. package/src/Core/components/Option.js +24 -0
  268. package/src/Core/components/P.js +71 -0
  269. package/src/Core/components/Paginator.js +338 -0
  270. package/src/Core/components/Panel.js +126 -0
  271. package/src/Core/components/Parabola.js +1561 -0
  272. package/src/Core/components/ParagraphMarkup.js +59 -0
  273. package/src/Core/components/Pegboard.js +43 -0
  274. package/src/Core/components/PeriodicSet.js +291 -0
  275. package/src/Core/components/PiecewiseFunction.js +832 -0
  276. package/src/Core/components/Pluralize.js +198 -0
  277. package/src/Core/components/Point.js +1295 -0
  278. package/src/Core/components/Polygon.js +408 -0
  279. package/src/Core/components/Polyline.js +841 -0
  280. package/src/Core/components/RandomizedTextList.js +225 -0
  281. package/src/Core/components/Ray.js +1737 -0
  282. package/src/Core/components/Rectangle.js +1535 -0
  283. package/src/Core/components/Ref.js +350 -0
  284. package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
  285. package/src/Core/components/RegionHalfPlane.js +107 -0
  286. package/src/Core/components/RegularPolygon.js +2118 -0
  287. package/src/Core/components/RenderDoenetML.js +181 -0
  288. package/src/Core/components/Row.js +780 -0
  289. package/src/Core/components/SampleRandomNumbers.js +653 -0
  290. package/src/Core/components/Sectioning.js +303 -0
  291. package/src/Core/components/Select.js +947 -0
  292. package/src/Core/components/SelectFromSequence.js +1242 -0
  293. package/src/Core/components/SelectRandomNumbers.js +225 -0
  294. package/src/Core/components/Sequence.js +444 -0
  295. package/src/Core/components/Setup.js +53 -0
  296. package/src/Core/components/Shuffle.js +470 -0
  297. package/src/Core/components/SideBySide.js +2130 -0
  298. package/src/Core/components/SingleCharacterComponents.js +41 -0
  299. package/src/Core/components/Slider.js +819 -0
  300. package/src/Core/components/SolutionContainer.js +67 -0
  301. package/src/Core/components/Solutions.js +334 -0
  302. package/src/Core/components/SolveEquations.js +568 -0
  303. package/src/Core/components/Sort.js +398 -0
  304. package/src/Core/components/Sources.js +108 -0
  305. package/src/Core/components/Split.js +205 -0
  306. package/src/Core/components/Spreadsheet.js +1507 -0
  307. package/src/Core/components/StyleDefinitions.js +111 -0
  308. package/src/Core/components/SubsetOfReals.js +348 -0
  309. package/src/Core/components/SubsetOfRealsInput.js +1474 -0
  310. package/src/Core/components/Substitute.js +496 -0
  311. package/src/Core/components/SummaryStatistics.js +652 -0
  312. package/src/Core/components/Table.js +145 -0
  313. package/src/Core/components/Tabular.js +384 -0
  314. package/src/Core/components/Template.js +360 -0
  315. package/src/Core/components/Text.js +341 -0
  316. package/src/Core/components/TextInput.js +566 -0
  317. package/src/Core/components/TextList.js +442 -0
  318. package/src/Core/components/TextListFromString.js +137 -0
  319. package/src/Core/components/TextOperatorsOfMath.js +21 -0
  320. package/src/Core/components/Triangle.js +280 -0
  321. package/src/Core/components/TriggerSet.js +189 -0
  322. package/src/Core/components/TupleList.js +43 -0
  323. package/src/Core/components/UpdateValue.js +435 -0
  324. package/src/Core/components/VariantControl.js +36 -0
  325. package/src/Core/components/Vector.js +2478 -0
  326. package/src/Core/components/Verbatim.js +125 -0
  327. package/src/Core/components/Video.js +673 -0
  328. package/src/Core/components/When.js +198 -0
  329. package/src/Core/components/abstract/AngleListComponent.js +140 -0
  330. package/src/Core/components/abstract/BaseComponent.js +1496 -0
  331. package/src/Core/components/abstract/BlockComponent.js +5 -0
  332. package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
  333. package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
  334. package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
  335. package/src/Core/components/abstract/ComponentSize.js +789 -0
  336. package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
  337. package/src/Core/components/abstract/CompositeComponent.js +142 -0
  338. package/src/Core/components/abstract/ConstraintComponent.js +19 -0
  339. package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
  340. package/src/Core/components/abstract/GraphicalComponent.js +56 -0
  341. package/src/Core/components/abstract/InlineComponent.js +5 -0
  342. package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
  343. package/src/Core/components/abstract/Input.js +192 -0
  344. package/src/Core/components/abstract/IntervalListComponent.js +218 -0
  345. package/src/Core/components/abstract/LineListComponent.js +114 -0
  346. package/src/Core/components/abstract/MathBaseOperator.js +631 -0
  347. package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
  348. package/src/Core/components/abstract/PointListComponent.js +238 -0
  349. package/src/Core/components/abstract/SectioningComponent.js +1262 -0
  350. package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
  351. package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
  352. package/src/Core/components/abstract/TextOrInline.js +66 -0
  353. package/src/Core/components/abstract/VariableName.js +31 -0
  354. package/src/Core/components/abstract/VariableNameList.js +83 -0
  355. package/src/Core/components/abstract/VectorListComponent.js +235 -0
  356. package/src/Core/components/chemistry/Atom.js +910 -0
  357. package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
  358. package/src/Core/components/chemistry/Ion.js +684 -0
  359. package/src/Core/components/chemistry/IonicCompound.js +189 -0
  360. package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
  361. package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
  362. package/src/Core/components/chemistry/index.js +6 -0
  363. package/src/Core/components/commonsugar/breakstrings.js +627 -0
  364. package/src/Core/components/commonsugar/lists.js +177 -0
  365. package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
  366. package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
  367. package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
  368. package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
  369. package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
  370. package/src/Core/components/dynamicalSystems/index.js +5 -0
  371. package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
  372. package/src/Core/utils/array.js +30 -0
  373. package/src/Core/utils/booleanLogic.js +965 -0
  374. package/src/Core/utils/checkEquality.js +818 -0
  375. package/src/Core/utils/cid.js +29 -0
  376. package/src/Core/utils/componentInfoObjects.js +100 -0
  377. package/src/Core/utils/constraints.js +23 -0
  378. package/src/Core/utils/copy.js +572 -0
  379. package/src/Core/utils/deepFunctions.js +173 -0
  380. package/src/Core/utils/descendants.js +252 -0
  381. package/src/Core/utils/enumeration.js +234 -0
  382. package/src/Core/utils/feedback.js +84 -0
  383. package/src/Core/utils/function.js +1343 -0
  384. package/src/Core/utils/graphical.js +196 -0
  385. package/src/Core/utils/label.js +396 -0
  386. package/src/Core/utils/math.js +1056 -0
  387. package/src/Core/utils/naming.js +45 -0
  388. package/src/Core/utils/periodicSetEquality.js +403 -0
  389. package/src/Core/utils/randomNumbers.js +70 -0
  390. package/src/Core/utils/retrieveMedia.js +98 -0
  391. package/src/Core/utils/retrieveTextFile.js +140 -0
  392. package/src/Core/utils/returnAllPossibleVariants.js +73 -0
  393. package/src/Core/utils/rounding.js +316 -0
  394. package/src/Core/utils/sequence.js +754 -0
  395. package/src/Core/utils/serializedStateProcessing.js +4049 -0
  396. package/src/Core/utils/size.js +22 -0
  397. package/src/Core/utils/stateVariables.js +138 -0
  398. package/src/Core/utils/style.js +535 -0
  399. package/src/Core/utils/subset-of-reals.js +796 -0
  400. package/src/Core/utils/table.js +41 -0
  401. package/src/Core/utils/text.js +16 -0
  402. package/src/Core/utils/triggering.js +167 -0
  403. package/src/Core/utils/variants.js +477 -0
  404. package/src/DoenetML.css +308 -0
  405. package/src/DoenetML.jsx +201 -0
  406. package/src/Parser/doenet.grammar +90 -0
  407. package/src/Parser/doenet.js +33 -0
  408. package/src/Parser/doenet.terms.js +20 -0
  409. package/src/Parser/parser.js +266 -0
  410. package/src/Parser/tokens.js +129 -0
  411. package/src/Tools/CodeMirror.jsx +440 -0
  412. package/src/Tools/DarkmodeController.jsx +21 -0
  413. package/src/Tools/Footers/MathInputSelector.jsx +34 -0
  414. package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
  415. package/src/Tools/cypressTest/CypressTest.jsx +341 -0
  416. package/src/Tools/cypressTest/index.html +102 -0
  417. package/src/Tools/cypressTest/index.jsx +40 -0
  418. package/src/Viewer/ActivityViewer.jsx +1461 -0
  419. package/src/Viewer/PageViewer.jsx +1329 -0
  420. package/src/Viewer/renderers/alert.jsx +17 -0
  421. package/src/Viewer/renderers/angle.jsx +209 -0
  422. package/src/Viewer/renderers/answer.jsx +206 -0
  423. package/src/Viewer/renderers/asList.jsx +25 -0
  424. package/src/Viewer/renderers/blockQuote.jsx +41 -0
  425. package/src/Viewer/renderers/boolean.jsx +17 -0
  426. package/src/Viewer/renderers/booleanInput.css +105 -0
  427. package/src/Viewer/renderers/booleanInput.jsx +636 -0
  428. package/src/Viewer/renderers/button.jsx +369 -0
  429. package/src/Viewer/renderers/c.jsx +17 -0
  430. package/src/Viewer/renderers/callAction.jsx +18 -0
  431. package/src/Viewer/renderers/cell.jsx +59 -0
  432. package/src/Viewer/renderers/chart.jsx +83 -0
  433. package/src/Viewer/renderers/choiceInput.css +223 -0
  434. package/src/Viewer/renderers/choiceInput.jsx +535 -0
  435. package/src/Viewer/renderers/circle.jsx +990 -0
  436. package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
  437. package/src/Viewer/renderers/codeEditor.jsx +248 -0
  438. package/src/Viewer/renderers/codeViewer.jsx +105 -0
  439. package/src/Viewer/renderers/containerBlock.jsx +41 -0
  440. package/src/Viewer/renderers/containerInline.jsx +17 -0
  441. package/src/Viewer/renderers/contentBrowser.jsx +159 -0
  442. package/src/Viewer/renderers/contentPicker.jsx +160 -0
  443. package/src/Viewer/renderers/curve.jsx +1072 -0
  444. package/src/Viewer/renderers/ellipsis.jsx +17 -0
  445. package/src/Viewer/renderers/em.jsx +17 -0
  446. package/src/Viewer/renderers/embed.jsx +110 -0
  447. package/src/Viewer/renderers/feedback.jsx +74 -0
  448. package/src/Viewer/renderers/figure.jsx +131 -0
  449. package/src/Viewer/renderers/footnote.jsx +52 -0
  450. package/src/Viewer/renderers/graph.jsx +925 -0
  451. package/src/Viewer/renderers/hint.jsx +142 -0
  452. package/src/Viewer/renderers/image.jsx +581 -0
  453. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
  454. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
  455. package/src/Viewer/renderers/label.jsx +470 -0
  456. package/src/Viewer/renderers/legend.jsx +306 -0
  457. package/src/Viewer/renderers/line.jsx +511 -0
  458. package/src/Viewer/renderers/lineSegment.jsx +754 -0
  459. package/src/Viewer/renderers/list.jsx +111 -0
  460. package/src/Viewer/renderers/lq.jsx +12 -0
  461. package/src/Viewer/renderers/lsq.jsx +12 -0
  462. package/src/Viewer/renderers/math.jsx +582 -0
  463. package/src/Viewer/renderers/mathInput.css +10 -0
  464. package/src/Viewer/renderers/mathInput.jsx +425 -0
  465. package/src/Viewer/renderers/mathInputog.jsx +534 -0
  466. package/src/Viewer/renderers/mathList.jsx +39 -0
  467. package/src/Viewer/renderers/matrixInput.jsx +317 -0
  468. package/src/Viewer/renderers/mdash.jsx +12 -0
  469. package/src/Viewer/renderers/nbsp.jsx +12 -0
  470. package/src/Viewer/renderers/ndash.jsx +12 -0
  471. package/src/Viewer/renderers/number.jsx +454 -0
  472. package/src/Viewer/renderers/numberList.jsx +35 -0
  473. package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
  474. package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
  475. package/src/Viewer/renderers/p.jsx +38 -0
  476. package/src/Viewer/renderers/paginatorControls.jsx +41 -0
  477. package/src/Viewer/renderers/pegboard.jsx +239 -0
  478. package/src/Viewer/renderers/point.jsx +649 -0
  479. package/src/Viewer/renderers/polygon.jsx +612 -0
  480. package/src/Viewer/renderers/polyline.jsx +608 -0
  481. package/src/Viewer/renderers/pre.jsx +34 -0
  482. package/src/Viewer/renderers/q.jsx +17 -0
  483. package/src/Viewer/renderers/ray.jsx +410 -0
  484. package/src/Viewer/renderers/ref.jsx +149 -0
  485. package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
  486. package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
  487. package/src/Viewer/renderers/row.jsx +31 -0
  488. package/src/Viewer/renderers/rq.jsx +12 -0
  489. package/src/Viewer/renderers/rsq.jsx +12 -0
  490. package/src/Viewer/renderers/section.jsx +427 -0
  491. package/src/Viewer/renderers/sideBySide.jsx +80 -0
  492. package/src/Viewer/renderers/slider.jsx +800 -0
  493. package/src/Viewer/renderers/solution.jsx +134 -0
  494. package/src/Viewer/renderers/spreadsheet.jsx +83 -0
  495. package/src/Viewer/renderers/sq.jsx +17 -0
  496. package/src/Viewer/renderers/styles/global.css +14 -0
  497. package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
  498. package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
  499. package/src/Viewer/renderers/table.jsx +78 -0
  500. package/src/Viewer/renderers/tabular.jsx +58 -0
  501. package/src/Viewer/renderers/tag.jsx +26 -0
  502. package/src/Viewer/renderers/text.jsx +439 -0
  503. package/src/Viewer/renderers/textInput.jsx +774 -0
  504. package/src/Viewer/renderers/textList.jsx +30 -0
  505. package/src/Viewer/renderers/triggerSet.jsx +52 -0
  506. package/src/Viewer/renderers/updateValue.jsx +30 -0
  507. package/src/Viewer/renderers/utils/css.js +13 -0
  508. package/src/Viewer/renderers/utils/graph.js +159 -0
  509. package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
  510. package/src/Viewer/renderers/vector.jsx +678 -0
  511. package/src/Viewer/renderers/video.jsx +494 -0
  512. package/src/Viewer/useDoenetRenderer.jsx +128 -0
  513. package/src/main.jsx +16 -0
  514. package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
  515. package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  516. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  517. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  518. package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  519. package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  520. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  521. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  522. package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
  523. package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  524. package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  525. package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  526. package/src/test/testCode.doenet +26 -0
  527. package/src/test/testViewer.jsx +158 -0
  528. package/src/uiComponents/ActionButton.jsx +157 -0
  529. package/src/uiComponents/ActionButtonGroup.jsx +93 -0
  530. package/src/uiComponents/Button.jsx +160 -0
  531. package/src/uiComponents/ButtonGroup.jsx +56 -0
  532. package/src/uiComponents/ToggleButton.jsx +194 -0
  533. package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
  534. package/src/utils/activityUtils.js +713 -0
  535. package/src/utils/array.js +17 -0
  536. package/src/utils/cid.js +34 -0
  537. package/src/utils/componentInfoObjects.js +89 -0
  538. package/src/utils/deepFunctions.js +165 -0
  539. package/src/utils/enumeration.js +226 -0
  540. package/src/utils/math.js +624 -0
  541. package/src/utils/naming.js +44 -0
  542. package/src/utils/retrieveTextFile.js +156 -0
  543. package/src/utils/returnAllPossibleVariants.js +81 -0
  544. package/src/utils/sequence.js +715 -0
  545. package/src/utils/serialize.js +29 -0
  546. package/src/utils/serializedStateProcessing.js +2587 -0
  547. package/src/utils/subset-of-reals.js +783 -0
  548. package/src/utils/url.js +19 -0
  549. package/vite.config.js +14 -0
@@ -0,0 +1,1343 @@
1
+ import me from "math-expressions";
2
+ import {
3
+ convertValueToMathExpression,
4
+ normalizeMathExpression,
5
+ vectorOperators,
6
+ } from "./math";
7
+
8
+ export function createFunctionFromDefinition(fDefinition) {
9
+ if (fDefinition.functionType === "formula") {
10
+ return returnNumericalFunctionFromFormula({
11
+ formula: me.fromAst(fDefinition.formula),
12
+ numInputs: fDefinition.numInputs,
13
+ variables: fDefinition.variables.map((x) => me.fromAst(x)),
14
+ domain: fDefinition.domain
15
+ ? fDefinition.domain.map((x) => me.fromAst(x))
16
+ : null,
17
+ component: fDefinition.component,
18
+ });
19
+ } else if (fDefinition.functionType === "reevaluatedFormula") {
20
+ let evaluateChildrenToReevaluate = {};
21
+ for (let code in fDefinition.evaluateChildrenToReevaluate) {
22
+ evaluateChildrenToReevaluate[code] = {
23
+ fReevaluate: createFunctionFromDefinition(
24
+ fDefinition.evaluateChildrenToReevaluate[code].fReevaluateDefinition,
25
+ ),
26
+ inputMathFs: fDefinition.evaluateChildrenToReevaluate[
27
+ code
28
+ ].inputMaths.map((x) => me.fromAst(x).subscripts_to_strings().f()),
29
+ };
30
+ }
31
+
32
+ return returnNumericalFunctionFromReevaluatedFormula({
33
+ formulaExpressionWithCodes: me.fromAst(
34
+ fDefinition.formulaExpressionWithCodes,
35
+ ),
36
+ evaluateChildrenToReevaluate,
37
+ numInputs: fDefinition.numInputs,
38
+ variables: fDefinition.variables.map((x) => me.fromAst(x)),
39
+ domain: fDefinition.domain
40
+ ? fDefinition.domain.map((x) => me.fromAst(x))
41
+ : null,
42
+ component: fDefinition.component,
43
+ });
44
+ } else if (fDefinition.functionType === "numericForEvaluate") {
45
+ return returnNumericFunctionForEvaluate({
46
+ numInputs: fDefinition.numInputs,
47
+ numericalfs: fDefinition.fDefinitions.map((fdef) =>
48
+ createFunctionFromDefinition(fdef),
49
+ ),
50
+ });
51
+ } else if (fDefinition.functionType === "bezier") {
52
+ return returnBezierFunctions({
53
+ numThroughPoints: fDefinition.numThroughPoints,
54
+ numericalThroughPoints: fDefinition.numericalThroughPoints,
55
+ splineCoeffs: fDefinition.splineCoeffs,
56
+ extrapolateForward: fDefinition.extrapolateForward,
57
+ extrapolateForwardCoeffs: fDefinition.extrapolateForwardCoeffs,
58
+ extrapolateBackward: fDefinition.extrapolateBackward,
59
+ extrapolateBackwardCoeffs: fDefinition.extrapolateBackwardCoeffs,
60
+ component: fDefinition.component,
61
+ });
62
+ } else if (fDefinition.functionType === "interpolated") {
63
+ return returnInterpolatedFunction({
64
+ xs: fDefinition.xs,
65
+ coeffs: fDefinition.coeffs,
66
+ interpolationPoints: fDefinition.interpolationPoints,
67
+ domain: fDefinition.domain
68
+ ? fDefinition.domain.map((x) => me.fromAst(x))
69
+ : null,
70
+ });
71
+ } else if (fDefinition.functionType === "functionOperator") {
72
+ return returnFunctionOperatorFunction({
73
+ componentType: fDefinition.componentType,
74
+ functionOperatorArguments: fDefinition.functionOperatorArguments,
75
+ operatorComposesWithOriginal: fDefinition.operatorComposesWithOriginal,
76
+ originalFDefinition: fDefinition.originalFDefinition,
77
+ numOutputs: fDefinition.numOutputs,
78
+ component: fDefinition.component,
79
+ });
80
+ } else if (fDefinition.functionType === "ODESolution") {
81
+ return returnODESolutionFunction({
82
+ numDimensions: fDefinition.numDimensions,
83
+ t0: fDefinition.t0,
84
+ x0s: fDefinition.x0s,
85
+ chunkSize: fDefinition.chunkSize,
86
+ tolerance: fDefinition.tolerance,
87
+ numericalRHSfDefinitions: fDefinition.numericalRHSfDefinitions,
88
+ maxIterations: fDefinition.maxIterations,
89
+ component: fDefinition.component,
90
+ });
91
+ } else if (fDefinition.functionType === "piecewise") {
92
+ return returnPiecewiseNumericalFunctionFromChildren({
93
+ numericalFsOfChildren: fDefinition.fDefinitionsOfChildren.map((fDef) =>
94
+ createFunctionFromDefinition(fDef),
95
+ ),
96
+ numericalDomainsOfChildren: fDefinition.numericalDomainsOfChildren,
97
+ domain: fDefinition.domain
98
+ ? fDefinition.domain.map((x) => me.fromAst(x))
99
+ : null,
100
+ component: fDefinition.component,
101
+ });
102
+ } else {
103
+ // otherwise, return the NaN function
104
+ return () => NaN;
105
+ }
106
+ }
107
+
108
+ export function returnNumericalFunctionFromFormula({
109
+ formula,
110
+ numInputs,
111
+ variables,
112
+ domain,
113
+ component = 0,
114
+ }) {
115
+ component = Number(component);
116
+
117
+ let formulaIsVectorValued =
118
+ Array.isArray(formula.tree) && vectorOperators.includes(formula.tree[0]);
119
+
120
+ if (formulaIsVectorValued) {
121
+ try {
122
+ formula = formula.get_component(component);
123
+ } catch (e) {
124
+ return () => NaN;
125
+ }
126
+ } else if (component !== 0) {
127
+ return () => NaN;
128
+ }
129
+
130
+ let formula_f;
131
+ try {
132
+ formula_f = formula.subscripts_to_strings().f();
133
+ } catch (e) {
134
+ return () => NaN;
135
+ }
136
+
137
+ if (numInputs === 1) {
138
+ let varString = variables[0].subscripts_to_strings().tree;
139
+
140
+ let minx = -Infinity,
141
+ maxx = Infinity;
142
+ let openMin = false,
143
+ openMax = false;
144
+ if (domain !== null) {
145
+ let domain0 = domain[0];
146
+ if (domain0 !== undefined) {
147
+ minx = me.fromAst(domain0.tree[1][1]).evaluate_to_constant();
148
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
149
+ minx = -Infinity;
150
+ } else {
151
+ openMin = !domain0.tree[2][1];
152
+ }
153
+ maxx = me.fromAst(domain0.tree[1][2]).evaluate_to_constant();
154
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
155
+ maxx = Infinity;
156
+ } else {
157
+ openMax = !domain0.tree[2][2];
158
+ }
159
+ }
160
+ }
161
+
162
+ return function (x, overrideDomain = false) {
163
+ if (overrideDomain) {
164
+ if (isNaN(x)) {
165
+ return NaN;
166
+ }
167
+ } else if (
168
+ !(x >= minx) ||
169
+ !(x <= maxx) ||
170
+ (openMin && x === minx) ||
171
+ (openMax && x === maxx)
172
+ ) {
173
+ return NaN;
174
+ }
175
+ try {
176
+ return formula_f({ [varString]: x });
177
+ } catch (e) {
178
+ return NaN;
179
+ }
180
+ };
181
+ }
182
+
183
+ let varStrings = [];
184
+ for (let i = 0; i < numInputs; i++) {
185
+ varStrings.push(variables[i].subscripts_to_strings().tree);
186
+ }
187
+
188
+ let haveDomain = false;
189
+ let domainIntervals = [];
190
+ let domainOpens = [];
191
+
192
+ if (domain !== null) {
193
+ haveDomain = true;
194
+
195
+ for (let i = 0; i < numInputs; i++) {
196
+ let thisDomain = domain[i];
197
+ if (!thisDomain) {
198
+ haveDomain = false;
199
+ break;
200
+ }
201
+
202
+ let minx = -Infinity,
203
+ maxx = Infinity;
204
+ let openMin = false,
205
+ openMax = false;
206
+
207
+ minx = me.fromAst(thisDomain.tree[1][1]).evaluate_to_constant();
208
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
209
+ minx = -Infinity;
210
+ } else {
211
+ openMin = !thisDomain.tree[2][1];
212
+ }
213
+ maxx = me.fromAst(thisDomain.tree[1][2]).evaluate_to_constant();
214
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
215
+ maxx = Infinity;
216
+ } else {
217
+ openMax = !thisDomain.tree[2][2];
218
+ }
219
+
220
+ domainIntervals.push([minx, maxx]);
221
+ domainOpens.push([openMin, openMax]);
222
+ }
223
+ }
224
+
225
+ return function (...xs) {
226
+ let fArgs = {};
227
+ for (let i = 0; i < numInputs; i++) {
228
+ let x = xs[i];
229
+ if (isNaN(x)) {
230
+ return NaN;
231
+ } else if (haveDomain) {
232
+ let [minx, maxx] = domainIntervals[i];
233
+ let [openMin, openMax] = domainOpens[i];
234
+ if (
235
+ !(x >= minx) ||
236
+ !(x <= maxx) ||
237
+ (openMin && x === minx) ||
238
+ (openMax && x === maxx)
239
+ ) {
240
+ return NaN;
241
+ }
242
+ }
243
+ fArgs[varStrings[i]] = x;
244
+ }
245
+
246
+ try {
247
+ return formula_f(fArgs);
248
+ } catch (e) {
249
+ return NaN;
250
+ }
251
+ };
252
+ }
253
+
254
+ export function returnNumericalFunctionFromReevaluatedFormula({
255
+ formulaExpressionWithCodes,
256
+ evaluateChildrenToReevaluate,
257
+ numInputs,
258
+ variables,
259
+ domain,
260
+ component = 0,
261
+ }) {
262
+ component = Number(component);
263
+
264
+ let formulaIsVectorValued =
265
+ Array.isArray(formulaExpressionWithCodes.tree) &&
266
+ vectorOperators.includes(formulaExpressionWithCodes.tree[0]);
267
+
268
+ if (formulaIsVectorValued) {
269
+ try {
270
+ formulaExpressionWithCodes = formulaExpressionWithCodes.get_component(
271
+ Number(component),
272
+ );
273
+ } catch (e) {
274
+ return () => NaN;
275
+ }
276
+ } else if (component !== 0) {
277
+ return () => NaN;
278
+ }
279
+
280
+ let formula_f;
281
+ try {
282
+ formula_f = formulaExpressionWithCodes.subscripts_to_strings().f();
283
+ } catch (e) {
284
+ return () => NaN;
285
+ }
286
+
287
+ if (numInputs === 1) {
288
+ let varString = variables[0].subscripts_to_strings().tree;
289
+
290
+ let minx = -Infinity,
291
+ maxx = Infinity;
292
+ let openMin = false,
293
+ openMax = false;
294
+ if (domain !== null) {
295
+ let domain0 = domain[0];
296
+ if (domain0 !== undefined) {
297
+ minx = me.fromAst(domain0.tree[1][1]).evaluate_to_constant();
298
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
299
+ minx = -Infinity;
300
+ } else {
301
+ openMin = !domain0.tree[2][1];
302
+ }
303
+ maxx = me.fromAst(domain0.tree[1][2]).evaluate_to_constant();
304
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
305
+ maxx = Infinity;
306
+ } else {
307
+ openMax = !domain0.tree[2][2];
308
+ }
309
+ }
310
+ }
311
+
312
+ return function (x, overrideDomain = false) {
313
+ if (overrideDomain) {
314
+ if (isNaN(x)) {
315
+ return NaN;
316
+ }
317
+ } else if (
318
+ !(x >= minx) ||
319
+ !(x <= maxx) ||
320
+ (openMin && x === minx) ||
321
+ (openMax && x === maxx)
322
+ ) {
323
+ return NaN;
324
+ }
325
+
326
+ let argsForInputs = { [varString]: x };
327
+ let fArgs = { [varString]: x };
328
+
329
+ for (let code in evaluateChildrenToReevaluate) {
330
+ let childF = evaluateChildrenToReevaluate[code].fReevaluate;
331
+ let inputFs = evaluateChildrenToReevaluate[code].inputMathFs;
332
+ try {
333
+ let input = inputFs.map((f) => me.fromAst(f(argsForInputs)));
334
+ fArgs[code] = childF(input).evaluate_to_constant();
335
+ } catch (e) {
336
+ return NaN;
337
+ }
338
+ }
339
+
340
+ try {
341
+ return formula_f(fArgs);
342
+ } catch (e) {
343
+ return NaN;
344
+ }
345
+ };
346
+ }
347
+
348
+ let varStrings = [];
349
+ for (let i = 0; i < numInputs; i++) {
350
+ varStrings.push(variables[i].subscripts_to_strings().tree);
351
+ }
352
+
353
+ let haveDomain = false;
354
+ let domainIntervals = [];
355
+ let domainOpens = [];
356
+
357
+ if (domain !== null) {
358
+ haveDomain = true;
359
+
360
+ for (let i = 0; i < numInputs; i++) {
361
+ let thisDomain = domain[i];
362
+ if (!thisDomain) {
363
+ haveDomain = false;
364
+ break;
365
+ }
366
+
367
+ let minx = -Infinity,
368
+ maxx = Infinity;
369
+ let openMin = false,
370
+ openMax = false;
371
+
372
+ minx = me.fromAst(thisDomain.tree[1][1]).evaluate_to_constant();
373
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
374
+ minx = -Infinity;
375
+ } else {
376
+ openMin = !thisDomain.tree[2][1];
377
+ }
378
+ maxx = me.fromAst(thisDomain.tree[1][2]).evaluate_to_constant();
379
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
380
+ maxx = Infinity;
381
+ } else {
382
+ openMax = !thisDomain.tree[2][2];
383
+ }
384
+
385
+ domainIntervals.push([minx, maxx]);
386
+ domainOpens.push([openMin, openMax]);
387
+ }
388
+ }
389
+
390
+ return function (...xs) {
391
+ let fArgs = {};
392
+ for (let i = 0; i < numInputs; i++) {
393
+ let x = xs[i];
394
+ if (isNaN(x)) {
395
+ return NaN;
396
+ } else if (haveDomain) {
397
+ let [minx, maxx] = domainIntervals[i];
398
+ let [openMin, openMax] = domainOpens[i];
399
+ if (
400
+ !(x >= minx) ||
401
+ !(x <= maxx) ||
402
+ (openMin && x === minx) ||
403
+ (openMax && x === maxx)
404
+ ) {
405
+ return NaN;
406
+ }
407
+ }
408
+ fArgs[varStrings[i]] = x;
409
+ }
410
+
411
+ let argsForInputs = { ...fArgs };
412
+ for (let code in evaluateChildrenToReevaluate) {
413
+ let childF = evaluateChildrenToReevaluate[code].fReevaluate;
414
+ let inputFs = evaluateChildrenToReevaluate[code].inputMathFs;
415
+ try {
416
+ let input = inputFs.map((f) => me.fromAst(f(argsForInputs)));
417
+ fArgs[code] = childF(input).evaluate_to_constant();
418
+ } catch (e) {
419
+ return NaN;
420
+ }
421
+ }
422
+
423
+ try {
424
+ return formula_f(fArgs);
425
+ } catch (e) {
426
+ return NaN;
427
+ }
428
+ };
429
+ }
430
+
431
+ export function returnPiecewiseNumericalFunctionFromChildren({
432
+ numericalFsOfChildren,
433
+ numericalDomainsOfChildren,
434
+ domain,
435
+ component = 0,
436
+ }) {
437
+ component = Number(component);
438
+
439
+ if (component !== 0) {
440
+ return () => NaN;
441
+ }
442
+
443
+ let minx = -Infinity,
444
+ maxx = Infinity;
445
+ let openMin = false,
446
+ openMax = false;
447
+ if (domain !== null) {
448
+ let domain0 = domain[0];
449
+ if (domain0 !== undefined) {
450
+ minx = me.fromAst(domain0.tree[1][1]).evaluate_to_constant();
451
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
452
+ minx = -Infinity;
453
+ } else {
454
+ openMin = !domain0.tree[2][1];
455
+ }
456
+ maxx = me.fromAst(domain0.tree[1][2]).evaluate_to_constant();
457
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
458
+ maxx = Infinity;
459
+ } else {
460
+ openMax = !domain0.tree[2][2];
461
+ }
462
+ }
463
+ }
464
+
465
+ return function (x, overrideDomain = false) {
466
+ if (overrideDomain) {
467
+ if (isNaN(x)) {
468
+ return NaN;
469
+ }
470
+ } else if (
471
+ !(x >= minx) ||
472
+ !(x <= maxx) ||
473
+ (openMin && x === minx) ||
474
+ (openMax && x === maxx)
475
+ ) {
476
+ return NaN;
477
+ }
478
+
479
+ for (let [ind, childDomain] of numericalDomainsOfChildren.entries()) {
480
+ let childMinX = childDomain[0][0];
481
+ let childMaxX = childDomain[0][1];
482
+ let childMinXClosed = childDomain[1][0];
483
+ let childMaxXClosed = childDomain[1][1];
484
+ if (
485
+ (x > childMinX || (childMinXClosed && x === childMinX)) &&
486
+ (x < childMaxX || (childMaxXClosed && x === childMaxX))
487
+ ) {
488
+ return numericalFsOfChildren[ind](x);
489
+ }
490
+ }
491
+
492
+ return NaN;
493
+ };
494
+ }
495
+
496
+ export function returnSymbolicFunctionFromFormula({
497
+ formula,
498
+ simplify,
499
+ expand,
500
+ domain,
501
+ numInputs,
502
+ variables,
503
+ component = 0,
504
+ }) {
505
+ component = Number(component);
506
+
507
+ let formulaIsVectorValued =
508
+ Array.isArray(formula.tree) && vectorOperators.includes(formula.tree[0]);
509
+
510
+ if (formulaIsVectorValued) {
511
+ try {
512
+ formula = formula.get_component(component);
513
+ } catch (e) {
514
+ return () => me.fromAst("\uff3f");
515
+ }
516
+ } else if (component !== 0) {
517
+ return () => me.fromAst("\uff3f");
518
+ }
519
+
520
+ let formula_transformed = formula.subscripts_to_strings();
521
+
522
+ if (numInputs === 1) {
523
+ let varString = variables[0].subscripts_to_strings().tree;
524
+
525
+ let minx = -Infinity,
526
+ maxx = Infinity;
527
+ let openMin = false,
528
+ openMax = false;
529
+ if (domain !== null) {
530
+ let domain0 = domain[0];
531
+ if (domain0 !== undefined) {
532
+ minx = me.fromAst(domain0.tree[1][1]).evaluate_to_constant();
533
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
534
+ minx = -Infinity;
535
+ } else {
536
+ openMin = !domain0.tree[2][1];
537
+ }
538
+ maxx = me.fromAst(domain0.tree[1][2]).evaluate_to_constant();
539
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
540
+ maxx = Infinity;
541
+ } else {
542
+ openMax = !domain0.tree[2][2];
543
+ }
544
+ }
545
+ }
546
+
547
+ return function (x, overrideDomain = false) {
548
+ if (!overrideDomain) {
549
+ let xNum = x.evaluate_to_constant();
550
+
551
+ if (
552
+ !Number.isNaN(xNum) &&
553
+ (!(xNum >= minx) ||
554
+ !(xNum <= maxx) ||
555
+ (openMin && xNum === minx) ||
556
+ (openMax && xNum === maxx))
557
+ ) {
558
+ return me.fromAst("\uff3f");
559
+ }
560
+ }
561
+
562
+ return normalizeMathExpression({
563
+ value: formula_transformed
564
+ .substitute({ [varString]: x })
565
+ .strings_to_subscripts(),
566
+ simplify,
567
+ expand,
568
+ });
569
+ };
570
+ }
571
+
572
+ let varStrings = [];
573
+ for (let i = 0; i < numInputs; i++) {
574
+ varStrings.push(variables[i].subscripts_to_strings().tree);
575
+ }
576
+
577
+ let haveDomain = false;
578
+ let domainIntervals = [];
579
+ let domainOpens = [];
580
+
581
+ if (domain !== null) {
582
+ haveDomain = true;
583
+
584
+ for (let i = 0; i < numInputs; i++) {
585
+ let thisDomain = domain[i];
586
+ if (!thisDomain) {
587
+ haveDomain = false;
588
+ break;
589
+ }
590
+
591
+ let minx = -Infinity,
592
+ maxx = Infinity;
593
+ let openMin = false,
594
+ openMax = false;
595
+
596
+ minx = me.fromAst(thisDomain.tree[1][1]).evaluate_to_constant();
597
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
598
+ minx = -Infinity;
599
+ } else {
600
+ openMin = !thisDomain.tree[2][1];
601
+ }
602
+ maxx = me.fromAst(thisDomain.tree[1][2]).evaluate_to_constant();
603
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
604
+ maxx = Infinity;
605
+ } else {
606
+ openMax = !thisDomain.tree[2][2];
607
+ }
608
+
609
+ domainIntervals.push([minx, maxx]);
610
+ domainOpens.push([openMin, openMax]);
611
+ }
612
+ }
613
+
614
+ return function (...xs) {
615
+ let subArgs = {};
616
+ let foundOutsideDomain = false;
617
+ let allNumeric = true;
618
+
619
+ for (let i = 0; i < numInputs; i++) {
620
+ let x = xs[i];
621
+
622
+ if (haveDomain && allNumeric) {
623
+ let xNum = x.evaluate_to_constant();
624
+ if (Number.isNaN(xNum)) {
625
+ allNumeric = false;
626
+ } else {
627
+ let [minx, maxx] = domainIntervals[i];
628
+ let [openMin, openMax] = domainOpens[i];
629
+
630
+ if (
631
+ !(xNum >= minx) ||
632
+ !(xNum <= maxx) ||
633
+ (openMin && xNum === minx) ||
634
+ (openMax && xNum === maxx)
635
+ ) {
636
+ foundOutsideDomain = true;
637
+ }
638
+ }
639
+ }
640
+ subArgs[varStrings[i]] = x;
641
+ }
642
+
643
+ if (allNumeric && foundOutsideDomain) {
644
+ return me.fromAst("\uff3f");
645
+ }
646
+
647
+ return normalizeMathExpression({
648
+ value: formula_transformed.substitute(subArgs).strings_to_subscripts(),
649
+ simplify,
650
+ expand,
651
+ });
652
+ };
653
+ }
654
+
655
+ export function returnSymbolicFunctionFromReevaluatedFormula({
656
+ formulaExpressionWithCodes,
657
+ evaluateChildrenToReevaluate,
658
+ simplify,
659
+ expand,
660
+ numInputs,
661
+ variables,
662
+ domain,
663
+ component = 0,
664
+ }) {
665
+ component = Number(component);
666
+
667
+ let formulaIsVectorValued =
668
+ Array.isArray(formulaExpressionWithCodes.tree) &&
669
+ vectorOperators.includes(formulaExpressionWithCodes.tree[0]);
670
+
671
+ if (formulaIsVectorValued) {
672
+ try {
673
+ formulaExpressionWithCodes =
674
+ formulaExpressionWithCodes.get_component(component);
675
+ } catch (e) {
676
+ return () => me.fromAst("\uff3f");
677
+ }
678
+ } else if (component !== 0) {
679
+ return () => me.fromAst("\uff3f");
680
+ }
681
+
682
+ let formula_transformed = formulaExpressionWithCodes.subscripts_to_strings();
683
+
684
+ if (numInputs === 1) {
685
+ let varString = variables[0].subscripts_to_strings().tree;
686
+
687
+ let minx = -Infinity,
688
+ maxx = Infinity;
689
+ let openMin = false,
690
+ openMax = false;
691
+ if (domain !== null) {
692
+ let domain0 = domain[0];
693
+ if (domain0 !== undefined) {
694
+ minx = me.fromAst(domain0.tree[1][1]).evaluate_to_constant();
695
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
696
+ minx = -Infinity;
697
+ } else {
698
+ openMin = !domain0.tree[2][1];
699
+ }
700
+ maxx = me.fromAst(domain0.tree[1][2]).evaluate_to_constant();
701
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
702
+ maxx = Infinity;
703
+ } else {
704
+ openMax = !domain0.tree[2][2];
705
+ }
706
+ }
707
+ }
708
+
709
+ return function (x, overrideDomain = false) {
710
+ if (!overrideDomain) {
711
+ let xNum = x.evaluate_to_constant();
712
+
713
+ if (
714
+ !Number.isNaN(xNum) &&
715
+ (!(xNum >= minx) ||
716
+ !(xNum <= maxx) ||
717
+ (openMin && xNum === minx) ||
718
+ (openMax && xNum === maxx))
719
+ ) {
720
+ return me.fromAst("\uff3f");
721
+ }
722
+ }
723
+
724
+ let argsForInputs = { [varString]: x.tree };
725
+ let fArgs = { [varString]: x };
726
+
727
+ for (let code in evaluateChildrenToReevaluate) {
728
+ let childF = evaluateChildrenToReevaluate[code].fReevaluate;
729
+ let inputFs = evaluateChildrenToReevaluate[code].inputMathFs;
730
+ try {
731
+ let input = inputFs.map((f) => me.fromAst(f(argsForInputs)));
732
+ fArgs[code] = childF(input);
733
+ } catch (e) {
734
+ return NaN;
735
+ }
736
+ }
737
+
738
+ return normalizeMathExpression({
739
+ value: formula_transformed.substitute(fArgs).strings_to_subscripts(),
740
+ simplify,
741
+ expand,
742
+ });
743
+ };
744
+ }
745
+
746
+ let varStrings = [];
747
+ for (let i = 0; i < numInputs; i++) {
748
+ varStrings.push(variables[i].subscripts_to_strings().tree);
749
+ }
750
+
751
+ let haveDomain = false;
752
+ let domainIntervals = [];
753
+ let domainOpens = [];
754
+
755
+ if (domain !== null) {
756
+ haveDomain = true;
757
+
758
+ for (let i = 0; i < numInputs; i++) {
759
+ let thisDomain = domain[i];
760
+ if (!thisDomain) {
761
+ haveDomain = false;
762
+ break;
763
+ }
764
+
765
+ let minx = -Infinity,
766
+ maxx = Infinity;
767
+ let openMin = false,
768
+ openMax = false;
769
+
770
+ minx = me.fromAst(thisDomain.tree[1][1]).evaluate_to_constant();
771
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
772
+ minx = -Infinity;
773
+ } else {
774
+ openMin = !thisDomain.tree[2][1];
775
+ }
776
+ maxx = me.fromAst(thisDomain.tree[1][2]).evaluate_to_constant();
777
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
778
+ maxx = Infinity;
779
+ } else {
780
+ openMax = !thisDomain.tree[2][2];
781
+ }
782
+
783
+ domainIntervals.push([minx, maxx]);
784
+ domainOpens.push([openMin, openMax]);
785
+ }
786
+ }
787
+
788
+ return function (...xs) {
789
+ let subArgs = {};
790
+ let argsForInputs = {};
791
+ let foundOutsideDomain = false;
792
+ let allNumeric = true;
793
+
794
+ for (let i = 0; i < numInputs; i++) {
795
+ let x = xs[i];
796
+
797
+ if (haveDomain && allNumeric) {
798
+ let xNum = x.evaluate_to_constant();
799
+ if (Number.isNaN(xNum)) {
800
+ allNumeric = false;
801
+ } else {
802
+ let [minx, maxx] = domainIntervals[i];
803
+ let [openMin, openMax] = domainOpens[i];
804
+
805
+ if (
806
+ !(xNum >= minx) ||
807
+ !(xNum <= maxx) ||
808
+ (openMin && xNum === minx) ||
809
+ (openMax && xNum === maxx)
810
+ ) {
811
+ foundOutsideDomain = true;
812
+ }
813
+ }
814
+ }
815
+ subArgs[varStrings[i]] = x;
816
+ argsForInputs[varStrings[i]] = x.tree;
817
+ }
818
+
819
+ if (allNumeric && foundOutsideDomain) {
820
+ return me.fromAst("\uff3f");
821
+ }
822
+
823
+ for (let code in evaluateChildrenToReevaluate) {
824
+ let childF = evaluateChildrenToReevaluate[code].fReevaluate;
825
+ let inputFs = evaluateChildrenToReevaluate[code].inputMathFs;
826
+ try {
827
+ let input = inputFs.map((f) => me.fromAst(f(argsForInputs)));
828
+ subArgs[code] = childF(input);
829
+ } catch (e) {
830
+ return NaN;
831
+ }
832
+ }
833
+
834
+ return normalizeMathExpression({
835
+ value: formula_transformed.substitute(subArgs).strings_to_subscripts(),
836
+ simplify,
837
+ expand,
838
+ });
839
+ };
840
+ }
841
+
842
+ export function returnSymbolicFunctionForEvaluate({ symbolicfs, numInputs }) {
843
+ return function (input) {
844
+ // if have a single input, check if it is a vector
845
+ if (input.length === 1) {
846
+ let inputTree = input[0].tree;
847
+ if (Array.isArray(inputTree) && vectorOperators.includes(inputTree[0])) {
848
+ input = inputTree.slice(1).map((x) => me.fromAst(x));
849
+ }
850
+ }
851
+
852
+ if (input.length !== numInputs) {
853
+ return me.fromAst("\uFF3F");
854
+ }
855
+
856
+ let components = symbolicfs.map((f) => f(...input).tree);
857
+
858
+ let value;
859
+ if (components.length === 1) {
860
+ value = me.fromAst(components[0]);
861
+ } else {
862
+ value = me.fromAst(["vector", ...components]);
863
+ }
864
+
865
+ return value;
866
+ };
867
+ }
868
+
869
+ export function returnNumericFunctionForEvaluate({ numericalfs, numInputs }) {
870
+ return function (input) {
871
+ // if have a single input, check if it is a vector
872
+ if (input.length === 1) {
873
+ let inputTree = input[0].tree;
874
+ if (Array.isArray(inputTree) && vectorOperators.includes(inputTree[0])) {
875
+ input = inputTree.slice(1).map((x) => me.fromAst(x));
876
+ }
877
+ }
878
+
879
+ if (input.length !== numInputs) {
880
+ return me.fromAst("\uFF3F");
881
+ }
882
+
883
+ let numericInput = input.map((x) => x.evaluate_to_constant());
884
+
885
+ let components = numericalfs.map((f) => f(...numericInput));
886
+
887
+ let value;
888
+ if (components.length === 1) {
889
+ value = me.fromAst(components[0]);
890
+ } else {
891
+ value = me.fromAst(["vector", ...components]);
892
+ }
893
+
894
+ return value;
895
+ };
896
+ }
897
+
898
+ export function returnBezierFunctions({
899
+ numThroughPoints,
900
+ numericalThroughPoints,
901
+ splineCoeffs,
902
+ extrapolateForward,
903
+ extrapolateForwardCoeffs,
904
+ extrapolateBackward,
905
+ extrapolateBackwardCoeffs,
906
+ component,
907
+ }) {
908
+ if (numThroughPoints < 1) {
909
+ return () => NaN;
910
+ }
911
+
912
+ let len = numThroughPoints - 1;
913
+
914
+ // let firstPointX = numericalThroughPoints[0][component];
915
+ let lastPointX = numericalThroughPoints[len][component];
916
+
917
+ let cs = splineCoeffs.map((x) => x[component]);
918
+ let cB;
919
+ if (extrapolateBackward) {
920
+ cB = extrapolateBackwardCoeffs[component];
921
+ }
922
+ let cF;
923
+ if (extrapolateForward) {
924
+ cF = extrapolateForwardCoeffs[component];
925
+ }
926
+
927
+ return function (t) {
928
+ if (isNaN(t)) {
929
+ return NaN;
930
+ }
931
+
932
+ if (t < 0) {
933
+ if (extrapolateBackward) {
934
+ return (cB[2] * t + cB[1]) * t + cB[0];
935
+ } else {
936
+ return NaN;
937
+ }
938
+ }
939
+
940
+ if (t >= len) {
941
+ if (extrapolateForward) {
942
+ t -= len;
943
+ return (cF[2] * t + cF[1]) * t + cF[0];
944
+ } else if (t === len) {
945
+ return lastPointX;
946
+ } else {
947
+ return NaN;
948
+ }
949
+ }
950
+
951
+ let z = Math.floor(t);
952
+ t -= z;
953
+ let c = cs[z];
954
+ return ((c[3] * t + c[2]) * t + c[1]) * t + c[0];
955
+ };
956
+ }
957
+
958
+ export function returnInterpolatedFunction({
959
+ xs,
960
+ coeffs,
961
+ interpolationPoints,
962
+ domain,
963
+ }) {
964
+ let interpolationPointYs = [];
965
+ if (interpolationPoints) {
966
+ interpolationPointYs = interpolationPoints.map((x) => x.y);
967
+ }
968
+
969
+ if (xs === null) {
970
+ return () => NaN;
971
+ }
972
+
973
+ let minx = -Infinity,
974
+ maxx = Infinity;
975
+ let openMin = false,
976
+ openMax = false;
977
+ if (domain !== null) {
978
+ let domain0 = domain[0];
979
+ if (domain0 !== undefined) {
980
+ minx = me.fromAst(domain0.tree[1][1]).evaluate_to_constant();
981
+ if (typeof minx !== "number" || Number.isNaN(minx)) {
982
+ minx = -Infinity;
983
+ } else {
984
+ openMin = !domain0.tree[2][1];
985
+ }
986
+ maxx = me.fromAst(domain0.tree[1][2]).evaluate_to_constant();
987
+ if (typeof maxx !== "number" || Number.isNaN(maxx)) {
988
+ maxx = Infinity;
989
+ } else {
990
+ openMax = !domain0.tree[2][2];
991
+ }
992
+ }
993
+ }
994
+
995
+ let x0 = xs[0],
996
+ xL = xs[xs.length - 1];
997
+
998
+ return function (x, overrideDomain = false) {
999
+ if (overrideDomain) {
1000
+ if (isNaN(x)) {
1001
+ return NaN;
1002
+ }
1003
+ } else if (
1004
+ !(x >= minx) ||
1005
+ !(x <= maxx) ||
1006
+ (openMin && x === minx) ||
1007
+ (openMax && x === maxx)
1008
+ ) {
1009
+ return NaN;
1010
+ }
1011
+
1012
+ if (x <= x0) {
1013
+ // Extrapolate
1014
+ x -= x0;
1015
+ let c = coeffs[0];
1016
+ return ((c[3] * x + c[2]) * x + c[1]) * x + c[0];
1017
+ }
1018
+
1019
+ if (x >= xL) {
1020
+ let i = xs.length - 2;
1021
+ // Extrapolate
1022
+ x -= xs[i];
1023
+ let c = coeffs[i];
1024
+ return ((c[3] * x + c[2]) * x + c[1]) * x + c[0];
1025
+ }
1026
+
1027
+ // Search for the interval x is in,
1028
+ // returning the corresponding y if x is one of the original xs
1029
+ var low = 0,
1030
+ mid,
1031
+ high = xs.length - 1;
1032
+ while (low <= high) {
1033
+ mid = Math.floor(0.5 * (low + high));
1034
+ let xHere = xs[mid];
1035
+ if (xHere < x) {
1036
+ low = mid + 1;
1037
+ } else if (xHere > x) {
1038
+ high = mid - 1;
1039
+ } else {
1040
+ return interpolationPointYs[mid];
1041
+ }
1042
+ }
1043
+ let i = Math.max(0, high);
1044
+
1045
+ // Interpolate
1046
+ x -= xs[i];
1047
+ let c = coeffs[i];
1048
+ return ((c[3] * x + c[2]) * x + c[1]) * x + c[0];
1049
+ };
1050
+ }
1051
+
1052
+ export function returnReturnDerivativesOfInterpolatedFunction({
1053
+ xs,
1054
+ coeffs,
1055
+ variables,
1056
+ }) {
1057
+ if (!xs) {
1058
+ return () => NaN;
1059
+ }
1060
+
1061
+ let variable1Trans = variables[0].subscripts_to_strings().tree;
1062
+
1063
+ let x0 = xs[0],
1064
+ xL = xs[xs.length - 1];
1065
+
1066
+ return function (derivVariables) {
1067
+ let derivVariablesTrans = derivVariables.map(
1068
+ (x) => x.subscripts_to_strings().tree,
1069
+ );
1070
+
1071
+ let order = derivVariablesTrans.length;
1072
+
1073
+ if (
1074
+ order > 3 ||
1075
+ !derivVariablesTrans.every((x) => x === variable1Trans) ||
1076
+ derivVariablesTrans.includes("\uff3f")
1077
+ ) {
1078
+ return () => 0;
1079
+ }
1080
+
1081
+ if (order === 0 || xs === null) {
1082
+ return () => NaN;
1083
+ }
1084
+
1085
+ return function (x) {
1086
+ if (isNaN(x)) {
1087
+ return NaN;
1088
+ }
1089
+
1090
+ if (x <= x0) {
1091
+ // Extrapolate
1092
+ x -= x0;
1093
+ let c = coeffs[0];
1094
+ if (order === 1) {
1095
+ return (3 * c[3] * x + 2 * c[2]) * x + c[1];
1096
+ } else if (order === 2) {
1097
+ return 6 * c[3] * x + 2 * c[2];
1098
+ } else {
1099
+ return 6 * c[3];
1100
+ }
1101
+ }
1102
+
1103
+ if (x >= xL) {
1104
+ let i = xs.length - 2;
1105
+ // Extrapolate
1106
+ x -= xs[i];
1107
+ let c = coeffs[i];
1108
+ if (order === 1) {
1109
+ return (3 * c[3] * x + 2 * c[2]) * x + c[1];
1110
+ } else if (order === 2) {
1111
+ return 6 * c[3] * x + 2 * c[2];
1112
+ } else {
1113
+ return 6 * c[3];
1114
+ }
1115
+ }
1116
+
1117
+ // Search for the interval x is in,
1118
+ // returning the corresponding y if x is one of the original xs
1119
+ var low = 0,
1120
+ mid,
1121
+ high = xs.length - 1;
1122
+ while (low <= high) {
1123
+ mid = Math.floor(0.5 * (low + high));
1124
+ let xHere = xs[mid];
1125
+ if (xHere < x) {
1126
+ low = mid + 1;
1127
+ } else if (xHere > x) {
1128
+ high = mid - 1;
1129
+ } else {
1130
+ // at a grid point
1131
+ if (order === 1) {
1132
+ return coeffs[mid][1];
1133
+ } else if (order === 2) {
1134
+ return 2 * coeffs[mid][2];
1135
+ } else {
1136
+ return 6 * coeffs[mid][3];
1137
+ }
1138
+ }
1139
+ }
1140
+ let i = Math.max(0, high);
1141
+
1142
+ // Interpolate
1143
+ x -= xs[i];
1144
+ let c = coeffs[i];
1145
+ if (order === 1) {
1146
+ return (3 * c[3] * x + 2 * c[2]) * x + c[1];
1147
+ } else if (order === 2) {
1148
+ return 6 * c[3] * x + 2 * c[2];
1149
+ } else {
1150
+ return 6 * c[3];
1151
+ }
1152
+ };
1153
+ };
1154
+ }
1155
+
1156
+ function returnFunctionOperatorFunction({
1157
+ componentType,
1158
+ functionOperatorArguments,
1159
+ operatorComposesWithOriginal,
1160
+ originalFDefinition,
1161
+ numOutputs,
1162
+ component,
1163
+ }) {
1164
+ // TODO: correctly handle numOutputs > 1
1165
+
1166
+ if (operatorComposesWithOriginal) {
1167
+ let childFs = [];
1168
+ for (let ind = 0; ind < numOutputs; ind++) {
1169
+ childFs.push(createFunctionFromDefinition(originalFDefinition, ind));
1170
+ }
1171
+
1172
+ let functionOperator = functionOperatorDefinitions[componentType](
1173
+ ...functionOperatorArguments,
1174
+ );
1175
+
1176
+ return (...xs) => functionOperator(...childFs.map((cf) => cf(...xs)));
1177
+ } else {
1178
+ return functionOperatorDefinitions[componentType](
1179
+ ...functionOperatorArguments,
1180
+ );
1181
+ }
1182
+ }
1183
+
1184
+ export var functionOperatorDefinitions = {
1185
+ clampFunction: function (lowerValue, upperValue) {
1186
+ return function (x) {
1187
+ // if don't have a number, return NaN
1188
+ if (!Number.isFinite(x)) {
1189
+ return NaN;
1190
+ }
1191
+ return Math.max(lowerValue, Math.min(upperValue, x));
1192
+ };
1193
+ },
1194
+
1195
+ wrapFunctionPeriodic: function (lowerValue, upperValue) {
1196
+ return function (x) {
1197
+ // if don't have a number, return NaN
1198
+ if (!Number.isFinite(x)) {
1199
+ return NaN;
1200
+ }
1201
+
1202
+ let lower = lowerValue;
1203
+ let upper = upperValue;
1204
+
1205
+ // if bounds are the same, clamp to that value
1206
+ if (lower === upper) {
1207
+ return lower;
1208
+ }
1209
+
1210
+ // just in case lower is larger than upper, swap values
1211
+ if (lower > upper) {
1212
+ [upper, lower] = [lower, upper];
1213
+ }
1214
+
1215
+ return lower + me.math.mod(x - lower, upper - lower);
1216
+ };
1217
+ },
1218
+
1219
+ derivative: function (derivDefinition, derivVariables) {
1220
+ if (derivDefinition.derivativeType === "interpolatedFunction") {
1221
+ let derivGenerator = returnReturnDerivativesOfInterpolatedFunction({
1222
+ xs: derivDefinition.xs,
1223
+ coeffs: derivDefinition.coeffs,
1224
+ variables: derivDefinition.variables.map(convertValueToMathExpression),
1225
+ });
1226
+
1227
+ let vars = derivVariables.map(convertValueToMathExpression);
1228
+ if (derivDefinition.additionalDerivVariables) {
1229
+ let additionalVars = derivDefinition.additionalDerivVariables.map(
1230
+ convertValueToMathExpression,
1231
+ );
1232
+ vars = [...additionalVars, ...vars];
1233
+ }
1234
+ if (derivDefinition.variableMappings) {
1235
+ for (let variableMapping of derivDefinition.variableMappings) {
1236
+ let mappedDerivVariables = [];
1237
+
1238
+ for (let dVar of vars) {
1239
+ let mapped = variableMapping[dVar.subscripts_to_strings().tree];
1240
+ if (mapped) {
1241
+ mappedDerivVariables.push(convertValueToMathExpression(mapped));
1242
+ } else {
1243
+ // have a mapping, but
1244
+ mappedDerivVariables.push(me.fromAst("\uff3f"));
1245
+ }
1246
+ }
1247
+
1248
+ vars = mappedDerivVariables;
1249
+ }
1250
+ }
1251
+ let deriv = derivGenerator(vars);
1252
+
1253
+ return deriv;
1254
+ } else {
1255
+ return () => NaN;
1256
+ }
1257
+ },
1258
+ };
1259
+
1260
+ function returnODESolutionFunction({
1261
+ numDimensions,
1262
+ t0,
1263
+ x0s,
1264
+ chunkSize,
1265
+ tolerance,
1266
+ numericalRHSfDefinitions,
1267
+ maxIterations,
1268
+ component,
1269
+ }) {
1270
+ var workspace = {};
1271
+
1272
+ workspace.calculatedNumericSolutions = [];
1273
+ workspace.endingNumericalValues = [];
1274
+ workspace.maxPossibleTime = undefined;
1275
+
1276
+ let numericalRHSfcomponents = numericalRHSfDefinitions.map((x) =>
1277
+ createFunctionFromDefinition(x),
1278
+ );
1279
+
1280
+ let numericalRHSf = function (t, x) {
1281
+ let fargs = [t];
1282
+ if (Array.isArray(x)) {
1283
+ fargs.push(...x);
1284
+ } else {
1285
+ fargs.push(x);
1286
+ }
1287
+ try {
1288
+ return numericalRHSfcomponents.map((f) => f(...fargs));
1289
+ } catch (e) {
1290
+ return NaN;
1291
+ }
1292
+ };
1293
+
1294
+ return function f(t) {
1295
+ if (!Number.isFinite(t)) {
1296
+ return NaN;
1297
+ }
1298
+ if (t === t0) {
1299
+ return x0s[component];
1300
+ }
1301
+
1302
+ let nChunksCalculated = workspace.calculatedNumericSolutions.length;
1303
+ let chunk = Math.ceil((t - t0) / chunkSize) - 1;
1304
+ if (chunk < 0) {
1305
+ // console.log("Haven't yet implemented integrating ODE backward")
1306
+ return NaN;
1307
+ }
1308
+ if (workspace.maxPossibleTime === undefined && chunk >= nChunksCalculated) {
1309
+ for (let tind = nChunksCalculated; tind <= chunk; tind++) {
1310
+ let x0 = workspace.endingNumericalValues[tind - 1];
1311
+ if (x0 === undefined) {
1312
+ x0 = x0s;
1313
+ }
1314
+ let t0shifted = t0 + tind * chunkSize;
1315
+ let result = me.math.dopri(
1316
+ t0shifted,
1317
+ t0shifted + chunkSize,
1318
+ x0,
1319
+ numericalRHSf,
1320
+ tolerance,
1321
+ maxIterations,
1322
+ );
1323
+
1324
+ workspace.endingNumericalValues.push(result.y[result.y.length - 1]);
1325
+ workspace.calculatedNumericSolutions.push(result.at.bind(result));
1326
+
1327
+ let endingTime = result.x[result.x.length - 1];
1328
+ if (endingTime < (t0shifted + chunkSize) * (1 - 1e-6)) {
1329
+ workspace.maxPossibleTime = endingTime;
1330
+ break;
1331
+ }
1332
+ }
1333
+ }
1334
+
1335
+ if (t > workspace.maxPossibleTime) {
1336
+ return NaN;
1337
+ }
1338
+
1339
+ let value = workspace.calculatedNumericSolutions[chunk](t)[component];
1340
+
1341
+ return value;
1342
+ };
1343
+ }