asukaminato0721 / PyF1

A detailed help manual for sympy
13 stars 2 forks source link

目前需要一个 Notebook 转 Jupyter 的工具 #1

Open asukaminato0721 opened 4 years ago

asukaminato0721 commented 4 years ago

截至目前所有的代码都是直接手敲,工作量过于巨大+耗时。

所以思路就是,.nb -> .ipynb for mma -> .ipynb for python

找到了这个问题回答,并找到了酱紫君写的项目 . 但是他没写使用方法。。。 目前还需要继续探索。

以及一个简单的 Python 脚本,用于快速但不鲁棒地转换代码。(sympy 内置的 Mathematica 转换太弱了,我提过几个 pr)

from clipboard import copy, paste
copy(str(paste()).replace("Hypergeometric2F1", "hyper").replace("D", "diff").replace(
    "[", "(").replace("]", ")").replace("{", "(").replace("}", ")").lower().replace("^", "**"))
)
asdasd1dsadsa commented 4 years ago

这是俩问题,第一步我感觉就这样用 Notebook2Jupyter[nb_NotebookObject] 就可以了。第二步是要生成py代码吗,这个不容易吧,大概是先用AST生成python代码再替换关键字?我不会这些。

asukaminato0721 commented 4 years ago

现在我的工序是:

  1. 在 mma 官网的帮助里点击,复制 mma 代码
  2. 运行 .py 脚本直接在剪贴板转换代码,简单粗暴,直接替换括号+关键字,然后小问题人工修补
  3. 粘贴到 .ipynb 运算。

但这样只做了一行,比如对于 integrate 这种巨型函数,太耗时了。

我在想,先把 .nb 变成 .ipynb (帮助是 nb 文件,应该能转换),然后 .ipynb 本质是个 .json 文件,我在里面就能批量执行第二步。(正则 .*? 替换)


那个包我试了 << ,没法成功导入。不知道是不是操作不对。而且看样子也没做 .paclet 包。

asdasd1dsadsa commented 4 years ago

实在不行你就把包里代码手动计算一遍。有一点要注意,那个包转换的应该是Default样式的笔记本,而帮助文档用的是Reference样式表,可能包含那个包所不支持的样式。

asukaminato0721 commented 4 years ago

我。。。应该是试出来了?

https://github.com/GalAster/JupyterConvert/blob/master/Kernel/Notebook2Jupyter.m

把这个文件的代码复制到 .m 里再 << 进来

Notebook2Jupyter 就变黑了。

但是 image

然后我搜了一下,在 info 看到了 MathematicaVersion -> "12.0+" , 所以估计是 12.0 增加了功能,11.3 就不行了。(没有 12.0+ 的版本,无法测试)

Lemmingh commented 4 years ago

计算不是问题,可以搁 CI 跑

打开 ipynb。对每一个 code cell,如果 execution_count == null 就处理,也可以强制都处理(毕竟某些 cell 可能有错误、改动,人工排查不现实)。

  1. source,判断每一句的作用,适当处理eval()。结果存到变量 v
  2. 填写 outputsdata 中的 key 都是 MIME 类型,那么
    • text/latexr'${ \displaystyle ' + latex(v) + r' }$'
    • text/plainstr(v)
    • 如果 v 是图片,不妨先 save(),再读取出来,base64 编码,末尾似乎需要加个换行 (\n)。
  3. 填写 execution_countoutput_type 等。

需要注意,Jupyter 默认的缩进是 1 个空格。JSON serializer 也要这样设置 (indent=1)。

参看

为什么要 Wolfram Notebook 转 Jupyter Notebook

这个 issue 的起点令我困惑。我想请教一下,为什么要这样做?

按我的理解,这个项目想要参考 Wolfram Documentation 的风格,给 SymPy 写一套 manual。那么,为什么不直接编辑 ipynb

MMA 的帮助文档里唯一能用上的就是 Examples,整本转换,再滤出需要的内容,恐怕不比打开手抄简单。何不搜索所有 Input Cell 并提取?

NotebookFind[(* obj *), "Input", All, CellStyle]

参看

Wolfram Language 到 SymPy Python 的转换

构建 Wolfram 的 AST 这步,可以参考 WolframResearch/codeparser

鉴于这里的出现的代码都比较简单,自己从头构建也无妨。先用 HoldForm[FullForm[]] 处理一遍,可能会方便些:

至于变换到 Python,我也不知道该怎么办。Wolfram 的函数与 SymPy 的函数不是一一对应的,这是个大问题。