@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,1286 @@
1
+ import { returnRoundingStateVariableDefinitions } from "../utils/rounding";
2
+ import MathBaseOperator from "./abstract/MathBaseOperator";
3
+ import MathBaseOperatorOneInput from "./abstract/MathBaseOperatorOneInput";
4
+ import me from "math-expressions";
5
+
6
+ export class Sum extends MathBaseOperator {
7
+ static componentType = "sum";
8
+
9
+ static returnStateVariableDefinitions() {
10
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
11
+
12
+ stateVariableDefinitions.numericOperator = {
13
+ returnDependencies: () => ({}),
14
+ definition: () => ({
15
+ setValue: {
16
+ numericOperator: function (inputs) {
17
+ return inputs.reduce((a, c) => a + c);
18
+ },
19
+ },
20
+ }),
21
+ };
22
+
23
+ stateVariableDefinitions.mathOperator = {
24
+ returnDependencies: () => ({}),
25
+ definition: () => ({
26
+ setValue: {
27
+ mathOperator: function (inputs) {
28
+ return inputs.reduce((a, c) => a.add(c));
29
+ },
30
+ },
31
+ }),
32
+ };
33
+
34
+ return stateVariableDefinitions;
35
+ }
36
+ }
37
+
38
+ export class Product extends MathBaseOperator {
39
+ static componentType = "product";
40
+
41
+ static returnStateVariableDefinitions() {
42
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
43
+
44
+ stateVariableDefinitions.numericOperator = {
45
+ returnDependencies: () => ({}),
46
+ definition: () => ({
47
+ setValue: {
48
+ numericOperator: function (inputs) {
49
+ return inputs.reduce((a, c) => a * c);
50
+ },
51
+ },
52
+ }),
53
+ };
54
+
55
+ stateVariableDefinitions.mathOperator = {
56
+ returnDependencies: () => ({}),
57
+ definition: () => ({
58
+ setValue: {
59
+ mathOperator: function (values) {
60
+ return values.reduce((a, c) => a.multiply(c));
61
+ },
62
+ },
63
+ }),
64
+ };
65
+
66
+ return stateVariableDefinitions;
67
+ }
68
+ }
69
+
70
+ export class ClampNumber extends MathBaseOperatorOneInput {
71
+ static componentType = "clampNumber";
72
+
73
+ static createAttributesObject() {
74
+ let attributes = super.createAttributesObject();
75
+ attributes.lowerValue = {
76
+ createComponentOfType: "number",
77
+ createStateVariable: "lowerValue",
78
+ defaultValue: 0,
79
+ public: true,
80
+ };
81
+ attributes.upperValue = {
82
+ createComponentOfType: "number",
83
+ createStateVariable: "upperValue",
84
+ defaultValue: 1,
85
+ public: true,
86
+ };
87
+ return attributes;
88
+ }
89
+
90
+ static returnStateVariableDefinitions() {
91
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
92
+
93
+ stateVariableDefinitions.isNumericOperator = {
94
+ returnDependencies: () => ({}),
95
+ definition: () => ({ setValue: { isNumericOperator: true } }),
96
+ };
97
+
98
+ stateVariableDefinitions.mathOperator = {
99
+ returnDependencies: () => ({
100
+ lowerValue: {
101
+ dependencyType: "stateVariable",
102
+ variableName: "lowerValue",
103
+ },
104
+ upperValue: {
105
+ dependencyType: "stateVariable",
106
+ variableName: "upperValue",
107
+ },
108
+ }),
109
+ definition: ({ dependencyValues }) => ({
110
+ setValue: {
111
+ mathOperator: function (value) {
112
+ return clamp({
113
+ value,
114
+ lowerValue: dependencyValues.lowerValue,
115
+ upperValue: dependencyValues.upperValue,
116
+ });
117
+ },
118
+ },
119
+ }),
120
+ };
121
+
122
+ stateVariableDefinitions.inverseMathOperator = {
123
+ returnDependencies: () => ({
124
+ lowerValue: {
125
+ dependencyType: "stateVariable",
126
+ variableName: "lowerValue",
127
+ },
128
+ upperValue: {
129
+ dependencyType: "stateVariable",
130
+ variableName: "upperValue",
131
+ },
132
+ }),
133
+ definition: ({ dependencyValues }) => ({
134
+ setValue: {
135
+ inverseMathOperator: function (value) {
136
+ return clamp({
137
+ value,
138
+ lowerValue: dependencyValues.lowerValue,
139
+ upperValue: dependencyValues.upperValue,
140
+ });
141
+ },
142
+ },
143
+ }),
144
+ };
145
+
146
+ return stateVariableDefinitions;
147
+ }
148
+ }
149
+
150
+ function clamp({ value, lowerValue, upperValue }) {
151
+ let numericValue = value;
152
+ if (numericValue instanceof me.class) {
153
+ numericValue = numericValue.evaluate_to_constant();
154
+ }
155
+ return me.fromAst(Math.max(lowerValue, Math.min(upperValue, numericValue)));
156
+ }
157
+
158
+ export class WrapNumberPeriodic extends MathBaseOperatorOneInput {
159
+ static componentType = "wrapNumberPeriodic";
160
+
161
+ static createAttributesObject() {
162
+ let attributes = super.createAttributesObject();
163
+ attributes.lowerValue = {
164
+ createComponentOfType: "number",
165
+ createStateVariable: "lowerValue",
166
+ defaultValue: 0,
167
+ public: true,
168
+ };
169
+ attributes.upperValue = {
170
+ createComponentOfType: "number",
171
+ createStateVariable: "upperValue",
172
+ defaultValue: 1,
173
+ public: true,
174
+ };
175
+ return attributes;
176
+ }
177
+
178
+ static returnStateVariableDefinitions() {
179
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
180
+
181
+ stateVariableDefinitions.isNumericOperator = {
182
+ returnDependencies: () => ({}),
183
+ definition: () => ({ setValue: { isNumericOperator: true } }),
184
+ };
185
+
186
+ stateVariableDefinitions.mathOperator = {
187
+ returnDependencies: () => ({
188
+ lowerValue: {
189
+ dependencyType: "stateVariable",
190
+ variableName: "lowerValue",
191
+ },
192
+ upperValue: {
193
+ dependencyType: "stateVariable",
194
+ variableName: "upperValue",
195
+ },
196
+ }),
197
+ definition: ({ dependencyValues }) => ({
198
+ setValue: {
199
+ mathOperator: function (value) {
200
+ return makePeriodic({
201
+ value,
202
+ lowerValue: dependencyValues.lowerValue,
203
+ upperValue: dependencyValues.upperValue,
204
+ });
205
+ },
206
+ },
207
+ }),
208
+ };
209
+
210
+ stateVariableDefinitions.inverseMathOperator = {
211
+ returnDependencies: () => ({
212
+ lowerValue: {
213
+ dependencyType: "stateVariable",
214
+ variableName: "lowerValue",
215
+ },
216
+ upperValue: {
217
+ dependencyType: "stateVariable",
218
+ variableName: "upperValue",
219
+ },
220
+ }),
221
+ definition: ({ dependencyValues }) => ({
222
+ setValue: {
223
+ inverseMathOperator: function (value) {
224
+ return makePeriodic({
225
+ value,
226
+ lowerValue: dependencyValues.lowerValue,
227
+ upperValue: dependencyValues.upperValue,
228
+ });
229
+ },
230
+ },
231
+ }),
232
+ };
233
+
234
+ return stateVariableDefinitions;
235
+ }
236
+ }
237
+
238
+ function makePeriodic({ value, lowerValue, upperValue }) {
239
+ let numericValue = value;
240
+ if (numericValue instanceof me.class) {
241
+ numericValue = numericValue.evaluate_to_constant();
242
+ }
243
+
244
+ if (!Number.isFinite(numericValue)) {
245
+ return me.fromAst(NaN);
246
+ }
247
+
248
+ // if bounds are the same, clamp to that value
249
+ if (lowerValue === upperValue) {
250
+ return me.fromAst(lowerValue);
251
+ }
252
+
253
+ // just in case lowerValue is larger than upperValue, swap values
254
+ if (lowerValue > upperValue) {
255
+ [upperValue, lowerValue] = [lowerValue, upperValue];
256
+ }
257
+
258
+ return me.fromAst(
259
+ lowerValue +
260
+ me.math.mod(numericValue - lowerValue, upperValue - lowerValue),
261
+ );
262
+ }
263
+
264
+ export class Round extends MathBaseOperatorOneInput {
265
+ static componentType = "round";
266
+
267
+ static createAttributesObject() {
268
+ let attributes = super.createAttributesObject();
269
+ attributes.numDecimals = {
270
+ createComponentOfType: "number",
271
+ createStateVariable: "numDecimals",
272
+ defaultValue: 0,
273
+ public: true,
274
+ };
275
+ attributes.numDigits = {
276
+ createComponentOfType: "number",
277
+ createStateVariable: "numDigits",
278
+ defaultValue: null,
279
+ public: true,
280
+ };
281
+ return attributes;
282
+ }
283
+
284
+ static returnStateVariableDefinitions() {
285
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
286
+
287
+ // change default rounding to 14
288
+ // so that actual rounding result can be seen.
289
+ // Don't include maths for childsGroupIfSingleMatch
290
+ // so that this overrides display rounding from children
291
+ let roundingDefinitions = returnRoundingStateVariableDefinitions({
292
+ includeListParents: true,
293
+ displayDigitsDefault: 14,
294
+ });
295
+ Object.assign(stateVariableDefinitions, roundingDefinitions);
296
+
297
+ stateVariableDefinitions.mathOperator = {
298
+ returnDependencies: () => ({
299
+ numDecimals: {
300
+ dependencyType: "stateVariable",
301
+ variableName: "numDecimals",
302
+ },
303
+ numDigits: {
304
+ dependencyType: "stateVariable",
305
+ variableName: "numDigits",
306
+ },
307
+ }),
308
+ definition: ({ dependencyValues }) => ({
309
+ setValue: {
310
+ mathOperator: function (value) {
311
+ // first convert all numbers and constants (such as pi) to floating point numbers
312
+ let valueWithNumbers = value.evaluate_numbers({
313
+ max_digits: Infinity,
314
+ evaluate_functions: true,
315
+ });
316
+
317
+ if (dependencyValues.numDigits !== null) {
318
+ return valueWithNumbers.round_numbers_to_precision(
319
+ dependencyValues.numDigits,
320
+ );
321
+ } else {
322
+ return valueWithNumbers.round_numbers_to_decimals(
323
+ dependencyValues.numDecimals,
324
+ );
325
+ }
326
+ },
327
+ },
328
+ }),
329
+ };
330
+
331
+ stateVariableDefinitions.inverseMathOperator = {
332
+ returnDependencies: () => ({}),
333
+ definition: () => ({
334
+ setValue: {
335
+ inverseMathOperator: (value) => value,
336
+ },
337
+ }),
338
+ };
339
+
340
+ return stateVariableDefinitions;
341
+ }
342
+ }
343
+
344
+ export class setSmallToZero extends MathBaseOperatorOneInput {
345
+ static componentType = "setSmallToZero";
346
+
347
+ static createAttributesObject() {
348
+ let attributes = super.createAttributesObject();
349
+ attributes.threshold = {
350
+ createComponentOfType: "number",
351
+ createStateVariable: "threshold",
352
+ defaultValue: 1e-14,
353
+ public: true,
354
+ };
355
+ return attributes;
356
+ }
357
+
358
+ static returnStateVariableDefinitions() {
359
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
360
+
361
+ stateVariableDefinitions.mathOperator = {
362
+ returnDependencies: () => ({
363
+ threshold: {
364
+ dependencyType: "stateVariable",
365
+ variableName: "threshold",
366
+ },
367
+ }),
368
+ definition: ({ dependencyValues }) => ({
369
+ setValue: {
370
+ mathOperator: function (value) {
371
+ return value.evaluate_numbers({
372
+ skip_ordering: true,
373
+ set_small_zero: dependencyValues.threshold,
374
+ });
375
+ },
376
+ },
377
+ }),
378
+ };
379
+
380
+ stateVariableDefinitions.inverseMathOperator = {
381
+ returnDependencies: () => ({}),
382
+ definition: () => ({
383
+ setValue: {
384
+ inverseMathOperator: (value) => value,
385
+ },
386
+ }),
387
+ };
388
+
389
+ return stateVariableDefinitions;
390
+ }
391
+ }
392
+
393
+ export class ConvertSetToList extends MathBaseOperatorOneInput {
394
+ static componentType = "convertSetToList";
395
+
396
+ static createAttributesObject() {
397
+ let attributes = super.createAttributesObject();
398
+ delete attributes.unordered;
399
+ return attributes;
400
+ }
401
+
402
+ static returnStateVariableDefinitions() {
403
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
404
+
405
+ stateVariableDefinitions.unordered = {
406
+ returnDependencies: () => ({}),
407
+ definition: () => ({
408
+ setValue: { unordered: true },
409
+ }),
410
+ };
411
+
412
+ stateVariableDefinitions.mathOperator = {
413
+ returnDependencies: () => ({}),
414
+ definition: () => ({
415
+ setValue: {
416
+ mathOperator: function (value) {
417
+ if (
418
+ value !== undefined &&
419
+ Array.isArray(value.tree) &&
420
+ value.tree[0] === "set"
421
+ ) {
422
+ let distinctElements = [];
423
+ for (let v of value.tree.slice(1)) {
424
+ // if v doesn't match any previous elements, add to array
425
+ if (
426
+ !distinctElements.some((x) =>
427
+ value.context.equalsViaSyntax(
428
+ value.context.fromAst(x),
429
+ value.context.fromAst(v),
430
+ ),
431
+ )
432
+ ) {
433
+ distinctElements.push(v);
434
+ }
435
+ }
436
+ return value.context.fromAst(["list", ...distinctElements]);
437
+ }
438
+
439
+ return value;
440
+ },
441
+ },
442
+ }),
443
+ };
444
+
445
+ return stateVariableDefinitions;
446
+ }
447
+ }
448
+
449
+ export class Ceil extends MathBaseOperatorOneInput {
450
+ static componentType = "ceil";
451
+
452
+ static returnStateVariableDefinitions() {
453
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
454
+
455
+ stateVariableDefinitions.mathOperator = {
456
+ returnDependencies: () => ({}),
457
+ definition: () => ({
458
+ setValue: {
459
+ mathOperator: function (value) {
460
+ let numericValue = value.evaluate_to_constant();
461
+
462
+ // if don't have a number, just return symbolic ceil
463
+ if (!Number.isFinite(numericValue)) {
464
+ return me.fromAst(["apply", "ceil", value.tree]);
465
+ }
466
+
467
+ // to account for roundoff error, if within rounding error of integer, use that
468
+ let rounded = Math.round(numericValue);
469
+ if (Math.abs((rounded - numericValue) / numericValue) < 1e-15) {
470
+ return me.fromAst(rounded);
471
+ }
472
+
473
+ return me.fromAst(Math.ceil(numericValue));
474
+ },
475
+ },
476
+ }),
477
+ };
478
+
479
+ stateVariableDefinitions.inverseMathOperator = {
480
+ returnDependencies: () => ({}),
481
+ definition: () => ({
482
+ setValue: {
483
+ inverseMathOperator: (value) => value,
484
+ },
485
+ }),
486
+ };
487
+
488
+ return stateVariableDefinitions;
489
+ }
490
+ }
491
+
492
+ export class Floor extends MathBaseOperatorOneInput {
493
+ static componentType = "floor";
494
+
495
+ static returnStateVariableDefinitions() {
496
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
497
+
498
+ stateVariableDefinitions.mathOperator = {
499
+ returnDependencies: () => ({}),
500
+ definition: () => ({
501
+ setValue: {
502
+ mathOperator: function (value) {
503
+ let numericValue = value.evaluate_to_constant();
504
+
505
+ // if don't have a number, just return symbolic floor
506
+ if (!Number.isFinite(numericValue)) {
507
+ return me.fromAst(["apply", "floor", value.tree]);
508
+ }
509
+
510
+ // to account for roundoff error, if within rounding error of integer, use that
511
+ let rounded = Math.round(numericValue);
512
+ if (Math.abs((rounded - numericValue) / numericValue) < 1e-15) {
513
+ return me.fromAst(rounded);
514
+ }
515
+
516
+ return me.fromAst(Math.floor(numericValue));
517
+ },
518
+ },
519
+ }),
520
+ };
521
+
522
+ stateVariableDefinitions.inverseMathOperator = {
523
+ returnDependencies: () => ({}),
524
+ definition: () => ({
525
+ setValue: {
526
+ inverseMathOperator: (value) => value,
527
+ },
528
+ }),
529
+ };
530
+
531
+ return stateVariableDefinitions;
532
+ }
533
+ }
534
+
535
+ export class Abs extends MathBaseOperatorOneInput {
536
+ static componentType = "abs";
537
+
538
+ static returnStateVariableDefinitions() {
539
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
540
+
541
+ stateVariableDefinitions.mathOperator = {
542
+ returnDependencies: () => ({}),
543
+ definition: () => ({
544
+ setValue: {
545
+ mathOperator: function (value) {
546
+ // TODO: is this the right behavior?
547
+ // or should <abs>log(5)</abs> yield |log(5)|?
548
+ let numericValue = value.evaluate_to_constant();
549
+
550
+ // if don't have a number, just return symbolic absolute value
551
+ if (!Number.isFinite(numericValue)) {
552
+ return me.fromAst(["apply", "abs", value.tree]);
553
+ }
554
+
555
+ return me.fromAst(Math.abs(numericValue));
556
+ },
557
+ },
558
+ }),
559
+ };
560
+
561
+ stateVariableDefinitions.inverseMathOperator = {
562
+ returnDependencies: () => ({}),
563
+ definition: () => ({
564
+ setValue: {
565
+ inverseMathOperator: function (value) {
566
+ let desiredValue = value;
567
+ let valueNumeric = value.evaluate_to_constant();
568
+ if (Number.isFinite(valueNumeric)) {
569
+ if (valueNumeric < 0) {
570
+ desiredValue = me.fromAst(0);
571
+ }
572
+ } else if (
573
+ Array.isArray(value.tree) &&
574
+ value.tree[0] === "apply" &&
575
+ value.tree[1] === "abs"
576
+ ) {
577
+ desiredValue = me.fromAst(value.tree[2]);
578
+ }
579
+ return desiredValue;
580
+ },
581
+ },
582
+ }),
583
+ };
584
+
585
+ return stateVariableDefinitions;
586
+ }
587
+ }
588
+
589
+ export class Sign extends MathBaseOperatorOneInput {
590
+ static componentType = "sign";
591
+
592
+ static returnStateVariableDefinitions() {
593
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
594
+
595
+ stateVariableDefinitions.mathOperator = {
596
+ returnDependencies: () => ({}),
597
+ definition: () => ({
598
+ setValue: {
599
+ mathOperator: function (value) {
600
+ let numericValue = value.evaluate_to_constant();
601
+
602
+ // if don't have a number, just return symbolic sign
603
+ if (!Number.isFinite(numericValue)) {
604
+ return me.fromAst(["apply", "sign", value.tree]);
605
+ }
606
+
607
+ return me.fromAst(Math.sign(numericValue));
608
+ },
609
+ },
610
+ }),
611
+ };
612
+
613
+ return stateVariableDefinitions;
614
+ }
615
+ }
616
+
617
+ export class Mean extends MathBaseOperator {
618
+ static componentType = "mean";
619
+
620
+ static returnStateVariableDefinitions() {
621
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
622
+
623
+ stateVariableDefinitions.numericOperator = {
624
+ returnDependencies: () => ({}),
625
+ definition: () => ({
626
+ setValue: {
627
+ numericOperator: function (inputs) {
628
+ let mean = inputs.reduce((a, c) => a + c);
629
+ mean /= inputs.length;
630
+ return mean;
631
+ },
632
+ },
633
+ }),
634
+ };
635
+
636
+ stateVariableDefinitions.mathOperator = {
637
+ returnDependencies: () => ({}),
638
+ definition: () => ({
639
+ setValue: {
640
+ mathOperator: function (inputs) {
641
+ return inputs.reduce((a, c) => a.add(c)).divide(inputs.length);
642
+ },
643
+ },
644
+ }),
645
+ };
646
+
647
+ return stateVariableDefinitions;
648
+ }
649
+ }
650
+
651
+ export class Median extends MathBaseOperator {
652
+ static componentType = "median";
653
+
654
+ static returnStateVariableDefinitions() {
655
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
656
+
657
+ stateVariableDefinitions.isNumericOperator = {
658
+ returnDependencies: () => ({}),
659
+ definition: () => ({ setValue: { isNumericOperator: true } }),
660
+ };
661
+
662
+ stateVariableDefinitions.numericOperator = {
663
+ returnDependencies: () => ({}),
664
+ definition: () => ({
665
+ setValue: {
666
+ numericOperator: function (inputs) {
667
+ return me.math.median(inputs);
668
+ },
669
+ },
670
+ }),
671
+ };
672
+
673
+ return stateVariableDefinitions;
674
+ }
675
+ }
676
+
677
+ export class Variance extends MathBaseOperator {
678
+ static componentType = "variance";
679
+
680
+ static createAttributesObject() {
681
+ let attributes = super.createAttributesObject();
682
+ attributes.population = {
683
+ createComponentOfType: "boolean",
684
+ createStateVariable: "population",
685
+ defaultValue: false,
686
+ public: true,
687
+ };
688
+ return attributes;
689
+ }
690
+
691
+ static returnStateVariableDefinitions() {
692
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
693
+
694
+ stateVariableDefinitions.numericOperator = {
695
+ returnDependencies: () => ({
696
+ population: {
697
+ dependencyType: "stateVariable",
698
+ variableName: "population",
699
+ },
700
+ }),
701
+ definition: ({ dependencyValues }) => ({
702
+ setValue: {
703
+ numericOperator: function (inputs) {
704
+ return calculateNumericVariance(
705
+ inputs,
706
+ dependencyValues.population,
707
+ );
708
+ },
709
+ },
710
+ }),
711
+ };
712
+
713
+ stateVariableDefinitions.mathOperator = {
714
+ returnDependencies: () => ({
715
+ population: {
716
+ dependencyType: "stateVariable",
717
+ variableName: "population",
718
+ },
719
+ }),
720
+ definition: ({ dependencyValues }) => ({
721
+ setValue: {
722
+ mathOperator: function (inputs) {
723
+ return calculateSymbolicVariance(
724
+ inputs,
725
+ dependencyValues.population,
726
+ );
727
+ },
728
+ },
729
+ }),
730
+ };
731
+
732
+ return stateVariableDefinitions;
733
+ }
734
+ }
735
+
736
+ function calculateNumericVariance(inputs, population) {
737
+ let sum = 0,
738
+ variance = 0;
739
+ for (let num of inputs) {
740
+ sum += num;
741
+ variance += num * num;
742
+ }
743
+
744
+ let n = inputs.length;
745
+ // variance /= n;
746
+
747
+ variance -= sum ** 2 / n;
748
+
749
+ if (population) {
750
+ variance /= n;
751
+ } else {
752
+ variance /= n - 1;
753
+ }
754
+ return variance;
755
+ }
756
+
757
+ function calculateSymbolicVariance(inputs, population) {
758
+ let n = inputs.length;
759
+
760
+ let sum = inputs.reduce((a, c) => a.add(c));
761
+
762
+ let variance = inputs
763
+ .slice(1)
764
+ .reduce((a, c) => a.add(c.pow(2)), inputs[0].pow(2))
765
+ .subtract(sum.pow(2).divide(n));
766
+
767
+ if (population) {
768
+ variance = variance.divide(n);
769
+ } else {
770
+ variance = variance.divide(n - 1);
771
+ }
772
+
773
+ return variance;
774
+ }
775
+
776
+ export class StandardDeviation extends Variance {
777
+ static componentType = "standardDeviation";
778
+
779
+ static returnStateVariableDefinitions() {
780
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
781
+
782
+ stateVariableDefinitions.numericOperator.definition = ({
783
+ dependencyValues,
784
+ }) => ({
785
+ setValue: {
786
+ numericOperator: function (inputs) {
787
+ return Math.sqrt(
788
+ calculateNumericVariance(inputs, dependencyValues.population),
789
+ );
790
+ },
791
+ },
792
+ });
793
+
794
+ stateVariableDefinitions.mathOperator.definition = ({
795
+ dependencyValues,
796
+ }) => ({
797
+ setValue: {
798
+ mathOperator: function (inputs) {
799
+ return me.fromAst([
800
+ "apply",
801
+ "sqrt",
802
+ calculateSymbolicVariance(inputs, dependencyValues.population).tree,
803
+ ]);
804
+ },
805
+ },
806
+ });
807
+
808
+ return stateVariableDefinitions;
809
+ }
810
+ }
811
+
812
+ export class Count extends MathBaseOperator {
813
+ static componentType = "count";
814
+
815
+ static returnStateVariableDefinitions() {
816
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
817
+
818
+ stateVariableDefinitions.isNumericOperator = {
819
+ returnDependencies: () => ({}),
820
+ definition: () => ({ setValue: { isNumericOperator: true } }),
821
+ };
822
+
823
+ stateVariableDefinitions.numericOperator = {
824
+ returnDependencies: () => ({}),
825
+ definition: () => ({
826
+ setValue: {
827
+ numericOperator: function (inputs) {
828
+ return inputs.length;
829
+ },
830
+ },
831
+ }),
832
+ };
833
+
834
+ return stateVariableDefinitions;
835
+ }
836
+ }
837
+
838
+ export class Min extends MathBaseOperator {
839
+ static componentType = "min";
840
+
841
+ static returnStateVariableDefinitions() {
842
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
843
+
844
+ stateVariableDefinitions.numericOperator = {
845
+ returnDependencies: () => ({}),
846
+ definition: () => ({
847
+ setValue: {
848
+ numericOperator: function (inputs) {
849
+ return inputs.reduce((a, c) => Math.min(a, c), Infinity);
850
+ },
851
+ },
852
+ }),
853
+ };
854
+
855
+ stateVariableDefinitions.mathOperator = {
856
+ returnDependencies: () => ({}),
857
+ definition: () => ({
858
+ setValue: {
859
+ mathOperator: function (inputs) {
860
+ return me.fromAst([
861
+ "apply",
862
+ "min",
863
+ ["tuple", ...inputs.map((x) => x.tree)],
864
+ ]);
865
+ },
866
+ },
867
+ }),
868
+ };
869
+
870
+ stateVariableDefinitions.inverseMathOperator = {
871
+ returnDependencies: () => ({}),
872
+ definition: () => ({
873
+ setValue: {
874
+ inverseMathOperator: function ({ desiredValue, canBeModified }) {
875
+ // if have just one input that can be modified, set that one to desired value
876
+ if (canBeModified.filter((x) => x).length === 1) {
877
+ let inputNumber = canBeModified.indexOf(true);
878
+ if (inputNumber >= 0) {
879
+ return {
880
+ success: true,
881
+ inputValue: desiredValue,
882
+ inputNumber,
883
+ };
884
+ }
885
+ }
886
+ return { success: false };
887
+ },
888
+ },
889
+ }),
890
+ };
891
+
892
+ stateVariableDefinitions.inverseNumericOperator = {
893
+ returnDependencies: () => ({}),
894
+ definition: () => ({
895
+ setValue: {
896
+ inverseNumericOperator: function ({
897
+ desiredValue,
898
+ canBeModified,
899
+ desiredMathValue,
900
+ }) {
901
+ // if have just one input that can be modified, set that one to desired value
902
+ if (canBeModified.filter((x) => x).length === 1) {
903
+ let inputNumber = canBeModified.indexOf(true);
904
+ if (inputNumber >= 0) {
905
+ if (!Number.isFinite(desiredValue)) {
906
+ desiredValue = desiredMathValue;
907
+ }
908
+ return {
909
+ success: true,
910
+ inputValue: desiredValue,
911
+ inputNumber,
912
+ };
913
+ }
914
+ }
915
+ return { success: false };
916
+ },
917
+ },
918
+ }),
919
+ };
920
+
921
+ return stateVariableDefinitions;
922
+ }
923
+ }
924
+
925
+ export class Max extends MathBaseOperator {
926
+ static componentType = "max";
927
+
928
+ static returnStateVariableDefinitions() {
929
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
930
+
931
+ stateVariableDefinitions.numericOperator = {
932
+ returnDependencies: () => ({}),
933
+ definition: () => ({
934
+ setValue: {
935
+ numericOperator: function (inputs) {
936
+ return inputs.reduce((a, c) => Math.max(a, c), -Infinity);
937
+ },
938
+ },
939
+ }),
940
+ };
941
+
942
+ stateVariableDefinitions.mathOperator = {
943
+ returnDependencies: () => ({}),
944
+ definition: () => ({
945
+ setValue: {
946
+ mathOperator: function (inputs) {
947
+ return me.fromAst([
948
+ "apply",
949
+ "max",
950
+ ["tuple", ...inputs.map((x) => x.tree)],
951
+ ]);
952
+ },
953
+ },
954
+ }),
955
+ };
956
+
957
+ stateVariableDefinitions.inverseMathOperator = {
958
+ returnDependencies: () => ({}),
959
+ definition: () => ({
960
+ setValue: {
961
+ inverseMathOperator: function ({ desiredValue, canBeModified }) {
962
+ // if have just one input that can be modified, set that one to desired value
963
+ if (canBeModified.filter((x) => x).length === 1) {
964
+ let inputNumber = canBeModified.indexOf(true);
965
+ if (inputNumber >= 0) {
966
+ return {
967
+ success: true,
968
+ inputValue: desiredValue,
969
+ inputNumber,
970
+ };
971
+ }
972
+ }
973
+ return { success: false };
974
+ },
975
+ },
976
+ }),
977
+ };
978
+
979
+ stateVariableDefinitions.inverseNumericOperator = {
980
+ returnDependencies: () => ({}),
981
+ definition: () => ({
982
+ setValue: {
983
+ inverseNumericOperator: function ({
984
+ desiredValue,
985
+ canBeModified,
986
+ desiredMathValue,
987
+ }) {
988
+ // if have just one input that can be modified, set that one to desired value
989
+ if (canBeModified.filter((x) => x).length === 1) {
990
+ let inputNumber = canBeModified.indexOf(true);
991
+ if (inputNumber >= 0) {
992
+ if (!Number.isFinite(desiredValue)) {
993
+ desiredValue = desiredMathValue;
994
+ }
995
+ return {
996
+ success: true,
997
+ inputValue: desiredValue,
998
+ inputNumber,
999
+ };
1000
+ }
1001
+ }
1002
+ return { success: false };
1003
+ },
1004
+ },
1005
+ }),
1006
+ };
1007
+
1008
+ return stateVariableDefinitions;
1009
+ }
1010
+ }
1011
+
1012
+ export class Mod extends MathBaseOperator {
1013
+ static componentType = "mod";
1014
+
1015
+ static returnStateVariableDefinitions() {
1016
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
1017
+
1018
+ stateVariableDefinitions.numericOperator = {
1019
+ returnDependencies: () => ({}),
1020
+ definition: () => ({
1021
+ setValue: {
1022
+ numericOperator: function (inputs) {
1023
+ if (inputs.length !== 2) {
1024
+ return NaN;
1025
+ }
1026
+ return me.math.mod(inputs[0], inputs[1]);
1027
+ },
1028
+ },
1029
+ }),
1030
+ };
1031
+
1032
+ stateVariableDefinitions.mathOperator = {
1033
+ returnDependencies: () => ({}),
1034
+ definition: () => ({
1035
+ setValue: {
1036
+ mathOperator: function (inputs) {
1037
+ if (inputs.length !== 2) {
1038
+ return me.fromAst("\uff3f");
1039
+ }
1040
+ return me.fromAst([
1041
+ "apply",
1042
+ "mod",
1043
+ ["tuple", ...inputs.map((x) => x.tree)],
1044
+ ]);
1045
+ },
1046
+ },
1047
+ }),
1048
+ };
1049
+
1050
+ return stateVariableDefinitions;
1051
+ }
1052
+ }
1053
+
1054
+ export class Gcd extends MathBaseOperator {
1055
+ static componentType = "gcd";
1056
+
1057
+ static returnStateVariableDefinitions() {
1058
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
1059
+
1060
+ stateVariableDefinitions.numericOperator = {
1061
+ returnDependencies: () => ({}),
1062
+ definition: () => ({
1063
+ setValue: {
1064
+ numericOperator: function (inputs) {
1065
+ if (inputs.every(Number.isInteger)) {
1066
+ return gcd(...inputs);
1067
+ }
1068
+ return NaN;
1069
+ },
1070
+ },
1071
+ }),
1072
+ };
1073
+
1074
+ stateVariableDefinitions.mathOperator = {
1075
+ returnDependencies: () => ({}),
1076
+ definition: () => ({
1077
+ setValue: {
1078
+ mathOperator: function (inputs) {
1079
+ return me.fromAst([
1080
+ "apply",
1081
+ "gcd",
1082
+ ["tuple", ...inputs.map((x) => x.tree)],
1083
+ ]);
1084
+ },
1085
+ },
1086
+ }),
1087
+ };
1088
+
1089
+ return stateVariableDefinitions;
1090
+ }
1091
+ }
1092
+
1093
+ export class ExtractMath extends MathBaseOperatorOneInput {
1094
+ static componentType = "extractMath";
1095
+
1096
+ static createAttributesObject() {
1097
+ let attributes = super.createAttributesObject();
1098
+ attributes.type = {
1099
+ createComponentOfType: "text",
1100
+ createStateVariable: "type",
1101
+ defaultValue: null,
1102
+ toLowerCase: true,
1103
+ validValues: ["operand", "function", "functionargument", "numoperands"],
1104
+ };
1105
+ attributes.operandNumber = {
1106
+ createComponentOfType: "number",
1107
+ createStateVariable: "operandNumber",
1108
+ defaultValue: null,
1109
+ public: true,
1110
+ };
1111
+ attributes.argumentNumber = {
1112
+ createComponentOfType: "number",
1113
+ createStateVariable: "argumentNumber",
1114
+ defaultValue: null,
1115
+ public: true,
1116
+ };
1117
+ return attributes;
1118
+ }
1119
+
1120
+ static returnStateVariableDefinitions() {
1121
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
1122
+
1123
+ stateVariableDefinitions.mathOperator = {
1124
+ returnDependencies: () => ({
1125
+ type: {
1126
+ dependencyType: "stateVariable",
1127
+ variableName: "type",
1128
+ },
1129
+ operandNumber: {
1130
+ dependencyType: "stateVariable",
1131
+ variableName: "operandNumber",
1132
+ },
1133
+ argumentNumber: {
1134
+ dependencyType: "stateVariable",
1135
+ variableName: "argumentNumber",
1136
+ },
1137
+ }),
1138
+ definition({ dependencyValues }) {
1139
+ if (dependencyValues.type === "operand") {
1140
+ if (dependencyValues.operandNumber === null) {
1141
+ console.warn(
1142
+ `Must specify a operandNumber when extracting a math operand`,
1143
+ );
1144
+ return {
1145
+ setValue: {
1146
+ mathOperator: (_) => me.fromAst("\uff3f"),
1147
+ },
1148
+ };
1149
+ }
1150
+ return {
1151
+ setValue: {
1152
+ mathOperator: function (value) {
1153
+ let tree = value.tree;
1154
+
1155
+ if (!Array.isArray(tree)) {
1156
+ if (dependencyValues.operandNumber === 1) {
1157
+ return value;
1158
+ } else {
1159
+ return me.fromAst("\uff3f");
1160
+ }
1161
+ }
1162
+
1163
+ let operator = tree[0];
1164
+
1165
+ if (operator === "apply") {
1166
+ if (dependencyValues.operandNumber === 1) {
1167
+ return value;
1168
+ } else {
1169
+ return me.fromAst("\uff3f");
1170
+ }
1171
+ }
1172
+
1173
+ let operand = tree[dependencyValues.operandNumber];
1174
+
1175
+ if (operand === undefined) {
1176
+ return me.fromAst("\uff3f");
1177
+ } else {
1178
+ return me.fromAst(operand);
1179
+ }
1180
+ },
1181
+ },
1182
+ };
1183
+ } else if (dependencyValues.type === "function") {
1184
+ return {
1185
+ setValue: {
1186
+ mathOperator: function (value) {
1187
+ let tree = value.tree;
1188
+
1189
+ if (!Array.isArray(tree)) {
1190
+ return me.fromAst("\uff3f");
1191
+ }
1192
+
1193
+ let operator = tree[0];
1194
+
1195
+ if (operator !== "apply") {
1196
+ return me.fromAst("\uff3f");
1197
+ }
1198
+
1199
+ return me.fromAst(tree[1]);
1200
+ },
1201
+ },
1202
+ };
1203
+ } else if (dependencyValues.type === "functionargument") {
1204
+ return {
1205
+ setValue: {
1206
+ mathOperator: function (value) {
1207
+ let tree = value.tree;
1208
+
1209
+ if (!Array.isArray(tree)) {
1210
+ return me.fromAst("\uff3f");
1211
+ }
1212
+
1213
+ let operator = tree[0];
1214
+
1215
+ if (operator !== "apply") {
1216
+ return me.fromAst("\uff3f");
1217
+ }
1218
+
1219
+ let allArgs = tree[2];
1220
+
1221
+ if (dependencyValues.argumentNumber === null) {
1222
+ return me.fromAst(allArgs);
1223
+ } else if (dependencyValues.argumentNumber === 1) {
1224
+ if (!(Array.isArray(allArgs) && allArgs[0] === "tuple")) {
1225
+ return me.fromAst(allArgs);
1226
+ } else {
1227
+ return me.fromAst(allArgs[1]);
1228
+ }
1229
+ } else {
1230
+ if (!(Array.isArray(allArgs) && allArgs[0] === "tuple")) {
1231
+ return me.fromAst("\uff3f");
1232
+ } else {
1233
+ let theArg = allArgs[dependencyValues.argumentNumber];
1234
+ if (theArg === undefined) {
1235
+ return me.fromAst("\uff3f");
1236
+ } else {
1237
+ return me.fromAst(theArg);
1238
+ }
1239
+ }
1240
+ }
1241
+ },
1242
+ },
1243
+ };
1244
+ } else if (dependencyValues.type === "numoperands") {
1245
+ return {
1246
+ setValue: {
1247
+ mathOperator: function (value) {
1248
+ let tree = value.tree;
1249
+
1250
+ if (!Array.isArray(tree)) {
1251
+ return me.fromAst(1);
1252
+ }
1253
+
1254
+ let operator = tree[0];
1255
+
1256
+ if (operator === "apply") {
1257
+ return me.fromAst(1);
1258
+ }
1259
+
1260
+ return me.fromAst(tree.length - 1);
1261
+ },
1262
+ },
1263
+ };
1264
+ } else {
1265
+ return {
1266
+ setValue: {
1267
+ mathOperator: (_) => me.fromAst("_"),
1268
+ },
1269
+ };
1270
+ }
1271
+ },
1272
+ };
1273
+
1274
+ return stateVariableDefinitions;
1275
+ }
1276
+ }
1277
+
1278
+ function gcd(x, y, ...z) {
1279
+ if (!y && z.length > 0) {
1280
+ return gcd(x, ...z);
1281
+ }
1282
+ if (!y) {
1283
+ return x;
1284
+ }
1285
+ return gcd(y, x % y, ...z);
1286
+ }