From a28b16edea4b9aaad3536635cc4fcb09698e8557 Mon Sep 17 00:00:00 2001 From: 28left <28left@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:40:19 -0500 Subject: [PATCH] 0.6.2 build --- dist/cyllene-0.6.2-py3-none-any.whl | Bin 0 -> 52510 bytes dist/cyllene-0.6.2.tar.gz | Bin 0 -> 38691 bytes pyproject.toml | 2 +- src/cyllene.egg-info/PKG-INFO | 9 +- src/cyllene.egg-info/SOURCES.txt | 2 + .../math_cmds-checkpoint.py | 44 -- .../math_compare-checkpoint.py | 110 ----- .../math_define-checkpoint.py | 228 ----------- .../math_functionclass-checkpoint.py | 79 ---- .../math_randomfunction-checkpoint.py | 253 ------------ .../__pycache__/math_cmds.cpython-310.pyc | Bin 1299 -> 0 bytes .../__pycache__/math_cmds.cpython-311.pyc | Bin 1880 -> 0 bytes .../__pycache__/math_cmds.cpython-39.pyc | Bin 1291 -> 0 bytes .../__pycache__/math_compare.cpython-310.pyc | Bin 1894 -> 0 bytes .../__pycache__/math_compare.cpython-311.pyc | Bin 4354 -> 0 bytes .../__pycache__/math_define.cpython-310.pyc | Bin 3352 -> 0 bytes .../__pycache__/math_define.cpython-311.pyc | Bin 5042 -> 0 bytes .../__pycache__/math_define.cpython-39.pyc | Bin 3360 -> 0 bytes .../math_functionclass.cpython-310.pyc | Bin 1387 -> 0 bytes .../math_functionclass.cpython-311.pyc | Bin 2184 -> 0 bytes .../math_functionclass.cpython-39.pyc | Bin 1383 -> 0 bytes .../__pycache__/math_helpers.cpython-310.pyc | Bin 3706 -> 0 bytes .../__pycache__/math_helpers.cpython-311.pyc | Bin 6025 -> 0 bytes .../__pycache__/math_listform.cpython-310.pyc | Bin 3894 -> 0 bytes .../__pycache__/math_listform.cpython-311.pyc | Bin 7259 -> 0 bytes .../__pycache__/math_listform.cpython-39.pyc | Bin 3750 -> 0 bytes .../math_randomfunction.cpython-310.pyc | Bin 5415 -> 0 bytes .../math_randomfunction.cpython-311.pyc | Bin 10524 -> 0 bytes .../math_randomfunction.cpython-39.pyc | Bin 5467 -> 0 bytes .../math_rfunction.cpython-310.pyc | Bin 4190 -> 0 bytes .../__pycache__/math_string.cpython-310.pyc | Bin 11300 -> 0 bytes .../__pycache__/math_string.cpython-311.pyc | Bin 20159 -> 0 bytes src/cyllene/MathFunctions/math_plot.py | 42 ++ .../MathFunctions/math_randomfunction.py | 6 +- .../MathFunctions/math_randomrational.py | 107 +++++ src/cyllene/MathFunctions/math_rfunction.py | 50 ++- .../problem_basic-checkpoint.py | 72 ---- .../problem_instantiator-checkpoint.py | 36 -- .../problem_parameter-checkpoint.py | 68 --- .../problem_substitution-checkpoint.py | 61 --- .../__pycache__/problem_aux.cpython-310.pyc | Bin 3847 -> 0 bytes .../__pycache__/problem_aux.cpython-311.pyc | Bin 7139 -> 0 bytes .../__pycache__/problem_aux.cpython-39.pyc | Bin 2808 -> 0 bytes .../__pycache__/problem_basic.cpython-310.pyc | Bin 4192 -> 0 bytes .../__pycache__/problem_basic.cpython-311.pyc | Bin 6735 -> 0 bytes .../__pycache__/problem_basic.cpython-39.pyc | Bin 2874 -> 0 bytes .../problem_handler.cpython-310.pyc | Bin 1336 -> 0 bytes .../problem_handler.cpython-311.pyc | Bin 2065 -> 0 bytes .../problem_instantiator.cpython-310.pyc | Bin 1737 -> 0 bytes .../problem_instantiator.cpython-311.pyc | Bin 2476 -> 0 bytes .../problem_instantiator.cpython-39.pyc | Bin 1567 -> 0 bytes .../problem_parameter.cpython-310.pyc | Bin 3859 -> 0 bytes .../problem_parameter.cpython-311.pyc | Bin 6586 -> 0 bytes .../problem_parameter.cpython-39.pyc | Bin 3544 -> 0 bytes ...roblem_parametermultchoice.cpython-310.pyc | Bin 2031 -> 0 bytes ...roblem_parametermultchoice.cpython-311.pyc | Bin 3432 -> 0 bytes ...problem_parametermultchoice.cpython-39.pyc | Bin 1959 -> 0 bytes .../problem_substitution.cpython-310.pyc | Bin 1534 -> 0 bytes .../problem_substitution.cpython-311.pyc | Bin 2452 -> 0 bytes .../problem_substitution.cpython-39.pyc | Bin 1525 -> 0 bytes src/cyllene/MathProblems/problem_basic.py | 55 +++ .../.ipynb_checkpoints/parser-checkpoint.py | 223 ---------- .../parser_webassign-checkpoint.py | 387 ------------------ .../__pycache__/parser.cpython-310.pyc | Bin 3760 -> 0 bytes .../__pycache__/parser.cpython-311.pyc | Bin 6212 -> 0 bytes .../__pycache__/parser.cpython-39.pyc | Bin 3778 -> 0 bytes .../parser_webassign.cpython-310.pyc | Bin 3961 -> 0 bytes .../parser_webassign_new.cpython-310.pyc | Bin 5008 -> 0 bytes .../parser_webassign_new.cpython-311.pyc | Bin 9478 -> 0 bytes .../parser_webassign_new.cpython-39.pyc | Bin 4780 -> 0 bytes .../problem_txtqti.cpython-310.pyc | Bin 2488 -> 0 bytes .../problem_txtqti.cpython-311.pyc | Bin 4296 -> 0 bytes .../__pycache__/problem_txtqti.cpython-39.pyc | Bin 2478 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 339 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 538 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 281 -> 0 bytes .../aux/__pycache__/helpers.cpython-310.pyc | Bin 2098 -> 0 bytes .../aux/__pycache__/helpers.cpython-311.pyc | Bin 3004 -> 0 bytes .../aux/__pycache__/helpers.cpython-39.pyc | Bin 2088 -> 0 bytes .../input_transform.cpython-310.pyc | Bin 867 -> 0 bytes .../input_transform.cpython-311.pyc | Bin 1359 -> 0 bytes .../problem_magics.cpython-310.pyc | Bin 1387 -> 0 bytes .../problem_magics.cpython-311.pyc | Bin 2476 -> 0 bytes .../__pycache__/problem_magics.cpython-39.pyc | Bin 1381 -> 0 bytes .../__pycache__/function_cmds.cpython-310.pyc | Bin 228 -> 0 bytes .../__pycache__/problem_cmds.cpython-310.pyc | Bin 2430 -> 0 bytes .../__pycache__/problem_cmds.cpython-311.pyc | Bin 3654 -> 0 bytes .../__pycache__/problem_cmds.cpython-39.pyc | Bin 2188 -> 0 bytes .../__pycache__/problem_stack.cpython-310.pyc | Bin 1382 -> 0 bytes .../__pycache__/problem_stack.cpython-311.pyc | Bin 2018 -> 0 bytes .../__pycache__/problem_stack.cpython-39.pyc | Bin 1382 -> 0 bytes .../vue_problem_basic.cpython-310.pyc | Bin 6736 -> 0 bytes .../vue_problem_basic.cpython-311.pyc | Bin 13251 -> 0 bytes .../vue_problem_parameter.cpython-310.pyc | Bin 3650 -> 0 bytes .../vue_problem_parameter.cpython-311.pyc | Bin 6846 -> 0 bytes .../__pycache__/widget_viewer.cpython-310.pyc | Bin 5398 -> 0 bytes .../__pycache__/widgets_aux.cpython-310.pyc | Bin 929 -> 0 bytes .../__pycache__/widgets_aux.cpython-311.pyc | Bin 1509 -> 0 bytes .../__pycache__/widgets_aux.cpython-39.pyc | Bin 518 -> 0 bytes .../widgets_problem_basic.cpython-310.pyc | Bin 5086 -> 0 bytes .../widgets_problem_basic.cpython-311.pyc | Bin 10189 -> 0 bytes .../widgets_problem_basic.cpython-39.pyc | Bin 4297 -> 0 bytes .../widgets_problem_param.cpython-310.pyc | Bin 3173 -> 0 bytes .../widgets_problem_param.cpython-311.pyc | Bin 6160 -> 0 bytes .../widgets_problem_param.cpython-39.pyc | Bin 3046 -> 0 bytes 105 files changed, 267 insertions(+), 1567 deletions(-) create mode 100644 dist/cyllene-0.6.2-py3-none-any.whl create mode 100644 dist/cyllene-0.6.2.tar.gz delete mode 100644 src/cyllene/MathFunctions/.ipynb_checkpoints/math_cmds-checkpoint.py delete mode 100644 src/cyllene/MathFunctions/.ipynb_checkpoints/math_compare-checkpoint.py delete mode 100644 src/cyllene/MathFunctions/.ipynb_checkpoints/math_define-checkpoint.py delete mode 100644 src/cyllene/MathFunctions/.ipynb_checkpoints/math_functionclass-checkpoint.py delete mode 100644 src/cyllene/MathFunctions/.ipynb_checkpoints/math_randomfunction-checkpoint.py delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-39.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_compare.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_compare.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_define.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_define.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_define.cpython-39.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-39.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_helpers.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_helpers.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_listform.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_listform.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_listform.cpython-39.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_randomfunction.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_randomfunction.cpython-311.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_randomfunction.cpython-39.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_rfunction.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_string.cpython-310.pyc delete mode 100644 src/cyllene/MathFunctions/__pycache__/math_string.cpython-311.pyc create mode 100644 src/cyllene/MathFunctions/math_plot.py create mode 100644 src/cyllene/MathFunctions/math_randomrational.py delete mode 100644 src/cyllene/MathProblems/.ipynb_checkpoints/problem_basic-checkpoint.py delete mode 100644 src/cyllene/MathProblems/.ipynb_checkpoints/problem_instantiator-checkpoint.py delete mode 100644 src/cyllene/MathProblems/.ipynb_checkpoints/problem_parameter-checkpoint.py delete mode 100644 src/cyllene/MathProblems/.ipynb_checkpoints/problem_substitution-checkpoint.py delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_aux.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_aux.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_aux.cpython-39.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_basic.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_basic.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_basic.cpython-39.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_handler.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_handler.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-39.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_parameter.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_parameter.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_parameter.cpython-39.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_parametermultchoice.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_parametermultchoice.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_parametermultchoice.cpython-39.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_substitution.cpython-310.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_substitution.cpython-311.pyc delete mode 100644 src/cyllene/MathProblems/__pycache__/problem_substitution.cpython-39.pyc delete mode 100644 src/cyllene/ProblemParser/.ipynb_checkpoints/parser-checkpoint.py delete mode 100644 src/cyllene/ProblemParser/.ipynb_checkpoints/parser_webassign-checkpoint.py delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser.cpython-310.pyc delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser.cpython-311.pyc delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser.cpython-39.pyc delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser_webassign.cpython-310.pyc delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser_webassign_new.cpython-310.pyc delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser_webassign_new.cpython-311.pyc delete mode 100644 src/cyllene/ProblemParser/__pycache__/parser_webassign_new.cpython-39.pyc delete mode 100644 src/cyllene/QTI/__pycache__/problem_txtqti.cpython-310.pyc delete mode 100644 src/cyllene/QTI/__pycache__/problem_txtqti.cpython-311.pyc delete mode 100644 src/cyllene/QTI/__pycache__/problem_txtqti.cpython-39.pyc delete mode 100644 src/cyllene/__pycache__/__init__.cpython-310.pyc delete mode 100644 src/cyllene/__pycache__/__init__.cpython-311.pyc delete mode 100644 src/cyllene/__pycache__/__init__.cpython-39.pyc delete mode 100644 src/cyllene/aux/__pycache__/helpers.cpython-310.pyc delete mode 100644 src/cyllene/aux/__pycache__/helpers.cpython-311.pyc delete mode 100644 src/cyllene/aux/__pycache__/helpers.cpython-39.pyc delete mode 100644 src/cyllene/aux/__pycache__/input_transform.cpython-310.pyc delete mode 100644 src/cyllene/aux/__pycache__/input_transform.cpython-311.pyc delete mode 100644 src/cyllene/magics/__pycache__/problem_magics.cpython-310.pyc delete mode 100644 src/cyllene/magics/__pycache__/problem_magics.cpython-311.pyc delete mode 100644 src/cyllene/magics/__pycache__/problem_magics.cpython-39.pyc delete mode 100644 src/cyllene/user/__pycache__/function_cmds.cpython-310.pyc delete mode 100644 src/cyllene/user/__pycache__/problem_cmds.cpython-310.pyc delete mode 100644 src/cyllene/user/__pycache__/problem_cmds.cpython-311.pyc delete mode 100644 src/cyllene/user/__pycache__/problem_cmds.cpython-39.pyc delete mode 100644 src/cyllene/user/__pycache__/problem_stack.cpython-310.pyc delete mode 100644 src/cyllene/user/__pycache__/problem_stack.cpython-311.pyc delete mode 100644 src/cyllene/user/__pycache__/problem_stack.cpython-39.pyc delete mode 100644 src/cyllene/widgets/__pycache__/vue_problem_basic.cpython-310.pyc delete mode 100644 src/cyllene/widgets/__pycache__/vue_problem_basic.cpython-311.pyc delete mode 100644 src/cyllene/widgets/__pycache__/vue_problem_parameter.cpython-310.pyc delete mode 100644 src/cyllene/widgets/__pycache__/vue_problem_parameter.cpython-311.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widget_viewer.cpython-310.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_aux.cpython-310.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_aux.cpython-311.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_aux.cpython-39.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_problem_basic.cpython-310.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_problem_basic.cpython-311.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_problem_basic.cpython-39.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_problem_param.cpython-310.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_problem_param.cpython-311.pyc delete mode 100644 src/cyllene/widgets/__pycache__/widgets_problem_param.cpython-39.pyc diff --git a/dist/cyllene-0.6.2-py3-none-any.whl b/dist/cyllene-0.6.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..85df0020e221cc3b6e2037957cb7fff15724bf71 GIT binary patch literal 52510 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 M0GqncZ9m@qKcr*6asU7T literal 0 HcmV?d00001 diff --git a/dist/cyllene-0.6.2.tar.gz b/dist/cyllene-0.6.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a54354ea1be5a2d04c3f0bbe063d5c1d3eceb88d GIT binary patch literal 38691 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 z zVE@(YZEnH+zq!`wZGkNq`2Y9Z{r_FqfAO1t8EddAX%oLMLn_U&Yk5!mmI`mqzvj!F z?#nHvtb*SnozGpHLFq+R8I~D1OMNG6-O@Ozl1axBRHxlpK@s*9!O17ku&*eT`56`e zL2EWjyxC>@C5>pc3o|9=4Y$5HS>iG#DY`X^WsHk6F8t*w>Z+S8mF26ujk~MBqGAbg zk?$No+N@5k_nW^=QK2Va-Qv+e!klT5GgP@(LzTa&VM?J*sLk=u)S;9KB}yhos)KbY zh1#SUDmwE=R0RlqQu@RMC`YKAteC|ms$M3LbhuixYqQ$ zg-*VPyxJB+c$x5|cN9i@X@iC=f~OG=;VX!3YhNqoL4lO^3t|~8bL14qr?~BjRAFn~ za@#Cprs3jwI{6R#tgYweKRqY^xfl7*VTEpT>})+=Z*Q%yZEbFCxefLs%YWLz z#l=W39Kb)!XdS{l7(j{u|kF@*gMvcjx~-$^WzS-^u^o z`LCS+um9(l)%}C#hhMb+OXUA+^wd|*f4cvBot}&Td_SL8LFz*Sj8!hL+$Oztw|3x9 zf^EVvp(bA;lGKjp6A)K#3$+26QSQ*c2#}?pP)1zJ#r-*b4;uU0E`D1LCVn{HCjaeE z$q}1u@)Mo-HlO+bnkDmgFq%KDy`(($G@&rO+CL%uN8Tf1FPh!NV1G@#VUtj->8VZU z%fAldNtnP`NSKhzAP&xMK-4>>JZg)a$3Xz5Y{N@Gz6e@q!aKboGdg-&Av%NfC?F#D z$&mId8>KbUOWIr#ou}87i)KbaNfHf1A4JKcXgCK6h>!jd=iwM^nZV|*e#~pso7mYX z@W+|m%oOeNL=oi2DW?p^9BCY)C2@-u8jj~YQZjoz4ksb+36mwkj#=;;B1$!#5{{mN?oyIQfkn zJ}0{ezmfmhKX}$6{r`P^)IUBZhexu>{a3GF?)T}t{e!)iZ=UTR{6c=F^$!l|#@VOa zhc&TGpNb0 zFZ%Eb`roDh_D=Q>4`6tEhX*G|^k<8X{^&$D@$3F^zeRSB_K#tro*x~)$_5V8PHP@w zW3>K3pS1={qOTk+0>9rJ_hrN6S%3E>ZSxo^t3wx+6l~Z7d46~v2JyBy+{pGeIXvDc zyEA%tUQx{3*3Uk*%Ii3yht^~QyWpiiy_mz{OUtw4c!{F$ZLM|`{4o#dxw6V0Zj+}w zYwahsXPHK8b&rKcSUtI!(K8vOa*w29mqWPvoStlSIQx73gX4bI=reknuqwSj((vg{ zr@cW5OyhMp!>*t1JZ`UB-*Ql;V=Eo3R9){JS1IxG0 z^HD6OP^A=M?xLuAKz_@Dk=3uRsrunMo7}O(shH zZ&nIUn&2#oJ|y1=jqUh9$NxG0&+&gH{NM56o1?w{aXbB(ejWaAt=Bd9zpjh_a8Dn3 zU-x&Pz3R6oqZ++0;|NIZb{b8_wIoRAvo_^-RNFvdpJP1F%M5CZFv?zlMOqD}!sZpW3$L3P#QnyZkfp=xV8tw$tW=gYbzE_z%`{p$q^clRVXO@ zL($fwLix*J3~W_}lHj66S@TJSqO)<7Rw%|?Luzy55esK=N$zG`sVob4OIgb_s#ZaoPcBzF%U)Hf9A7 zewp|e;V_#H_R}l`!HgdX License: MIT License @@ -31,6 +31,13 @@ Classifier: Programming Language :: Python :: 3 Requires-Python: >=3.9 Description-Content-Type: text/markdown License-File: LICENSE +Requires-Dist: text2qti>=0.5.0 +Requires-Dist: ipython>=8.4.0 +Requires-Dist: ipywidgets>=8.0.1 +Requires-Dist: sympy>=1.10.1 +Requires-Dist: pyparsing>=3.0.9 +Requires-Dist: ipyvuetify>=1.8.2 +Requires-Dist: py-asciimath>=0.3.0 # mathwithjupyter Teaching math (and more) with Jupyter notebooks diff --git a/src/cyllene.egg-info/SOURCES.txt b/src/cyllene.egg-info/SOURCES.txt index 1219f4c..1186fa9 100644 --- a/src/cyllene.egg-info/SOURCES.txt +++ b/src/cyllene.egg-info/SOURCES.txt @@ -14,7 +14,9 @@ src/cyllene/MathFunctions/math_define.py src/cyllene/MathFunctions/math_functionclass.py src/cyllene/MathFunctions/math_helpers.py src/cyllene/MathFunctions/math_listform.py +src/cyllene/MathFunctions/math_plot.py src/cyllene/MathFunctions/math_randomfunction.py +src/cyllene/MathFunctions/math_randomrational.py src/cyllene/MathFunctions/math_rfunction.py src/cyllene/MathFunctions/math_string.py src/cyllene/MathFunctions/math_table.py diff --git a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_cmds-checkpoint.py b/src/cyllene/MathFunctions/.ipynb_checkpoints/math_cmds-checkpoint.py deleted file mode 100644 index 37e2fa6..0000000 --- a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_cmds-checkpoint.py +++ /dev/null @@ -1,44 +0,0 @@ -from .math_functionclass import Function -from .math_define import FUNCTION_LIST - - -def function(expr): - """ - Defines a function based on a syntax check - and a Function object, using lambda operator. - Returns a pure function. - """ - func = Function(expr) - - if func.is_defined: - return func.lambda_form - # return lambda x: func.eval_at(x) - - else: - issues_report = "".join( - [ - "\t" + str(i + 1) + ". " + func.issues[i] + "\n" - for i in range(len(func.issues)) - ] - ) - print("Problems encountered:\n" + issues_report) - return None - # raise ValueError('Problems encountered:\n'+issues_report) - - -def random_function(arg="random"): - """ - Pick a function at random. - One of the folliwing types can be specified: - 'const', 'linear', 'quadratic', 'cubic', 'squareroot', - 'cubicroot', 'rational', 'exp', 'tri', 'log', 'comp', - 'random' - """ - if arg in FUNCTION_LIST: - func = Function(arg) - else: - func = Function("random") - - return func.lambda_form - - # return lambda x: func.eval_at(x) diff --git a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_compare-checkpoint.py b/src/cyllene/MathFunctions/.ipynb_checkpoints/math_compare-checkpoint.py deleted file mode 100644 index 0f3b339..0000000 --- a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_compare-checkpoint.py +++ /dev/null @@ -1,110 +0,0 @@ -import sympy as sp - -from .math_helpers import get_variables - - -def compare_functions(func_1, func_2, mode="full"): - """ - check whether two sympy expressions are equivalent - """ - - # if both expressions are numbers, simply check for equality - if isinstance(func_1, sp.core.numbers.Number) and isinstance(func_2, sp.core.numbers.Number): - return func_1 == func_2 - - # get variables - var_1 = get_variables(func_1) - var_2 = get_variables(func_2) - - # if the functions have different number of free symbols, stop right away - if len(var_1) != len(var_2): - return False - - # first check whether they are literally equal - if func_1 == func_2: - return True - - elif mode == "strict": - return False - - # if mode is "terms", check whether they have the same terms - - # decompose both functions into terms - f = func_1.as_terms() - g = func_2.as_terms() - - # if number of terms different but we require equal terms, return False - if len(f[0]) != len(g[0]): - - if mode == 'terms': - return False - - else: - # generate lists of terms - f_terms = [sp.sympify(f[0][i][0]) for i in range(len(f[0]))] - g_terms = [sp.sympify(g[0][i][0]) for i in range(len(f[0]))] - - # loop through terms and try to find match - num = len(f[0]) - for i in range(len(f[0])): - if num == 0: - return True - for j in range(num): - if sp.simplify(f_terms[i] - g_terms[j]) == 0: - num = num - 1 - del g_terms[j] - break - else: - pass - - # all terms have matches - if num == 0: - return True - - # if we haven't returned True so far and mode is 'terms', return False - if mode == "terms": - return False - - # Now check whether Sympy can simplify difference to 0 - if sp.simplify((func_1 - func_2).expand(force=True)) == 0: - return True - - # If mode is 'symbolic', this is all we can do - if mode == 'symbolic': - return False - - # Finally, perform a numerical test for equality. - # Test 2000 equidistant points. - if len(var_1) == 0: - try: - if float(func_1) == float(func_2): - return True - except: - return False - - elif len(var_1) == 1: - d1 = sp.calculus.util.continuous_domain(func_1, var_1[0], sp.S.Reals) - d2 = sp.calculus.util.continuous_domain(func_2, var_2[0], sp.S.Reals) - if d1 != d2: - return False - inf = d1.inf - sup = d1.sup - if inf == -sp.oo: - inf = -100 - if sup == sp.oo: - sup = 100 - sample = [] - h = (sup - inf) / 2000 - for i in range(2000): - p = inf + (i * h) - if d1.contains(p): - sample.append(p) - if func_1.subs(var_1[0], p) != func_2.subs(var_2[0], p): - return False - if len(sample) > 500: - return True - - """ - Not able to detect any difference between the functions. - """ - return "undecided" diff --git a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_define-checkpoint.py b/src/cyllene/MathFunctions/.ipynb_checkpoints/math_define-checkpoint.py deleted file mode 100644 index c76775b..0000000 --- a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_define-checkpoint.py +++ /dev/null @@ -1,228 +0,0 @@ -import sympy as sp -from sympy.parsing.sympy_parser import ( - parse_expr, - standard_transformations, - implicit_multiplication_application, - convert_xor, -) -import random -from .math_randomfunction import set_function_random - -FUNCTION_LIST = [ - "const", - "linear", - "quadratic", - "cubic", - "squareroot", - "cubicroot", - "rational", - "exp", - "tri", - "log", - "comp", - "random", -] - -# Reserve some (real-valued) symbols in Sympy -a, b, c, d, p, q, r, s, t, w, x, y, z = sp.symbols( - 'a b c d p q r s t w x y z', real=True) - - -def define_expression(expr, mylocals=None, eval_mode=False): - """ - sympify an input and return a sympy expression - together with a list of issues (optional, possibly empty) - - parameters: - eval_mode (Boolean): should sympify try to evaluate expression - return_issues (Boolean): should list of issues during syntax check - be returned - - Valid arguments - - a string - - a constant - - a sympy expression - - The string can be a math string or one of the following expression types: - 'const', 'linear', 'quadratic', 'cubic', 'squareroot', - 'cubicroot', 'rational', 'exp', 'tri', 'log', 'comp', 'monomial' - - One can also pass 'random' to pick an expression randomly. - """ - # const, step, exp, trig, poly, linear, quadratic, cubic, sqrt, cbrt = sp.symbols( - # 'const,step,exp,trig,poly,linear,quadratic,cubic,sqrt,cbrt', cls=sp.Function - # ) - - if expr in FUNCTION_LIST: - - # First check whether string argument is a keyword - if expr == "random": - expr = random.choice( - [ - "const", - "linear", - "quadratic", - "cubic", - "squareroot", - "cubicroot", - "rational", - "comp", - "exp", - "tri", - "log", - ] - ) - - if expr == "comp": - comp = [ - random.choice( - [ - "const", - "linear", - "quadratic", - "cubic", - "squareroot", - "cubicroot", - "rational", - "exp", - "tri", - "log", - ] - ) - for i in range(2) - ] - new_expr = sp.sympify( - set_function_random("comp", comp[0], comp[1])) - - else: - new_expr = sp.sympify( - set_function_random(expr), locals=mylocals) - - expr_ok = True - issues = [] - - elif isinstance(expr, sp.Basic): - # if expr is Sympy type, skip syntax check - expr_ok = True - new_expr = expr - issues = [] - - elif isinstance(expr, (int, float)): - # if expr is numerical, directly sympify - expr_ok = True - new_expr = sp.sympify(expr, locals=mylocals, evaluate=eval_mode) - issues = [] - - elif isinstance(expr, str): - - # try: - # # if input can be turned into number, do this to avoid - # # weird sympy bug - # if '1/' in expr: - # # force sympy to ev - # check = [Fraction(expr), True, []] - # elif '.' in expr: - # # has decimal point, try float conversion - # check = [float(expr), True, []] - # else: - # # check integer - # check = [int(expr), True, []] - - # except ValueError: - # # check syntax of expr; - # # returns triple: - # # ['sanitized' string, compilable flag (boolean), issues list] - - try: - - new_expr = parse_expr( - expr, - local_dict=mylocals, - transformations=standard_transformations - + ( - convert_xor, - implicit_multiplication_application, - ), - evaluate=False, - ) - - # new_expr = sp.sympify(expr, locals=mylocals) - expr_ok = True - - except: - expr_ok = False - issues = ["invalid syntax"] - - # check = ms.check_syntax(expr) - - # print(check) - - # if check[1]: - # try: - # new_expr = sp.sympify( - # check[0], locals=mylocals, evaluate=eval_mode) - # if new_expr.is_real: - # # if input is number, evaluate - # new_expr = sp.sympify( - # check[0], locals=mylocals, evaluate=True) - # expr_ok = True - # issues = [] - - # except: - # expr_ok = False - # issues = ["invalid syntax"] - - # else: - # # check_syntax discovered issues - # expr_ok = False - # issues = check[2] - - else: - # argument expr is not of the right type - expr_ok = False - issues = ["unknown input format"] - - if expr_ok: - return new_expr, [] - else: - return None, issues - - -def define_function(expr, mode="numerical"): - """ - sympify an expression and return a function evaluating this expression, - together with a list of issues (optional, possibly empty) - - This uses SymPy's lambdify function. - - parameters: - eval_mode (Boolean): should sympify try to evaluate expression - return_issues (Boolean): should list of issues during syntax check - be returned - """ - - [func, issues] = define_expression(expr, eval_mode=True) - - if func: - if mode == "numerical": - if len(func.free_symbols) > 0: - # if there free symbols in func, use the first as the function var - return sp.lambdify([func.free_symbols.pop()], func) - # return lambda u: func.evalf(subs={x, u}, n=5) - else: - # otherwise any symbol will do - return sp.lambdify([x], func) - # return lambda u: func.evalf(subs={x, u}, n=5) - - else: - if len(func.free_symbols) > 0: - # if there free symbols in func, use the first as the function var - # return sp.lambdify(func.free_symbols.pop(), func) - return lambda u: func.subs(func.free_symbols.pop(), u) - else: - # otherwise any symbol will do - # return sp.lambdify(x, func) - return lambda u: func.subs(x, u) - - else: - return None diff --git a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_functionclass-checkpoint.py b/src/cyllene/MathFunctions/.ipynb_checkpoints/math_functionclass-checkpoint.py deleted file mode 100644 index a247d4b..0000000 --- a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_functionclass-checkpoint.py +++ /dev/null @@ -1,79 +0,0 @@ -import sympy as sp - -from .math_listform import string_to_list -from .math_define import define_expression - - -class Function: - - """ - Basic class to represent a single-variable, real-valued - function. Every function has four basic attributes: - - sympy expression - - tree form - - table - - graph - """ - - def __init__(self, expr, variable="x", mylocals=None): - - self.variable = sp.Symbol(variable, real=True) - self.locals = mylocals - - # try: - - # parse_expr(expr, - # transformations=standard_transformations+(convert_xor,implicit_multiplication_application,), - # evaluate=False) - - # new_expr = sp.sympify(expr, locals=self.locals) - # self.is_defined = True - - # except: - # new_expr = sp.sympify(0) - - [new_expr, self.issues] = define_expression( - expr, mylocals=self.locals, eval_mode=True - ) - - if new_expr: - # input ok - self.is_defined = True - else: - # Initialize zero function and set flag - self.is_defined = False - new_expr = sp.sympify(0) - - # Initialize all basic function attributes - self.sym_form = new_expr - self.str_form = str(new_expr).replace("**", "^") - self.list_form = string_to_list(self.str_form) - self.tex_form = sp.latex(self.sym_form) - self.table_form = {} - # self.graph_form = plt.figure() - - # initialize further attributes of a function - # variables = fa.get_variables(self.sym_form) - # string_variables = [str(var) for var in variables] - # string_variables.sort() - # self.variables = [MYLOCALS_LAMBDA[var_string] for var_string in string_variables] # do this to sort variables alphabetically - - # self.variables = fa.get_variables(self.sym_form) - self.lambda_form = sp.lambdify( - self.variable, self.sym_form, modules="sympy") - - # parameters for piecewise functions (currently not activated) - # self.breakpoints = {} - # self.functions = {} - # self.right_endpoints = {} - - # get the domain - """ - get_domain method from sympy does not seem stable currently - (as of Nov 15, 2020) -- disabled for now - """ - # self.domain = fa.get_domain(self.sym_form) - - def __add__(a, b): - c = Function(a.sym_form + b.sym_form) - return c diff --git a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_randomfunction-checkpoint.py b/src/cyllene/MathFunctions/.ipynb_checkpoints/math_randomfunction-checkpoint.py deleted file mode 100644 index 4143bc7..0000000 --- a/src/cyllene/MathFunctions/.ipynb_checkpoints/math_randomfunction-checkpoint.py +++ /dev/null @@ -1,253 +0,0 @@ -import random -import sympy as sp - -# Reserve some (real-valued) symbols in Sympy -a, b, c, d, p, q, r, s, t, w, x, y, z = sp.symbols( - 'a b c d p q r s t w x y z', real=True) - -# Basic library of specific functions -RANDOM_FUNC_LIST = [ - ['2x+1', 'linear'], ['3x-1', 'linear'], ['(1/2)*x+3', 'linear'], - ['x+5', 'linear'], ['x-3', 'linear'], ['-x+4', - 'linear'], ['(1/4)*x-1', 'linear'], - ['6t', 'linear'], ['2-6t', 'linear'], ['(1/3)*x+2', 'linear'], - ['(1/4)*x+3', 'linear'], ['(1/5)*x+4', 'linear'], ['(1/6)*x+5', 'linear'], - ['(1/7)*x+6', 'linear'], ['(1/8)*x+7', 'linear'], ['(1/9)*x+8', 'linear'], - ['(1/2)*(x**2)', 'quadratic'], ['3*(x**2)+7*x+1', 'quadratic'], - ['6*(x**2)-8*x+3', 'quadratic'], ['3*(x**2)+5', - 'quadratic'], ['(2*x+1)^2', 'quadratic'], - ['(x+3)^2', 'quadratic'], ['(1/6)*(x**2)+1/2', 'quadratic'], - ['(1/3)*x^2 +2x+1', 'quadratic'], ['(1/4)*(x**2)+2*x+1', 'quadratic'], - ['(1/5)*(x**2)+4*x', 'quadratic'], ['(1/7)*x^2+3x-2', 'quadratic'], - ['x**3 + 5*x -12 ', - 'cubic'], ['x**3-3*(x**2)+5*x', 'cubic'], ['4*(x**3)-2', 'cubic'], - ['2*(x**3)-3*(x**2)+1', 'cubic'], ['x**3+x', 'cubic'], - ['x**3-8', 'cubic'], ['-2*x^3-3', 'cubic'], ['-4*x^3+1', 'cubic'], - ['4*(x**3)+2*x+1', 'cubic'], ['-8*x^3+3*x^2+1', 'cubic'], - ['x**3-4*x+2', 'cubic'], ['-2*x^3+3', - 'cubic'], ['7*(x**3)+2*(x**2)', 'cubic'], - ['x+5', 'increasing'], ['x**3+5', - 'increasing'], ['2*(x**3)-8', 'increasing'], - ['2*log(x)', 'increasing'], ['2*x^5-9', - 'increasing'], ['3*x-3', 'increasing'], - ['12*x^3-12', 'increasing'], ['7*x-2', - 'increasing'], ['(1/4)*x-1/2', 'increasing'], - ['(x-3)^3', 'increasing'], ['-x-2', 'decreasing'], - ['-x^3+5', 'decreasing'], ['-2*log(x)+1', 'decreasing'], - ['-2*x-4', 'decreasing'], ['-x^7+3', 'decreasing'] -] - -# standards = [ -# ['exp(x)', ['positive','increasing','concave up','horizontal asymptote']], -# ['-exp(x)', ['negative','decreasing','concave down','horizontal asymptote']], -# ['log(x)', ['increasing','concave down','vertical asymptote']], -# ['-log(x)', ['decreasing','concave up','vertical asymptote']], -# ['x', ['increasing','polynomial','linear']], -# ['-x', ['decreasing','polynomial','linear']], -# ['x^2', ['non-negative','concave up','polynomial','quadratic']], -# ['-x^2', ['non-positive','concave down','polynomial','quadratic']] -# ] - -# negation_pairs = [["positive","negative"], ["concave up","concave down"], ["non-negative","non-positive"]] -# constant_dependent = ["positive","negative","non-negative","non-positive"] - - -def set_linear(coeff_low=-5, coeff_high=5): - a = random.randint(coeff_low, coeff_high) - return x + a - - -def set_quadratic(coeff_low=-5, coeff_high=5): - return random.randint(coeff_low, coeff_high)*(x**2) + random.randint(coeff_low, coeff_high)*x+random.randint(coeff_low, coeff_high) - - -def set_cubic(low=-5, high=5): - a = random.randint(low, high) - b = random.randint(low, high) - c = random.randint(low, high) - d = random.randint(low, high) - return a*(x ** 3)+b*(x ** 2)+c ** x + d - -# set_pow() can generate any power function, e.g. 'const', 'linear', 'quadratic', 'cubic' - - -def set_pow(exponent=1, coeff_low=-5, coeff_high=5): - result = 0*x - for c in range(exponent+1): - result += random.randint(coeff_low, coeff_high)*(x**c) - return result - -# set_mon(deg) can generate monomial with degree 'deg' - - -def set_mon(deg=2): - a = random.randint(-4, 6) - if a == 0: - return x**deg - else: - return a*(x**deg) - - -def set_sqrt(coeff_low=1, coeff_high=8): - return sp.sqrt(random.randint(coeff_low, coeff_high)*x + random.randint(coeff_low, coeff_high)) - - -def set_cbrt(coeff_low=1, coeff_high=8): - return sp.cbrt(random.randint(coeff_low, coeff_high)*x + random.randint(coeff_low, coeff_high)) - - -def set_rational(): - a = random.randint(-3, 3) - b = random.randint(-3, 3) - c = random.randint(1, 2) - d = random.randint(-2, 2) - return (a*x+b) / (c*(x**2)+d) - - -def set_exp(coeff_low=-5, coeff_high=5): - a = random.randint(coeff_low, coeff_high) - b = random.randint(coeff_low, coeff_high) - if a != 0: - return a*sp.exp(x)+b - else: - return sp.exp(x) + b - - -def set_log(coeff_low=-5, coeff_high=5): - a = random.randint(coeff_low, coeff_high) - b = random.randint(coeff_low, coeff_high) - if a != 0: - return a*sp.log(x) + b - else: - return sp.log(x) + b - - -def set_sin(coeff_low=-5, coeff_high=5): - a = random.randint(coeff_low, coeff_high) - b = random.randint(coeff_low, coeff_high) - if a != 0: - return a*sp.sin(x) + b - else: - return sp.sin(x) + b - - -def set_cos(coeff_low=-5, coeff_high=5): - a = random.randint(coeff_low, coeff_high) - b = random.randint(coeff_low, coeff_high) - if a != 0: - return a*sp.cos(x) + b - else: - return sp.cos(x) + b - - -def set_type(*args): - if args[0] == 'pow': - return set_pow(args[1]) - elif args[0] == 'linear': - return set_linear() - elif args[0] == 'quadratic': - return set_quadratic() - elif args[0] == 'cubic': - return set_cubic() - elif args[0] == 'squareroot': - return set_sqrt() - elif args[0] == 'cubicroot': - return set_cbrt() - elif args[0] == 'rational': - return set_rational() - elif args[0] == 'exp': - return set_exp() - elif args[0] == 'log': - return set_log() - elif args[0] == 'sin': - return set_sin() - elif args[0] == 'cos': - return set_cos() - elif args[0] == 'tri': - sign = random.choice([0, 1]) - if sign == 1: - return set_sin() - else: - return set_cos() - - -def set_function_random(*args): - - FUNCTION_LIST = ['const', 'linear', 'quadratic', 'cubic', 'squareroot', - 'cubicroot', 'rational', 'exp', 'tri', 'log', - 'comp', 'monomial'] - - if (len(args) == 0) or (args[0] not in FUNCTION_LIST): - function_type = random.choice(FUNCTION_LIST) - else: - function_type = args[0] - - if function_type == 'const': - expr = set_pow(0, -5, 5) - - elif function_type == 'linear': - expr = set_pow(1, -5, 5) - - elif function_type == 'quadratic': - expr = set_pow(2, -6, 6) - - elif function_type == 'cubic': - expr = set_pow(3, -6, 6) - - elif function_type == 'squareroot': - expr = set_sqrt() - - elif function_type == 'cubicroot': - expr = set_cbrt() - - elif function_type == 'rational': - expr = set_rational() - - elif function_type == 'exp': - expr = set_exp() - - elif function_type == 'tri': - - sign = random.choice([0, 1]) - if sign == 1: - expr = set_sin() - - else: - expr = set_cos() - - elif function_type == 'monomial': - expr = set_mon(args[1]) - - """ - when we want to generate a monomial, - we call set_function_random('monomial',power) - where 'power' should be a !!! integer number !!!, - indicating the degree, e.g. - f = set_function_random('monomial',2) can generate - a quadratical monomial. - """ - - elif function_type == 'log': - expr = set_log() - - elif function_type == 'comp': - """ - in this case, if we want to create some composite function, - in the *args, we need to provide - ('comp','out_layer func','In_layer func') - for example: f = ...('comp','quadratic','log') - could generate function like (log(x))^2 + 3 - """ - if len(args) < 3: - args = ['comp', '', ''] - args[1] = random.choice(['const', 'linear', 'quadratic', 'cubic', 'squareroot', - 'cubicroot', 'rational', 'exp', 'tri', 'log']) - args[2] = random.choice(['const', 'linear', 'quadratic', 'cubic', 'squareroot', - 'cubicroot', 'rational', 'exp', 'tri', 'log']) - - tmp = set_type(args[1]) - expr_in = set_type(args[2]) - - expr = tmp.subs(x, expr_in) - - return expr diff --git a/src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-310.pyc b/src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-310.pyc deleted file mode 100644 index 2781c1b1a855b9b87e013f2839da2db659c9d7bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299 zcmZuxQH$F~5Z;w!MbX)5NlM&60{c)fhG3UI^r0L_A>qP7dkMYEi=mkH?%F3u+EsQ} zO>BHmchK~)|Db)$FDmG@PyGvd$aO}FE`fGIqnX(m&CEBSZ3css!1?x@+hP+D@;4fv zo)C=h;c*iXl1Q49g3c&KJ;;M1oQ0r=GP)$QNZypOym3iqJ(--4arzI1q%p0N!%7RE z84dd2@cHqh)1#-y^B;~*P6bAECjcde2Wz@R5T5MF1^tb@A!}+=kiiLb@JIM7SyCCu z@G|j{?}0zQpcnKp#QsUoslOqk9UX!No%NuPczcmDIFHpb)5Ii?tH|A*)=bS1jknLULwGWw|$Y(q#Okd}TEjC@ZV3tF)Ij z`QKsh;IIhp3Wojp&N-DhHkHi)LjZZ$jK8Dz2w35e{2sgn7{<{%deb6$+hD?KnvR1y zbl%o+=3J#5n8D=hnr3fl9pSid$-C3(bEmAEuDP}qnLk@s<;E*J z6`MR)T1}l5*ZPkT(;?xSjJYVJo0OY6-On@Ug(=E|W|jncib)W#tN3brze9SmpBuq* zcK}KkzPDvq0?f5vG3yVh4-+1uA%otUaeYihT93%8%AK*#6Z}dSFj{|!T%;Pa_KOWC+ wBU!H#M9!USsj}Bxv}9>pz{NG`pOpPrJJ~Octa5dLKOu+g>61Q9!dqYd3vts(YXATM diff --git a/src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-311.pyc deleted file mode 100644 index 0a19943bb18b9e5ce8f2545ac1b11607394e5ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1880 zcmZ`4U27aw^xm2MnCxb=X`3o*YBTY{?PAQvQZ?GJ6bzMsO^Zo=2*^4+b2piEJ~sE> zwcRC)0Rtu)!Ga}G5c43l(mwd;&)9_p!+;Qw3chVg1<8}=&SW;(s)v~~=iGD7z321J zkEv7w0labXv|fuK^t)g}kdBChF(9^)fedUR8!uoiXvvanc|itRUPlWNBW^_3@j}#y z&7qv~CkB%o_LQqtN9U&N0G+yebM~G2nd`H~_h#nib)gZ00)!0j!5@G=leQ5*AzelH zfqU3p`CQtRmb)B{0~dOV=D^2YvD3d`Ln>oKT32}Av4|&+Y1kzea=qvEa?|KOs67l- zpYg4MdAcit%&g)%u)RA##v+iTX#LZK3NTH|rbC#jspX?wsU?jOLvO3scT|0e z=(l`z%`sp(OsndamWj^C)G9NbMb*;mlA)vbPsQ%MYM`Oe5HYn-jZPBKLQh>8j`>#3$%(euo8f;Aq#w0+8To-L=JHu z71gUt#f1j-Raig zg$I`&UH*CHQK2>X)-S+c>Bv2%2e2WkKX-$=C5zZhC64Y^9f*S%ZzpDR3Kh|N36m8K zzhw+B8PvO2cB$<}mR-~FqEvGhi6=wcRCKo&tx(h9kjMzRQ=wieNNkakic2{i0F|Sx zUZJ9MJtYjBz5r}g$iDytk^a?>`iH)n-Yjet)~5I4$@NbM2=<>PZ6Mv6dcw! z&>YAaN3hc1+D$a4~39P%Bl52vR1Sni^~5wv<}8MvJFx1qz3qnu3Phk*R9qoU)*Y-)5d z=ovAysv5LRIYy%~Na1rG^gqZy_a731!QlV^ diff --git a/src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-39.pyc b/src/cyllene/MathFunctions/__pycache__/math_cmds.cpython-39.pyc deleted file mode 100644 index 74e051590d105222231f4c0a85f317424d37649e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 zcmZuxQI8Wh5Vm(W%aTi=0z`_`N`4}Wgc6?7=~M|sb*Md1?|6w+MUL$xo7=S)+Y2Ph zJ>5xdANdFEBfq3Sq0+wgiNC-DbY_>mB7r4)XT~$0nQy*?_xoJ}>+e-0HW4BJqVo9) zLHPl;8^a-qq#4QSlv0#~EXc!Y2y!T+3o?!5RT;}G7j)W@$uSvq-%$t}(JFadYT;9( zLGC|(e)RC<@afU)r^DkDfgbG&K!{;uPWJ>3Pj=*-{y}~xYie)785~0ee}=!21(kse zFA^X54%p*!dQKmK?_czc`YSTp(E(^sSqCCukK*llm%)0Z7O7T_akltW6Pt6VBr_Up zZlgVa&BRKH)7qVD3FfwZX69=p{5@8>R4-Y^^SR{A6v}dM?6{8jMfuWdOi+|oU1n)6 zEArKbZ(_p;@DdvS_3jy!*gBPU69WKxP(!ezcL-?VfV>G_M9@_9o?f+x;5Hbuigrgq z6*_OLICZX64%A?LzoO||T1D9ITk`&7^4uxwCTp&(N^`FDd13P6pzZ~jMB*U$xc#n0dAy$)!83ON zLhHJ{{mhzqrgF!W7N*pYS;+_8qfug!3)61uX0jfbto9nTXA5KVDq5RVR~^gsQdJ>T zY7_9UI)zQOhqfd2y0FuJ1H;U!!dP$n;9~dixQ5P2TUrM+cMA>@CqYc(D5Bk<_aXWi z#XV|oqi+nEq{+V+9#;7fwqtPYU}!Iiz2Pac_KfPp!w6B@QDp8Y*#1*fB`>LQW5b(asO=v0(<><`$(F zC6~a;RG=ctc_TP5TV;&_?@yt4)fm_i1B~Vw#sGr&@ixUzW|s9sFyS_`DS22wV+YXx zD6}Db>e1P6&;WGgc4>QPt2MM3N)`e-hX`ARmor^K?ADffT)T r7a4c1A<15S(a@wR07q7bf0p$B%*lRkWSOZ0{NXtKzv@Y=B*rwue|rOH%7)JVi_4~RpkIG`d9R6v3%EGlcWvyRtZ?>e)) z4T*N8N~tJC0+l-lhg-#o|9}JH3P&_Y;L?JE5OwbC89hM?O!#6%Z9Hk|jS2#!{BEl#j&77@0>xt%B#z^Evpj*kY-b zvm;&@z#Q02?c6xxoTU}QfaVb&8|rn6YHp*hNZ93weJs?QbNS3UW)I-8#IX93Npl^3 zLGd{SA0NTSg3X6y6ZP)10hhL{+;h_EGm9hsF2!Tr=h$^#uxmflFDn1HzWrL^vi3D!c=~CfxdhE$O3kvCI3Vf`jo)vTG2UWT zCRyW&duWlFEAPB=CKi1MzoFIAf|_W?+xS$&vJQe zQl3=3c`Z6ChnuxFK5yuIL zM`>wxV_Vxvssb-nbdR)^`f8GRM4x`RDa^(?i}g3%&0R!(yHW6z%{Zo*VNUpZiI4fW zVh^!B;-$AoLW^XoD-=mEI3RZ8isk`sD<3>!Pi}QTNqm)bM{cD2VB$tm_r3SGyAwAZ z?g!~`luZv1PS-mK5wG7(l=qbW06I6a$V(})(xUIhlPNOXm>%fbW*8(X39fHY)Re*{ zcKGT-r9U{e+}I3b&kd97AWkh_n7pFbLpcPh1n`K_!^3w~i&%PJ)ER&-5mYTj=R(68 z#LDxvgF5WQVc-Sdot&IJme>q_gU{d}l)G2WBI$d9^krvF*McO7lGKenU(u_nO)ply zu0+{n2Nl!y&5}^`mT7CMf+*DniliMk>6b0kmU5$AIy9I}LsVbe7zH>5ZV+j{rLB*Blt&vuG|)zpO|^()m_ii_h{K&uefTt! zY$xfg^lYkZ|LOu?)8-_We$T?Q3}K0`>B?XcVP$tg7)VPsDHT4_LSDtXrY?h59TM7! zixhm#hni2zT6ct6rtMV%RCkKL?EbUX(#R&?0JLp~I|i0$873$!fn_;-%^*sgT(mCo zy0OX~Zu2@nUt*J+LfkF2VR3$8SvLi5K}(#73#MWJW%H&u4~rT%Aq59q$09iYYy1-A z=3Uwm!Zg%d2&u!BNyySxc}vS4_v$qG{h=RD(c-eTrSg2b$`N}yXWH3BWwX$~PB%57 KTpd;yP2*n+P|~pg diff --git a/src/cyllene/MathFunctions/__pycache__/math_compare.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_compare.cpython-311.pyc deleted file mode 100644 index 52b4687dcda7ed3173e83f99efcf86a2f8aea803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4354 zcmc&$YitwQ6~5!w_%-okNP@%CIFv`dDVP8O)C5=*AW8+SvSGJ^F3K9uBpKsZX2yhs z@ouOh?Ig0alT{F2DV1EQrBGHXe^yE*D)D3cW2LQXTb9-xDH2k(Kj<%46e;2lJ=c%1 zCtWD&Lmk=odCs}#obQ}-@2@G!j^IoEX_0x~iO^s0r12T*gQq)Sa2qj*A)@FK!5A20 z)DSaXG7^ZfFy;l~l8GV4P=I`b8O}c;pbZczHOY$O*FroOx)Nmt)ijZcM#Dx-QvXQk z@%-r{7=7&d*n1m^n795(NNi{TD-mrR(PTtS4ca@fdtamA-_*$={%tuH2}#7&s@yRo zIvS@TB%wQ?>3vPxv{AQ9Y}z%6R12?Bze^y|_3~Zao=MMnwdx7pfW6<;6y^q)14=c` z8~ZtH^OWZ34h-*W(RJ|0;VX2*$Et z6>04VoyT5vx?Y!4NN;W0EPFvV`9G0u(OLcq52eZfhGmz}r>zpnnCia6xd~CwDp?{o zd*kxKv`y5q339Aj3$T|Zvt(@|Dp@33b2bN5dP&-;cF@3z_tPZiIfe)nCo+dJZ?|aH zh)x~KFVO^q9bj}NR4x^4T(*||0(Nrdz*4z zI}1=yhyz+c&jawo3QC;oQsz{`*;fGvH?P#pw`Xm`!b4@43 z-Jpwj8lyW91^2Z`NZWPvuYW2bnf`-Q9gJ+*>4Y}r&tdeWajL;k$opww1 zTzf-@)?RY!x%qdbwp>RmMPs~~k^mHQosHerUXLyC>25!$;NQ)q!)7yA-S4<=K#XR1 zU3|9bZD882R&U(0)gp*I7Z!PZ->PPjk!>norB(Ef*T$o#Z@#4i3 z1~$1oygj+UL(r(URGeYM9K$k!t*V_9xVRvO;$fDDcQH~;;RMgBWIPqS0(h&I^VI>5 z^FTExc`h!hMu1qghJ^8I=&EKu6raS0am7J(+NKV!VMlh@H`iN>^`rv}Q&Gs-R(Ws=?e0TK)vk<0KaT47hASm_BnNt5@0m z^Bt>uR)eLk{ROhGMD|q>VfKF!dDQVo@7JAQcb7)S3x_`_9sZ!YUUs!-JBqIEytVt8 z1yNnu-34b)$=Nf1dfn-3PQEqSTm`GIWcAITEL+=Jr#1O~ z@@VGJ&Dn+7TSHkQ+p}s~9$6VFlH2p-_QwvFa%Aa*e4euW)dvbZ`hZ3*J*D?D9Tr!w*h={^LUT;R1c6L?2n}E7F5`da&HJJx6@DM;R(_?amQddwGjb zIsJIc)(vp5)1~w*9hHxk=}zSkcDPfX`PoPFA64Cp-Dh98p`6LSxBT`ubZ?RFeXui6 z_twN0$fG6l=-SC5c`Q#JtKw4=Fjpjfd9sGkGpmNMGKvLP3?`dz-L*w|Z!w)o|H_=3 z_yzS#s_5FAckQj3`8OkS@7t)D2*4PFqV#WUY!3UN#^IGVk^$$C~-1+631?pUhIwu=mhoS0M(1dQ`rNPV zUOFZpD|1;*#=lb z12DR2WjfopoLZ(Zrk+o3EZxZVEq<8!u!4+KPubmZoBEW>h6-+f$?ea({bkyBd*IW7 zY$`Xpdi}1aK=+pD-n-X+d*e4Z*7_fL9v*!(S_lr8g2P36I8P6kxB0XE+5U}nN1J?Y zaUe60rHhU?@{TuZpqdP3D@M9g9uRQ7{L1Mc*^j>3Zy4z}1_&OWNhn}e&DEzst)M#b z9XUS5Mw3uat97(mAMVvFH!l3ot%Fd$Qc?CeKLk^JvkSw}REz{cl#w^z_&r8@^7>!J P5+R7r3VKyry(0brl~$d> diff --git a/src/cyllene/MathFunctions/__pycache__/math_define.cpython-310.pyc b/src/cyllene/MathFunctions/__pycache__/math_define.cpython-310.pyc deleted file mode 100644 index c9d38691fb44bb60f93df998d2a173d79f27f434..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3352 zcmdT`OK%*<5$>Mpot<6oixO>%iUYS3IP@ek>BK=`8Hy0t2?GH(9e}h04;(Cp)3eJV z=cVpmkxT3%2MUOCP=Ndc$~XOr9Q_{}$RY4a$K({`5W1>|yQX9W2#`}|Fx8K$>8`G- zud2&#w@u*r@_@x(-X!EJ99(_6F!%+0Y6e6QK{FCkXr0W--O$Zh$nr+m$i2{`HNP1) zg)3O*=dG|s$(V@77c^`q^l(LZqAC2x&gb2*6L!O1*bfKcYIrTY9|4$-s+N7T5|_n;MC##5DW6eTKcMEiO7w6vDPmk_2&;-R4?3m+ zqDmVtON%6urgeW32?;C4z?tkr(^fDg6IqtpwCt4a`Y2QuQD$7w*tlAz#?8vHVR4yP z#;Z3tU61%akGbF#zt1ICT=Qdo!l(Rn4|HNOiL&k3MH5^;O=$7^06sMU-DgCT2SmO* z11}vpvajj61J-xGpik%=xWa|m9||TK4~ce#cSe6n&gk6L?7X2p;m%yqTqi*Nb#msy zKdfkJb_l!~$jzu|J$B|ywC9a6nR~^yZo-c2&_8qJuW)uo=FD<#TTV;2M-K2lLmsX( zBQrX4#L8p$Qtk~aw*oTL(}C_FUw3s+_eahvM07;=F{}6cEh+kx;43=whUksy-203a z4Lj=NXx5MqXR!Oo*(G8y^RNw8qdz%>v^hL#npf#)%A>@T_;C;A|f{5aJIAe5y_^K!&fr6!5uZ&(o4chj1h|wrd zbRyMzc8ppi529?Cmm=YBzF(GE5*5LFTpg5?Oe{6ja>{jSMJJI?UepSgsr4Q%6#3Rt zFK8+zGA+iiL7}4)9v>v}(NZH^Za=wPF%h-upGH|KcqGS@JSnuY!f&COAaslIa%k}o z6?!>=Mt;tWma}(|T>i;pFhA@Talq)oVzQLHEE2RVSeuW^EGv&u-*4Q(^|VSZ&A4HA z-MGa!Y8+y3i9{S&;9=(*G;Z9oiqtH`B(fK%#6E0=4IB>}z$P|`PHgkCDDyPRHfrO1 z47%buqD+;%ij=~oFhy*j+p07^!XUe%e9g_Kn^p;V9pD>nO=F1(A= zH)>g125Q)D-pR@s{BjpMi+`V?fh1Z?qM0C-dbQ9V9PCw?F+QRap|%~krfr!+k;dBe zU#KYZyC8nrOAC+(eAIY4U7Hj~MR~l)D|G?d2?nOS{mIS;d-p!x8Gd+gch4G8zJwb# zAR@+zaa3iRmw8EIA~)?+rBGs`B2G->{YXJgannMZ#waTzZCt>gw8wElS~id{AVJeG zj5p)w)B0?twahd&ii}?*$JS6`6D5b`k@4#EVVzi$b<|J!$tA87iB96D!I zup=g4)9yLL@pvj}4S{4~e5IaT zf%MVIhigt0l%(Bh{+sEB;#rjM3#@hv6*m8$OA?kS zxB|%^f#c;C5=8TJNf0M6Krpu|Oq-9$Iedq30eS+Vf=+)*cL3f@P4<=PjAW7w!G-%} zri@#a)l+Kd1PDWmT|t9?$J#Qw`&V2UWAYj~ef<(5OY2@qJ81dn?tfMevluF;X|0xg z8zvwV{TLcUPvlRbl|Ms*$yFjG<-0)s2A|!(12^DijTRRYs{9E`d=H567jBpD;M{E> zfhz-KF}!ogw{Y4nYd5fP@4s-CzkrNd12X6$Fne^(>9HQ`xE;n^`Ey_d&dxS?104~3 z$21TK(^`R>w!ev&bBOg#I~v-n`qi|BeyVd9dMmt+h2rv(y)dZFhLQu@CP?cg8X3B8 zXl$r3v@-O*q0&%gs5bQ29@fyQp{Ld~R?+&X_Pk458vhQMVv;3yF=W)sKzwq8`d$Ze P5F0ScFWQX!zW4gqI7^Nr diff --git a/src/cyllene/MathFunctions/__pycache__/math_define.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_define.cpython-311.pyc deleted file mode 100644 index 17e7aff7e1f7834fd940614574836ca7daadf187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5042 zcmdTITWlN0agWEh9wbFQEk`;dL-h?;fOZYPWgr9Tf1Brml%U(5@2_-@tSs=3SI+qB0h{7#3xr}AM9Jm#{;UVNE z{G9eS?3QRwv?N*+kwi2ROSC28iS|TCqBGHz=$2dL@cUe%M{bpy;ki%dW{4R13YSic zUKY+u)KHSjBx@NG!bSA5&Q)x4q$*E=n01?LpB;jB3+YI#)HI+H))#js=mOyDLs>AerJP~9!Z!JQi3dGg-Zez z48atZh08)-SeXTxyi}3YsTA*M&xS#O*ne;xw0eych*>xJE}_3EfCVqw8mFCR-O8n! z6~JDe>)Z`E_f0&z-By8<%vaZ4kiG8{GvLk$db>+P4{-e zfXo+o+27+%5$FYWdpAJRn>A@0cU$#pga4U-fi$ivaC>jxs#gxJ`WDElU;C38sR@EQ zM6FiaQVnmsyEK5S3uM)6bGWjHLz}yv5VL(3pZDzHvLCrT{WJwq;0m5w;YM9l_j`TM zex18}?AhVP5HWWZ3#Th^CV0Ku%>6C~lJ@Q5^PUyx$W6DJZ+O8L@N=4@H7zzs!26q4 zeR9hJx9We3Xu-?;TV$ED$69f$;G^CGXlLFtL*z)ok54fw{Sq!-Sb%2aGuiZfUXU~) ztz~m2AhJLeGeX>$>X)U;s=`n-@fjGST!BYM_x zvQZ(c!>TzIIApSBUJTpIA!0}w#Z;(q!tSFK%Da-9%;>TrjGWPRRgpCDgkUV{IaRJn zXwtl3>NaUkGL^kjAsa{Tq$|i1toBGM=V)46fDJTLx-6s?mDI(WM96MVsd7|gNAx!( zH7yGgUC3n=%`|M{L#QSQB-%o)Yey$ZGiw8=v@Oi*s;V!eyu0QQ%zRdpla|zBM>(&7tauJdHFO~>83wY#fIW<6%cfHo@siaE z@64+CF|wM%I@MAxn+FFuoXV@JqA7HL?cD5m@7TDir@%ZDfVgC@f=MB7{I zKp*MoeDn;7bzN<-JWU;)7IDFSz9rW7kN~jwhBXg>5%~%aNo|1X3R0%u*>@Jy(hnmn zi2jaFJSFlhY)>ZTbjoCrJ(U9$fPAGjtpPoFp5v)2?K$nDrZ2k@%PBOb#VBi;dSm+R z?1k5+lRvmHGi#fGcH@RVxN8dv^B7qcs75@BDTRg8MjA>9NlPircSbUxcHq;R$$ayw zE}4u6&!#*OQVhKm?-a#EDh8MrZ!!yJ^3K^yy8K_QR2KXs{9*w8(3m@4I)~I)MPFf(=wh zKk{vimP5mp(6B`=xO6-5j;kj&l)aOwr}?i?g+>4wfFC|zi9dRc-wv6JJ4o@K^s;q)D3z7@DKrr-A%fBi|2~x9$Q{d zXk@z+I@_J!DRm4Nr||Rm@nh>aiFbqGZ6l?aSoGfwfcx;i{o9eQjkaQ;6zshliLbwD zV+IDY&zr@`W90K=fyq~R7SbS#P^g5}6#9zW@S@?3doT%x{~3Rc)JH6=BX8}gUfzb) zAMmT5D?BY0xLUpVllnUI3cp)vHdbV^_ag2{=%M=Ba>*XU@%ojUwHgv<+}2oiE^t@) z#@c75p=#abY@$Z0?WwC!3)NOH#W%?BEAsQ4?0Y{rLu|~Cm>hrz9+Xgpc9N;9cIpyQ zL&@X5ZMcO7W?XYIZPaBhCu{zXWza10%o$KH&Ezvb%nuuaDrM$mti@ar#{QoRCX8&sUevpjq1WuV{B>~Lwuv;cGEj}sHPh6k zQZ$=1u>-OgLjWGHkUy<$Z4pq7im7<4WG#Y;jN62j5=eSbWRP`I3vLGQIDRn(p{YIYy zl4yI;v<)tLrl-Io&>6&D=EGo=ceJ+8#>eo_6o@xtb}woFwNhVxVEA=v5UiD19LvS( zpCazPw5u9Ah|^f;*f*S$7&phb6ys#ZWf^ygag=ce<4nda+ZJM6o^dO-J#Dpr;#^SI z3BYbSRhgh~09%Np#P}xwNb?-GP1;KC*Yfx{k464F&`h}2wHEwrlNU;jU(4GP1I8{` zYk`tRJh}xh<=fu=O&J6cN1@&jN1@&jN6X~E8nns2O diff --git a/src/cyllene/MathFunctions/__pycache__/math_define.cpython-39.pyc b/src/cyllene/MathFunctions/__pycache__/math_define.cpython-39.pyc deleted file mode 100644 index 68f401ceb4d21360fa3c378a1dd0cba84ec5f736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3360 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 diff --git a/src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-311.pyc deleted file mode 100644 index fd722c3509413b2186dd9eece181faef6945309b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2184 zcmZ`)-ER{|5a0W-eRga}LRu~m;3%QgDTyl;MW|^}1uf7Af-2G%tL^D>yCD~y&tdlr zIC3N&c(7C|Q7IBs%0nIyrGke%_Rol`NR3vCgjDr`ry3v%B-0 z3E@=(HwK7lg12RX{D?4&gp^gPlr@^B`hBIWpMbNVb$UcS7AYDIhKGxd^UR9;hr zYuuWS(47!AHC+pt_$2ZhwM4x#U$^$Qw5tv|W8lauiHz&+@;A9NKO6BLG0xGNJ9e&QKAt-)|1gt8f30B11Q>4ke+um z-vY*>4&E3?G#WZLD0tcFL=zmPXwi|oV$38~H1!nXecp)~P|?ds=EFk?M@U2Owq1!T zc5goBpawGg_S}bmFcQ4jim5pI!5A{UzzrVs4*dPp0MNAq%wn0-b`H@ zz}Q&8QiDd88E7ZpaT(}C9_cyOt;}L?$95^-3E5p~0Erd35Q{$M4d1CuQv~jbI44pU zQ&JbqpOHE?5XV#Cm^x_$>`rt~2#gfF+uHfA^o?L#l;)g(Gq2(VLFvj@Q>BU%&ff9D z*}2+$J!HJ()_tD^tR%SG;je*Ba$AVV!%jLpx-Z7&VZ*lV1zu>|3w?>{Sfawf#NR;f zk-y9%%h{C=RtMJ1@s>HhZjLwg2ZfDykHe?u%@8?tZX@6O_}ucu>Tp|APvu?{Alpb< z#)+o+@Z8cw+aURYHc4kszdZh4^NR=9o7dZEa$*?S&BKFB3o9poT3lLeUIp#oNrc}t zk3PQob78sghdKJYIr@yQUTT@=*Uj_M&apo6CF4eX4^7nV>3a+0H3$*TQ$euoq;uJ)wOMY8l3otKz=0=P83ocG)9iExCrE4 z=hxOVDWgr0^q)_`Id+rVikj+cll>%yN5Eo+<9)>Of{_KR@8};Cn=x*>o=6wBY}Cqe zKp&wKZZ-;X$M`hf+y(wI=rA?n77)m|qHK`!H KxBq803h7@TDF0Oe diff --git a/src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-39.pyc b/src/cyllene/MathFunctions/__pycache__/math_functionclass.cpython-39.pyc deleted file mode 100644 index 03c84f7796b6ab56c48282cff07109cf2b461591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmYjRPmfzQ5V!sQ=5033ZjrbEdO}=M(T&6j0YV5wD-O-20J$nPcCPP(@@VE~&x~j0CyUe5g24KB9@n=$LjFVJctv3R z0NZ{ALJ~MO)REVjOztS0qn*3nHom5>3+&__#yfF+h;wp{UZ-$-09Jm7*1d*+ z976sxz~Js8he`BqG5@(FFo9z73`QGcD@V-d?M5$ap>5Su&{*CsrFvwL5m)TNgSYe# zpM+L{O9p3at?cN&XLjY&r<-=V)IL9q$EUkU20P=^#@e;AzGy7p(Mb9XLp8IF&q3kX zW*-6RdeSep`n~=H?i>hhg9ks5Fi`qp1=VuibdBTu9Fo~DKoB;h>44GvT|bUl9;LK^ zeNOvyK+__o#k;(Bb#{n*aqzDh`tBEY2zTJzN1!;EJg|-~=*Q%mzG7Pj)25RVGe}Ky zAH*o~RCqe|v<{W;#HVoLGtPySoIe4>25!?Ky&4|9Asj=r6mCpLDVEiVR&nkNj=TYG zfZpf)&$ZC|6NoC8HRt9ta5DHu9OcE{8%!P^n1Nz3cFy8n@om6HnZYm6^g&doIFIl( kA#(yl{7Jxe{0h9=)fysy5TU^QyWJbVM{@5I^=Uu)AG<+oLjV8( diff --git a/src/cyllene/MathFunctions/__pycache__/math_helpers.cpython-310.pyc b/src/cyllene/MathFunctions/__pycache__/math_helpers.cpython-310.pyc deleted file mode 100644 index f208fea9dd2218d41b38ac290a104788950059ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3706 zcmcgvOK%*<5uWauT@IJK%ZDhDlqjX02cR_+(m@_Z5Jj;bwxB>}0F#E{g^k5hU2tWZ=faH*S4&+h)A@}@;z8VOivv0X5U-eKcE~ywfWr^vj?&+@X`s%By zX5MJjJpBH-9mGFtc;2_vIs0p(^AR5N4>Zz~EcMz=3e}{lsVP-g4b@cBYDUeKp%Vl{T@9UDSd#xLWJDHeHHt20Cy}uNRO%V$z`r@h3!iYlbiajwD z`x}@TXceWchGmguo0i3vNz3|{J+(|*W-Kc#+qG=ZvY}=BF{yv^;}8No_wkr{G=*2N zf**KCjQ$SU0UeC(zo-fP?#8j|7e+)PO-v!Wx$cR)i*9$2#YK{5;$~#TR`N_`Vsj`= zp_6Q@Q{)|*-f}9UObV@vfzC#1NJE;6XOT{#%~TmTZ#OBn^Fblxpr0mjR4B9J##_D( zNSpPID(v+wRdhxRJG7|tc14TZNt)ZCgIXW+UV3@~M*jPY)z6L6W_2gZv`TtWmaRT~ zw6WTYifz)dGw2TsrB~x&nyO5#8Xb@1Pci3{Q*(`5(b-mMAKF&>L%TeFpsvn)&Ukl( zI)O}R&r}1ZmmrM!g8VY_#Tq(=M}8>Sfa&SdC%V4ntz&cxUMYO~D%lgRuNA?8C;1Zk z7$3<_Vl=vdRV{!2U;jrhmhO5459SJd-A)WqLaTV74G5ABMZB%zCm@JWQM@hUJTpa7 z3{+M)cDbX%ac_CCA~v=aG?+nJh+Z@lNfxIAsV;Ej6|q`V)2i5@7{WPoG~%PNK0NBM zZ!vwDMu`w*vq%yJ!4*7)meeOg7O*O>^E#{X8Vg>#?-$%gn(x!18)(RF1>50ATu+gc zb^_;?3c2e{Fg@x56(#zSj(Q4g6F?{uX4vZwh1%=GPJ@WLCHeyd2hAMu+(9!i1YK7v z)xnz0JUtB%s2v68EfG^>8AY2EN|?c>Mo=Z0It`|(ttHT7iYSYf<)&{d_ac+T4li3j ztKDJt63K?nb`CV#7^D6BghUlhy;@_TuYUyb0%Rkm3w$k^uA2wmF)L*W-WL3X6WakA z-~ZfM{m|u>C>ukl%qJqxl%VK!6A7?xqLHO;=2<#yjnETCE;g0eD-qBx*Oo`L0q`+; z8t2jPQ8UgA+eF40C7aIPhnV853@h_2;QA-%k6B3s4DmQ(dshV+F1lESTx87rc-WU*}AQK zhB8#*XD2rhbsuY;>lW8PgbqzHbso_g(WX>z51-8pny|uoz?Rt}ulsezU+Y^K9K+Se z0I|#A`U?nK9_p0$!29~rA*cFv%n$epFg*gkdf|W_2N6a)4)YZu!aw@3f|Nn@lEK?(C34(mwC)|DYG`bxhx(uyQ-i!76hH!kf9T z$d;C0ChHZ**2jvMO#dA6dBmp9DC^?;cNA&?vUQU;nf?f!F#|6^b?|Pe0G2DO{~J{L zSJrvO`4p&fqLu2&ZMgt6z?E5g#zr`%X%&GZFrhi9k&!wWNGg>nGewP}e zK}=Y``4OIP9`gY@h4%uC_%nQKLgL9cUe{ffpNFSh;f^aD_loZaU;@f6;c*4eab@Zd znfnFhZ+^f|xb%*A$r{vIXOr)2(nQlT#}ZgnQ0Vel8aTr1h*Xm$H@yA#&e+-+zKb_+ z^iu{dH@OE1L~^|O7;-x-qp&k9H+n!bX*b&#)BZ;c84B;v50HiCh)SQJdx1(6D+IT@ zC7k9Q?}Q!uC#OYztrgf{Gtbj9KLj%AcI^~WguCZNNG0wJ=ln`n{uJdo(%+DBLST;T z-{bY)Pe9QsUDcHQ39cIRp7a-~W(I5eD!#d3FKeRSv2kN(=Q+Y;r`vn>+YuE?pb9Ca&Emv^C$tj&~{XJo^jx~qn?S8QSjODb}yHM sRNbNYH}9hfy*dm0fQi>l)R*e(FbHemeAo!5!a3duD`Ch(wDo%BKi+9h8~^|S diff --git a/src/cyllene/MathFunctions/__pycache__/math_helpers.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_helpers.cpython-311.pyc deleted file mode 100644 index cba89e192acc8bf375f05f1c3b8b6782fb54f2f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6025 zcmcgwUu+vi8lPF)@!!OD?6gfFbW@VFrlBG2agb{Wq)nmem4-IuxEd^+s6QHr z28n~z5hrmGH}McJ@sWDcK>Q>?g0k~^eY8<_T|&{2>;@T@Js_K8FUW1O59D^a9^?); zk{jT+S@wf$fu{icJ|+i2J}x(cY?bi{iiGa737xo)K}N9dPN*>@n;Io_x>*uO#keSo z8S$J*MODGE%Q&Nyno)j_X*~aYo1IbWC-u>R8k91szZ6IH%+3 zI8$FOPN>-6e(+lm*N|58O=IsXMRQbZ2+g3I(CW6?a;v9{c!vEkJU#0Xp$x?1B%`UK zBqkH8CXS_PN=%Qz<5*USYl*ZX?vYe+JaL{V;%H7(HJVVyV_G`Knn$<_Ns&cLv@BIj zHB3V?DV~>TLK;mHmAAW)&?eGZO_Z~lWFjtUMBT^VM{K&CY13^g(e&1FqQ%UPG1e)z z-XkLDZq_!&CaT+@oytHXir>G{{klr1+C3>Llq6D;qIAD9bhTVEu^qmiR z{U56T3_Y{lTnZg5hYptfePw@N$@4;W`I7Mn9$a-07bDps3sw5?`3 z2|`&+!&~8i3gc)5&@m1c*BGuUWus0Rzs)gSj?}>X(&us5|?_7FkG5EE!rRZ!~_3vF8T9)n{FZp}R{@$Xi_n!65 zYQs}Yy~`)>^pzT(FE>2@tqliy*ARC1(#K#17BI7az`;BNm5pGoh3}*ZWh?sws4ZY! zj}@Ch=!GFFWh1C-NN#8hY)iz9M5Pn~77)SClBniVnVd+bGGHwgn669AWP!9;OOt=N zfwL+Dz!)VY27N};$qI3ST9Y)p#5iL-m9RlHBC6R@3S^g1NQLC;bWZ~GsG6k2i7u!a z-El}#6LD^J-B+ufTmBXV5jM9P)9dvXDx!>Xo`PHL1;M$;)i~FFL%8lLIorz4wl!pT z>|gbV<_62*j*`E#?C&hPI=`z!fv%;&lE0_y?#99&g1+0PPN4qU z_GbOZN7bsiAt<)!_z7b^i8N-NN@+(ljDJ)|TsQ*&x`3u^XV3)^pKASFuj+H~lioRnHfhc@U!0`@%byckTgIBaG(?wUaajn_l z%fp8cRTib@`wqF#-x_*Be(8GbP^az74h+%~92lq=lpZXDxQ50NzeTeNyp5Wz<6v~E|}4y4r-Kv3SA=oPj8w zPGyp03P>lJC9(*a0!=_}ai8s&B6Ye0qJknDpus0}Cu}Gf4D~uGlOc+%3zR@UT$jr6 zjM$}+3q0ARJjY}U2RXZejs{9n>GLF38IbnD$J21DZ-B_7HK6&%{Lz*A5DNpHT+Cu- z)8N&{h47p-zkOl*;;xdnwalR)5(LB53_81w?R5(9yt!CsGcR1(K7wu`h`9~|h8w#j=)%5dj74VzS6TD#J$=k9 zY{mPhcc!GNn400{+1Hm$0|Ti2P^mVUgnkc15P4J#b{SUz&$V6K{qgSk$U?+?$rtrL zvn@m;o&!D$b=?N~Z(+)!Ol>&w)(lIB;3Hdj^?49^wCeRUJ9n)31GDGu@<9u~fpJQ~ zu5z$zwrAUUao@Vbr%k?KN1+A2DT30#Iw#O=16MGbMcy zCQe^sf|F*A4e21f1>+@@t&B%m*CR}@^p?I10%*EomxMx(!V9Za*7ea>;iJMD7*<*F z2LErXu!&a-BP&jwd8oXPtr@~)Y^AIZfL0Bw&EhdQeYxa%gcAz2*0MO^Mxy;`mUF?x zxD$>-39Zo7J9vHeexKSusMP&oHV z_x0|jo>KVfa`RsEm^I{ zv7@*oY_B9rS-^XreQpPlNB6w`tHOeF(LP_lQ2$LJ@^v6m3hXTh_LjU|Wp7u}-nGRa z{{^UkQ%ehC*+IzL9G%vwPlHFwwrPm$Mo?;nzC1D++j^|q5`5|bHn;U1JZv@+;|h(! z+bir#3y3^g@%la-nG4RH{J80I^h)${-y*);U$i&#xkjGQ9elfLED*#1I2AL_;*0|W zXJunb>p&T0yJyOrk+MS?%2E%?cFNo%D4eY#%2ILaXM)X+2AOCCp}Sr^bA0&l!0{2j z3pGv~*hbSp@_trhnFbF%oas11xefSVGN_lcCOfY9-qn{%%h@F9r!jbBtDwFF5)wy@ zS5RZIdaa;cMe79_Oyt0laL2P^-&v5ML!|3l1mZtTlu$<==X>(fY;bm9_S{_C+{s0} z*s~}Vf`tL-*%(?37J^H`<>05mFM=z<#`Qj>vFw&DoZWh)FT7b{nIf`8(yc%mkJ zj9k=317l4zMGK=Zrfxf7JAAFE#aXIN!L^Zt!js#Bf*X}|3qHttJB8m%QW>eDxjBr4 zicAu()Z*b<5`$q=fh}G`&wg64+l80PZsA31T6s{b@OoLdaC>Rt=>%Pz>B2J+EoF?Q zrYCjI z&N#XAm>D)?s*yXl9plnkunkwu<*?T&M|dY3<6+KE0dv9;wG;bvKIqmfy80GVZwv25 z+7b)Cu^e_#PQ}}RoDW3v5O1s6_Yl39DmD3E@&t4X+sn@>44$JoyKLb(oqCsr&&l?o zThxS9$(FU2?H+NsV_}zd;CjNWh8&LG8OVb768PWi$+VcE>8i$b(Gv zKX=q3ZSldBA^hGU-QYy7ZHqcb58*S$~+A^$&-G9V69Jywih3xujJ*nZFO3 z_l9X~5`>)PSS9f!eQ~g(IuK9Z)!#$cW}LO%IkYxA!hGiLxo9mr^1ZfugpKDj-gw6U zWn~-+hBjo?(a0?ND_E@QJVC0!DFDz8=8T7{hg_Tvisaqd@GzrwbGeOh6k z=Jg6&-#p#Kd2`Pu2v>i|J+juQnf?e+UO~Uenf@Z@V%lQPR~UbTt3TxoZH##Xm|Dg2 z=e$-)Iti#>LI0Bb6?7WVdIkMkUaz38m>xCrrkIB8f0FO=<|!mFd^nRge~r{dVw3fo z!biHyl#s4>d*9FS(^ICVzyWOqJVYxi!57mdJyGWj@KfTI3Nx1E63%$={EboTiSsGX zThEB{mw8LfT3NS#<2+#ERdM8##=%H=%tli<(NuXNaNNqL?3o&3)>sdbXCJ%c`3cOs zp6f6qciti`z}*7(M3WNtlx@zD9dHF4jsAhKZUy-6s3_HxNIHnpAV~*96O>6D3{*Cd zs<#smIxARBWllYas$k-o@ZX z6t4&N5lPHYrpAJUb?hN=A4nBk3^Em53S>|Af!2$q!Xz|N+Kk~rGGT~QV_T&BcjGQc#Ec8>Vu5vY)2o(9wt}h?KMoyJISJ$8Py> zJ;B)sR~=<5Qc1MdlR8*=3h($rH zX@L0Z=^!y$_MisE6zCSrI*woQlB-hzQI!pDzW?)|-MaJRRbvSk|F49zsBjjx?_Uh}MNKxOO($aS&Yy+s z&fR%1%wxD;?soAWKFgub;2~45p}X^*dV}U~Qul4@=Fo+ndY$H{sSBt(ynMcgZ&}f^ zXzPMQk0lipHMFB>`YgIGDyMs|j_~~D^kh1CGF(HKFne4+Xl~Aa=WgPX3|+MV2CEI~ zhHrGGSsfsAQg{e4xN74Hb&0!pzF^7ctnf=i+oD1(fwgE|C5uy1T>CvKKs9i~p~t<= zT6>Sq9QMrO)n10E($_ENp)P9uB&ES5h{M7c$re(ns134*QmIR{vxmGcI3>)= z6b{snR+Ci7?eehSCDC+Zbs62a(DZN7xpQsqGw!-B=N#2f`I}{J*0AjuDxPDu5~6Bo zhN>aAgb^HO`p9+Lyv1fQrv{@<8h0DaWqy4IwG{u4%jftkb6uYwL*L*;`As$hnlo&U z@qfEb&aG}S1;qHHlA40!T{L|hg+{25CdSSy+mo#%#}6_4jBI@b z9cPyj2AB7^cNOE+z2lxD{2>RCvnKz0=vKhL2$-mH3?t(lSX;wDU2nO(Mo80;De^9I z*@i!9_o7x80Q)1FrrqB36s?!Ty7~demD4XI*eYcfT?0{H;!lBInJpjo{S>qXyNxw_ o9xLv^mJ@3fjjR1k414k#{m;>}=o;LwHCV%I9Cd!xaNF(w0>(et)c^nh diff --git a/src/cyllene/MathFunctions/__pycache__/math_listform.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_listform.cpython-311.pyc deleted file mode 100644 index c0ca3448cdebcb5b15ca855b078a41772f0e72cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7259 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 diff --git a/src/cyllene/MathFunctions/__pycache__/math_listform.cpython-39.pyc b/src/cyllene/MathFunctions/__pycache__/math_listform.cpython-39.pyc deleted file mode 100644 index 33cdcc90089d1b09f25dc2988d20df52b025c40f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3750 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 G@BI%AEu!lH diff --git a/src/cyllene/MathFunctions/__pycache__/math_string.cpython-311.pyc b/src/cyllene/MathFunctions/__pycache__/math_string.cpython-311.pyc deleted file mode 100644 index e7f3af8034c1f0a78bf924f0d9d39893c113098d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20159 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 return generic interval + return -6,6 + + if not isinstance(relevant_pts, sp.sets.sets.FiniteSet): + # infinitely many relevant pts + # try intersection with compact interval + relevant_pts = sp.Intersection(relevant_pts, sp.Interval(-6,6)) + if not isinstance(relevant_pts, sp.sets.sets.FiniteSet): + # if this does not yield a finite set, resort to generic + return -6,6 + + delta = relevant_pts.sup - relevant_pts.inf + return relevant_pts.inf - delta, relevant_pts.sup + delta diff --git a/src/cyllene/MathFunctions/math_randomfunction.py b/src/cyllene/MathFunctions/math_randomfunction.py index 4143bc7..8fc6371 100644 --- a/src/cyllene/MathFunctions/math_randomfunction.py +++ b/src/cyllene/MathFunctions/math_randomfunction.py @@ -216,7 +216,11 @@ def set_function_random(*args): expr = set_cos() elif function_type == 'monomial': - expr = set_mon(args[1]) + if len(args) <= 1: + # degree is not present as arg - choose random + expr = set_mon(random.randint(1, 5)) + else: + expr = set_mon(args[1]) """ when we want to generate a monomial, diff --git a/src/cyllene/MathFunctions/math_randomrational.py b/src/cyllene/MathFunctions/math_randomrational.py new file mode 100644 index 0000000..f6d7288 --- /dev/null +++ b/src/cyllene/MathFunctions/math_randomrational.py @@ -0,0 +1,107 @@ +import sympy as sp +import numpy as np +import random + +x = sp.Symbol('x', real=True) + +""" +## Alternative Approach + +Workflow for reliably generating rational functions by building the function with some randomization in a chosen structure. The structure will be broken into two parts: a (generically) irreducible part times a fully reducible part. The irreducible part offers behaviors unachievable by rational functions of the form + +$$\frac{(x - z_1) \cdots (x - z_M)}{(x - a_1) \cdots (x - a_N)},$$ + +such as the behavior under the rational function $\frac{x^4 + 1}{x^2 + 1}$ (irreducible); whereas the reducible part allows us to guarantee a certain set of zeros and vertical and horizontal asymptotes. + +The following is how we construct our ultimate function `r`: + + +*Reducible Part* +- Generate `M` $\sim U\{1, ... 6\}$. +- Produce `zeros_and_sings = [...]` by randomly generating $M$ many reals $z_i \sim U[0, 1]$. +- Produce `multiplicities = [...]` by assigning each of the $M$ elements a multiplicity $m_i \in \{-2, -1, 0, 1, 2\}$, randomly selected according to the corresponding probability distribution $\left(\frac{1}{8}, \frac{1}{8}, \frac{1}{2}, \frac{1}{8}, \frac{1}{8} \right)$. +- Produce the `numerator` $\prod\limits_{1 \leq i \leq 6; \; m_i > 0} (x - z_i)^{m_i}$ and `denominator` $\prod\limits_{1 \leq i \leq 6; \; m_i < 0} (x - z_i)^{m_i}$ +- Decide a potential horizontal asymptote value by generating random `h` $\sim N(0, 5)$. +- Conclude the reducible part `red = h * numerator / denominator` + +*Irreducible Part* +- Generate degrees `m`, `n` for both the numerator and denominator $\sim U\{0, ..., 5\}$ +- Generate `m` and `n` many coefficients $(c_i)_{i = 0, ..., m - 1}$, $(d_i)_{i = 0, ..., n - 1}$ for each part, with each coefficient $\sim U[-5, 5]$. +- Produce `numerator` $x^{m} + \sum_{i = 0}^{m - 1} c_i \cdot x^i$ and `denominator` $x^{n} + \sum_{i = 0}^{n - 1} d_i \cdot x^i$ +- Conclude the (generically) irreducible part `irred = numerator / denominator` + +*Together* + +Set `r = irred * red` + +In reality, we'll have to pass the product of both `numerator`s and the product of both `denominator`s as arguments into the constructor `RatFunction` to produce `r`. +""" + +# generate random outcome over provided probability distribution + + +def discrete_distribution(outcomes, probabilities): + return outcomes[np.random.choice(len(outcomes), p=probabilities)] + +# generate random integer uniformly between lower and upper (inclusive) + + +def integer_uniform(lower, upper): + N = upper - lower + 1 + return np.random.choice(N, p=[1 / N for i in range(N)]) + lower + + +def get_reducible(): + # number of zeros and singularities in the reducible part + M = integer_uniform(1, 4) + # M = integer_uniform(1, 7) + # positions of zeros and singularities of the reducible part + # zeros_and_sings = [random.uniform(0, 1) for i in range(M)] + zeros_and_sings = [sp.Rational(random.uniform(0, 1)) for i in range(M)] + + # multiplicity of each zero/singularity + multiplicities = [discrete_distribution( + [-2, -1, 0, 1, 2], [1/8, 1/8, 1/2, 1/8, 1/8]) for i in range(M)] + # vertical scaling/horizontal asymptote if applicable + # h = np.random.normal(0, 5) + h = sp.Rational(np.random.normal(0, 5)) + + # conclude numerator and denominator + numerator = 1 + denominator = 1 + for i in range(M): + if (multiplicities[i] > 0): + numerator *= (x - zeros_and_sings[i]) ** multiplicities[i] + elif (multiplicities[i] < 0): + denominator *= (x - zeros_and_sings[i]) ** (-multiplicities[i]) + + return numerator, denominator + + +def get_irreducible(): + # degree of numerator and denominator, respectively, of irreducible part + m = integer_uniform(0, 4) + n = integer_uniform(0, 4) + # m = integer_uniform(0, 5) + # n = integer_uniform(0, 5) + # coefficients for non-leading terms of numerator and denomoinator of irreducible part + # c = [random.uniform(-5, 5) for i in range(m)] + # d = [random.uniform(-5, 5) for i in range(n)] + c = [sp.Rational(random.uniform(-5, 5)) for i in range(m)] + d = [sp.Rational(random.uniform(-5, 5)) for i in range(n)] + numerator = x ** m + for i in range(m): + numerator += c[i] * x ** i + denominator = x ** n + for i in range(n): + denominator += d[i] * x ** i + + return numerator, denominator + + +def get_random_rational_function(): + + irred_numerator, irred_denominator = get_irreducible() + red_numerator, red_denominator = get_reducible() + + return red_numerator * irred_numerator, red_denominator * irred_denominator diff --git a/src/cyllene/MathFunctions/math_rfunction.py b/src/cyllene/MathFunctions/math_rfunction.py index 7ac958d..eef433e 100644 --- a/src/cyllene/MathFunctions/math_rfunction.py +++ b/src/cyllene/MathFunctions/math_rfunction.py @@ -5,7 +5,6 @@ class RFunction: - """ Basic class to represent a single-variable, real-valued function. @@ -48,7 +47,7 @@ def __init__(self, data, variable="x", mylocals=None): # Initialize all basic function attributes with dummy values self.sym_form = sp.sympify('0') self.table = {} - self.variable = sp.Symbol('x', real=True) + self.variable = sp.Symbol(variable, real=True) self.lambda_form = sp.lambdify( self.variable, self.sym_form, modules="sympy") self.domain = sp.EmptySet @@ -81,7 +80,7 @@ def set_function_from_expression(self, data, variable='x', mylocals=None): except ValueError: raise ValueError(str(variable) + " is not a valid variable") - [new_expr, self.issues] = define_expression( + [new_expr, _] = define_expression( data, mylocals, eval_mode=True ) @@ -133,3 +132,48 @@ def set_function_from_table(self, data: list, variable="x"): self.status = "finite" except ValueError: raise ValueError("Invalid value list") + + @property + def zeros(self): + if self.status == 'symbolic': + return sp.solveset(self.sym_form, self.variable, domain=sp.S.Reals) + elif self.status == 'finite': + zeros = sp.EmptySet + for a in self.domain: + if a == 0: + zeros.union({a}) + return zeros + else: + return None + + @property + def critical_points(self): + + if self.status == 'symbolic': + # for symbolic functions, follow usual def of critical point + diff = sp.diff(self.sym_form, self.variable) + non_def = sp.Complement(self.domain, continuous_domain( + diff, self.variable, sp.S.Reals)) + diff_zeros = sp.solveset(diff, self.variable, domain=sp.S.Reals) + + return sp.Union(non_def, diff_zeros) + elif self.status == 'finite': + # for finite functions, every point is a critical point + return self.domain + else: + return None + + @property + def inflection_points(self): + + if self.status == 'symbolic': + # for symbolic function, find args for potential inflection points + # following the usual procedure + diff_two = sp.diff( + sp.diff(self.sym_form, self.variable), self.variable) + non_def = sp.Complement(self.domain, continuous_domain( + diff_two, self.variable, sp.S.Reals)) + diff_zeros = sp.solveset( + diff_two, self.variable, domain=sp.S.Reals) + + return sp.Union(non_def, diff_zeros) diff --git a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_basic-checkpoint.py b/src/cyllene/MathProblems/.ipynb_checkpoints/problem_basic-checkpoint.py deleted file mode 100644 index 3df715d..0000000 --- a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_basic-checkpoint.py +++ /dev/null @@ -1,72 +0,0 @@ -import string - - -class Problem: - """ - Defines class for basic problem handling: statement, type, answer - and checking - - attributes: - name (string): problem name - statement (string): general statement of the problem, such as - "Find the derivative of ..." - solution (string, optional) - """ - - def __init__( - self, - problem_id="", - title="", - statement="", - answer="", - solution="", - tags=None - ): - - self.problem_id = problem_id - self.title = title - self.statement = statement - self.answer = answer - self.solution = solution - - if tags is None: - self.tags = [] - - def load_json(self, json_dict): - - dict_keys = ["statement", "answer", - "problem_id", "solution", "tags", "title"] - - for key in dict_keys: - if key in json_dict.keys(): - setattr(self, key, json_dict[key]) - - -class MultipleChoice(Problem): - def __init__( - self, - problem_id="", - title="", - statement="", - choices=None, - solution="", - tags=None - ): - - if isinstance(choices, list) and len(choices) > 0: - self.choices = choices - self.correct_answer = str(choices[0]) - else: - self.choices = [] - self.correct_answer = "" - - super().__init__(problem_id, title, statement, - self.correct_answer, solution, tags=tags) - - def load_json(self, json_dict): - - super().load_json(json_dict) - - if "choices" in json_dict and isinstance(json_dict["choices"], list) and len(json_dict["choices"]) > 0: - self.choices = json_dict["choices"] - self.correct_answer = str(self.choices[0]) diff --git a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_instantiator-checkpoint.py b/src/cyllene/MathProblems/.ipynb_checkpoints/problem_instantiator-checkpoint.py deleted file mode 100644 index 8bcd386..0000000 --- a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_instantiator-checkpoint.py +++ /dev/null @@ -1,36 +0,0 @@ -from sympy import sympify, Rational -from math import ceil, sqrt - -from cyllene2.MathProblems.problem_aux import my_random_int, pick_from, pick_one, commas, dfraction, line_fraction - -FUNCTION_DICT = {"randnum": my_random_int, - "pick": pick_from, - "pickone": pick_one, - "abs": abs, - "ceil": ceil, - "fraction": Rational, - "sqrt": sqrt, - "commas": commas, - "max": max, - "min": min, - "dfraction": dfraction, - "line_fraction": line_fraction - } - - -def instantiate_expression(expr, instantiation_dictionary): - """ - Tries to instantiate an expression using - a dictionary of parameters (variables and functions) - by running sympify - """ - - try: - value = sympify(expr, locals=instantiation_dictionary | FUNCTION_DICT) - - except Exception as e: - print("Cannot instantiate expression: ", expr) - print(e) - value = None - - return value diff --git a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_parameter-checkpoint.py b/src/cyllene/MathProblems/.ipynb_checkpoints/problem_parameter-checkpoint.py deleted file mode 100644 index 9967093..0000000 --- a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_parameter-checkpoint.py +++ /dev/null @@ -1,68 +0,0 @@ -from cyllene2.MathProblems.problem_basic import Problem, MultipleChoice -from cyllene2.MathProblems.problem_instantiator import instantiate_expression -from cyllene2.MathProblems.problem_substitution import substitute_parameter_string - - -class ParameterProblem(Problem): - - def __init__( - self, - problem_id="", - title="", - statement="", - answer="", - solution="", - tags=None - ): - - super().__init__(problem_id, title, statement, - answer, solution, tags) - - def instantiate_problem(self, external_parameters): - """ - instantiate statements, choices, solution - using dictionary external_parameters - """ - - self.instantiatied_statement = substitute_parameter_string( - self.statement, **external_parameters - ) - - self.instantiated_solution = substitute_parameter_string( - self.solution, **external_parameters - ) - - -class MultipleChoiceParameterProblem(MultipleChoice, ParameterProblem): - - def __init__(self, - problem_id="", - title="", - statement="", - choices=None, - solution="", - tags=None): - - super(MultipleChoice, self).__init__(problem_id, title, statement, - choices, solution, tags) - - def instantiate_problem(self, external_parameters): - - super().instantiate_problem(external_parameters) - - if not isinstance(self.choices, list): - self.choices = [self.choices] - - self.instantiated_choices = [] - for choice in self.choices: - if isinstance(choice, str): - # if answer is a string, try to substitute parameters - self.instantiated_choices += [substitute_parameter_string( - choice, **external_parameters)] - else: - # otherwise try to instantiate value - self.instantiated_choices += [instantiate_expression( - choice, **external_parameters)] - - if len(self.instantiated_choices) > 0: - self.correct_answer = self.instantiated_choices[0] diff --git a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_substitution-checkpoint.py b/src/cyllene/MathProblems/.ipynb_checkpoints/problem_substitution-checkpoint.py deleted file mode 100644 index ad6d3c7..0000000 --- a/src/cyllene/MathProblems/.ipynb_checkpoints/problem_substitution-checkpoint.py +++ /dev/null @@ -1,61 +0,0 @@ -from string import Template -import re -from sympy import latex - -from cyllene2.MathProblems.problem_instantiator import instantiate_expression - -IDENTIFIER_STRING = "wafuienuiwnaowfooiuaneoafwjnof" - - -class LatexTemplate(Template): - # delimiter = '#' - delimiter = "@" - - -def substitute_math_vars(arg_string, **kwargs): - - t = LatexTemplate(arg_string) - - return t.safe_substitute(**kwargs) - - -def substitute_parameter_string(arg_string, **kwargs): - """ - Attempts to substitute all identifiers of the form @{key} - in arg_string, using a dictionary (kwargs). - If an identifier is unknown, try to resolve it as a math expression - using the dictionary. - """ - - # find all substitution instances - identifiers = re.findall("@\{.*?\}", arg_string) - - # extract keys - new_id_string = arg_string - key_array = [] - - # replace the keys with a generic sequence a, b, c, ... - for index, value in enumerate(identifiers): - new_id_string = new_id_string.replace( - value, "@{" + IDENTIFIER_STRING + str(index) + "}", 1 - ) - key_array.append(value[2:-1]) - - # try to instantiate keys, save value in dict - val_dict = {} - string_dict = {} # texified version of val_dict, for printing - - for index, value in enumerate(key_array): - - instance = instantiate_expression(value, kwargs) - - val_dict[IDENTIFIER_STRING + str(index)] = instance - - # unless the instantiated expression is a string, convert to latex - if isinstance(instance, str): - string_dict[IDENTIFIER_STRING + str(index)] = instance - else: - string_dict[IDENTIFIER_STRING + str(index)] = latex(instance) - - # finally try to substitute safely, using the new dict - return substitute_math_vars(new_id_string, **string_dict) diff --git a/src/cyllene/MathProblems/__pycache__/problem_aux.cpython-310.pyc b/src/cyllene/MathProblems/__pycache__/problem_aux.cpython-310.pyc deleted file mode 100644 index 78765db8e6b791656af7938809231583726aeb38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3847 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 diff --git a/src/cyllene/MathProblems/__pycache__/problem_aux.cpython-39.pyc b/src/cyllene/MathProblems/__pycache__/problem_aux.cpython-39.pyc deleted file mode 100644 index cd999c1554c9adb0b25abcb3c3a471676ea41bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2808 zcmcIl&u<(x6t+D-GP_Nds;U}FOErqBDqDqYRl%h~s1hn|5k!czg+>+8WbGu=?#@nZ zZ_?e&p3*z~0X<}Igg*eG9yoA-8)xJj0wMJefCC4_XU}HyqaY5zjBLMWzj^PC{k_l0 z)Krz=`EK2B##4m+WR=5@2jx1N`Vbu_oVLgkbt7BygfD!~o-*!n|B1g8aLR+Hl!tuc z30n$z#4At8(gd&a6Br{t$)_+@c#Xe=vC8Qpsh@lfzht4#3{4DOX)>#ho)BY%b`wqc zln_mJ>5x!lG4M3oAp>7~1>2#VK4S6{?H7!*vji(l-5P7b5iQ(d@}6d;#Omc^+`uQpE{pbvpx?r>+=ie6Kl?At?+jz$}fkMlKw?x9u=fOrqiVGhTb43 zg2LaV^4Z1@8_$a1BeF<*qAU3?y80RE{Xy}Ul;{)O-@*6y2@e*@71!6p{#G@{BZcnD zEKXvXWW3Xkvu=Au$aqEQEg|eYrsI`(HqDx?u1YsW-F^02yp`(pSZR@OrFWhN zaxrqH;xvm#Q_kQyj(|wpJ-5fyzfnfMW;0k5E}nIZ&+@KTal5ND(t)bQnviO4-`RL2 ziIva`^-04dH@*^r8xJ$aYl+NMQJu}trEtfmB zjD!M2QnTpDM8td=vPpWG)mVfvvXWP0Y~mD)sLw)XNBJ^r>(o?`u*h}V$(r^E>|;lN z)LfBRzqUvUR*)eZcmN!EdURorNn2wkR7o5ATlY;^qDY>_ zv^<4wDUy6SkuvGIJu16t`%xuNn~#=PWvBfHR5gi?c#}xjrtUNOD)gqE+<*47b(x;T ztjiR|JalD?jJySDf5$;gz5=OET@uGbM=o?H6K}&tIm%%20_5?|KqhwH{+=_+AoM@h zq#&AVw(B7(-JvMlizsTc8w_pXlI+shBIImj@ou?3AlySylOgQ5EpIE)g4)t8%e6qb z`_NFR=U++w6l+zxkD1?}yvh=C7^}`u_H{xj{XWmU)e@fnLKD5P7>S6ypIV zCJ>uRYt;nrv^t44;c7<$hoH#-(_LXI<%Aae_~wMoPP?6`TX3#Uqa&2j)3k;b(JI~$ zue3lpayWM1?Pj^d`5uDZh!L~i(R3GpvfNt!vSmcax$^)RW*4zFU{5FSfZ@15O`Pud z5PC2Tn{0FBGX%qaTl#}%Y`^t^9@ay4jtp!p$bY%!6*xM4|9Q#QqsX`e#!)>dml1tF z0SmNx)c?_O*zMIABoL=6PGa!OT1&)kL+4^GKv!GqLa&2GQ(c;@%A{#a&XHTX8mrFS zKJmgNQ87x2Y=fz@PV2WGSMCBqHvLQ z+G#e{M?A0Bk@G=1hDJpG9WZh5=U2HS=X91s`w0$IVy${3xA_I-hJwKU#Z zlkfSi+Kg|P49yIE0bCX5*6zq%I8m0GNH|Grmc7^|Hp$M@^T1ieE_m`P*8U!2Ut{$U z#@_p9j2$41dq?pFY-J-~KCtoSzr@z=KDNqn6wToZk$ig>+lHI?=NC@+zra*0&BPHv z%_NPLng1D1UY{Gkt8qU^yIwl?9F-TR+zGWa4VE$lVkB1NG==#$r(?+ z4vYE;6P6cbc^w6+*UozmrgFx*w=i?}i6ePOUJhOE>q8m1T-@apz1i;YZcDsnFCA4w R2T*z^uheQ$5KTqr{sdE$se=Fj diff --git a/src/cyllene/MathProblems/__pycache__/problem_basic.cpython-310.pyc b/src/cyllene/MathProblems/__pycache__/problem_basic.cpython-310.pyc deleted file mode 100644 index 021fdbcd243d518eee6ac2ce7e5915e7aa9caf2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4192 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 diff --git a/src/cyllene/MathProblems/__pycache__/problem_handler.cpython-311.pyc b/src/cyllene/MathProblems/__pycache__/problem_handler.cpython-311.pyc deleted file mode 100644 index 7013d284b5082de2217f2c2a3a75cb54adef0d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmZ`)%}*Og6rWvt7aJQ)Fdu1Y;{}I;lL+71sz477A?+b35>#p}Rol(ZfY+?o&dgd7 zC`cSQ5GkrSRHBC*IME{dhxAs6HmbD}Rir8hZjR_Fr@oo>Zf#1(yKmlm^XARl_kM5u zb6;OCg388#Gz{^CM7;%(;QV_^0XMp&{@31Jz>Y^f@jWCwt!vFFpf#9}!fNFe=Gd0%tOb zufoAQ@sdJRe&8Y497nrLJy_X6r36;t&>p|P?fy%{!8W0r-}h=T9vX~khE@-b)+~p) zhGP#lUvJ(j->8qgVzIz;S%O&%m$>^arJf@{Z!dtkr1xR=b|9{aYpP_;hgc4H0|BD#jhEmtXMG|O025kIK}&4trV+`nt9o zf8N&|8HXv=93F+Kw>bt%FLAw@%k%kzmWt8?UTUm`l;reTW^nJ*XIsy=4y2cv@srH> zS@y%9$_I~MtiQTFdzzi|vU4pYUAxnqy1lpH4c$BuPb&s0p$BI-r}yICfOaCDRtlU7 z&leC8G9yrcz=0)Tc?+0*VB1P6?7&}bGYGMX2Q!%oFpdbFsQr21K9 zREc^A>>_>lCv+T)e*Nw=H|ynQ1zyim!+Y2px%KMK+-YjwOU-lh zMX8ye^75bjk-z&gfA=(h&&%K2UGUP{iFg2@U=kRL3NICsypMppNs4nGQje;*zZs>TZba(Ho#ULc(i+J{1&{6JA4B2C^OfTC%Jp zT8NWGzcPI=)Iu;_CK^)vTe76&Az~%}HU{F(H-SP`75*Vt(;x_bbRka1VDfKt-X}BR zeNqqq|3qy?tdv*b-;a2gm9F)7|k=OiBF P)%2~<|NTF!B7}bc&t=(_ diff --git a/src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-310.pyc b/src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-310.pyc deleted file mode 100644 index 30ab9db4bcffd2d9a817ea224d6cd0d092ddb94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmZ`(&2Jk;6rY)0+v{(~Nt~oc@_9NU$?vle1mUTUI%`Q zZ(7~}ew%LrZ^o_kj@;(kl!&hAi520CmSCbSHpE@ABi6*a*cO{&D{lYN=J(=Gy!3+b z`w1D*xGNrvSiBssyeRQE;?+l_-@Akukbd1%^i+f(Vw46Ara%!g}LfnNTed)hg;78J+?pnOa8O3c?0X)X?(Wuqh`a zv>Kt+t5E`i^|uF~9s?9)Mn^Ou1^u1=OwSp}%*t#opH&NI2D+I3#Lk_s$;^2~TvE8x z_bEAdDLLyFrI^jg1*4=W&D;wLRp8*tZ}8v!-o+hrc0x}`-#xpi`7n-DBD7!Rev)a( zRgr{+@Waf9Tq>b8#MqxeHjjO~I`rejhAdQ5KOgzyP=!(yLTUf4=b=i%VG5@~DE+J0 z>b~7Locd~#Wq8o58nSB0N;%D=Fx6+zI>3Nt= zgrVXOqTYt%{`q$BSc8j$r(vcpUDl#$9DtgU7 zhc#cS9Ks^?U_2*K-dCZ{)$Vv|dJBaJ7Czs{;#ddhR6CTh7IiDFmo@59V9fi0y;K8q zwjSlN2y_8{9^WW3Y&HCBk=+IYMMbbM3VK1#*^K=P<@6iKGX_o04%Iubrte^+M5OM4 zV4QJ2?mKqERK+QH2|ce(&F0-k&qintySQV?-loWd*QK!!YV84dPT8q}6Y4z>4*PGK z5|+Z$rp&$z%7qDqy`jno6$IR=;Dsg%8%EU;8VGj)jEhOI4Qktx*RNt6PEHlR;p!H` z5(0)mbrCiZ7A=dtta=D{5!MiP0L&VuZ~xURp?A?%5Xo5ECRbayZX3Zzcz|Ft;y^O2 ulh=ZSg`{kRyoWN6C#m=l-#z^h;9b(79oAqCdgJFX#_0e5%71&^-p+q2dcVT} diff --git a/src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-311.pyc b/src/cyllene/MathProblems/__pycache__/problem_instantiator.cpython-311.pyc deleted file mode 100644 index 07cafcb678c575c08a93a66386ff333ec6bc81f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2476 zcmb_dOK%%h6u$GYJ+|Xl;v`PfG?ONM7}}V&qAdt2s+Q6s2(MIvSzt{(*XgwLFn7jH zTsbI$N~97(MM5f-SabnFs4UnZvF$HlB4uG+sZu3i(Ve9Vsj66T&Nz03XxFLY@S^OB)aQ0Px+~1n`uRw)WVQ+N40}ARVE3s?szS zX@-u`DY}=A(gK~N<8;Eve3#LtjqG)z&6uPr7&*GHDjI{=Biepr=mS#BKg6RbCV9+j z*fq1-;L7{DZ@P|daoIB$9WI?-@VG>mYh1G2MJ{2qssIOE&#h(rbEj+4AF{f z+qwr$NnBeQ*1X_apvKH&pP9!}4ewM%aZ737okzF^`&6oV9|pc1r|^1mB}S0d5f=k6^1bg{oi@ ze~0(?!dJqI*ykgLK6sW}rQ;JPeynRDq)D3M&%!#4ba#8S70Ed{O?;*2HAC3*E3%*L zSq!mB`g;jvXM0m#hxOjwUNgj+v?6_kD1RzDN~c~DmdG+#mxQJSF(hC6JfT9FXD0Pj z-&IY=gV^v*-KVPVs1Q4hdLG=VT8HRaR6}oFHO%mebkTZd0E!Pd#{5XQsYj z!Dw)GYWFU^V%Tw^p|ZN;;6Ph38=4^sqLy3HE$`ao8QpPQzi%DAMZB!e6{B3n*?H>R z#kn){7v7mGpS^Hqo)47E3w6`-VFTqd!&~I>*Ox1_h5^YVHHOg};W7@!3%zYZYq_@@ zuGo#vN_ga|Zq+FlsE1*JhonCFxOCBjU6wBE4x^?GOD(-|VZLPR{-q_;zjV1?YrrX# zDhYldCW@`;T(lgL4|H`FoIL z^FjVlkU0hNYpPSPp1+?Nx_Lgx90vJepi{4&Z_Clh@cr!QxAL72gY4`^c6Kv6yB1lC zJpL=0Zxbmp+=Kf{DoB@p$!{pfHi^VqBVdkm!=gWgyt$UtuO zEe~JXdhR6oEphs=bWfZ*eNei0Fan$>E3QGyo)5RM*!Se{qQWP48OT#ljyxUEK6-AI zb*S%l6|y2W#XH;2Y1<6M5S|{TDMH|jbL=Rz7A1@bT4DP@;Zn`56{WC&$LTU$CFD|% zC&Ks+qr}4%KqRmi&_5UM%6H4#4}hHn`#Jc$698~iQ4)!-jc>@qoAPiV4}(5f_`2{- zVfD?Hoc?0&v$>nEZpc%c@>C#CwbNu^1e_j0S29;Tz$5rb8euSp8Jb}vvM2&36o&bN z!5<`H_AT(J!=Ot)+g`l$$02nP@_lHrfYXW>cxMA%Dc#nXJEykfgX z-J+-1YoKBt^KJvSB|#8c9z07PkRw6Aw8){LUs~k3pkG>~6!c4r zoCx}*MT$Ycw8+t*U;aCCJ4yr?dv>Qh*gf4En`i+R#*s|yLmZz%6=ctW*4`2tCyQWg nPh@gKZ33{GYR}|_T$^meS%DmTu}#v#NClEj6qmGncYB}lN9?;eAKs)PN0D