Wolframite
Clojure 与 Wolfram Language 之间的接口(支持 Mathematica 和 Wolfram Engine)。
Status
Stable
TL;DR!
我们的入门 reClojure 演讲。
什么是 Wolframite?
Wolframite(原名 Clojuratica)将当今用于高性能并行计算的两款最令人兴奋的工具结合在一起。
Clojure 是一种动态函数式编程语言,拥有引人注目的并发与状态处理方案、强大的持久不可变数据结构阵容,以及因做对了所有事情而日益增长的名声。 Wolfram Mathematica 可以说是世界上最强大的集成工具,用于数值计算、符号数学、优化和可视化,并且构建在其自身出色的函数式编程语言 Wolfram Language 之上。
通过链接这两者:
- Wolframite 允许你在 Clojure 中编写和评估 Wolfram/Mathematica 代码,并实现完全的语法集成。现在,Clojure 程序可以利用 Wolfram 庞大的数值和符号数学算法以及快速的矩阵代数例程。
- Wolframite 提供 Clojure 与 Wolfram 之间原生数据结构的无缝且透明的转换。这包括高精度数字、矩阵、N 维数组,以及已求值和未求值的 Mathematica 表达式和公式。
- Wolframite 通过为所有 Wolfram 符号提供 Clojure 函数和变量(包括 docstrings 以及在你喜爱的 IDE 中的自动补全),让你能够像编写 Clojure 一样编写 Wolfram
- [Tentative] Wolframite 实现了 Wolfram 现有并行计算能力的“Clojurization”。 Wolfram 并非为线程或并发而设计。它对并行计算有出色的支持,但并行求值是从单线程主内核发起的,该内核会阻塞直到所有并行求值返回。相比之下,Wolframite 包含一个并发框架,允许多个 Clojure 线程执行 Wolfram 表达式而不阻塞其他线程。现在,在 Clojure 中运行一个模拟,使用 1,000 个独立线程异步评估 Wolfram 中的处理器密集型表达式变得轻而易举。这些计算将被自适应且透明地分发到任意数量的处理器核心上可用的任意数量的 Wolfram 内核,无论是在本地还是跨集群、网格或网络。
- 请注意,您不能运行超过许可证允许的 Wolfram 内核数量(参见函数
(wolframite.core/kernel-info!))
- 请注意,您不能运行超过许可证允许的 Wolfram 内核数量(参见函数
Wolframite 是开源的,面向科学计算、计算经济学、金融以及其他依赖并行化模拟与高性能数值计算相结合的领域。Wolframite 让程序员能够使用 Clojure 最先进的特性——便捷的并发与多线程、不可变持久数据结构以及软件事务内存——同时结合 Wolfram 易于使用的数值、符号数学、优化、统计、可视化和图像处理算法。
Wolfram / Mathematica 本身是商业产品,需要许可证。尽管 Wolfram Engine 在开发中是免费使用的。
文档
无论您对 Clojure 或 Wolfram 的经验水平如何,我们都能为您提供支持!
虽然本页在假设您对每个系统有一定了解的前提下,简要概述了 Wolframite,但我们还提供了面向新接触 Clojure 的科学家 以及新接触 Wolfram 的 Clojure 开发者的教程。不过,在深入教程之前,您应该尝试阅读本页、快速入门,并浏览理解 Wolframite。如果您从未接触过 Clojure,您可能想先快速浏览我们的Clojure 入门指南,以更好地理解其余的文档。请记住:您不需要一次性学习或记住所有内容。
用法
先决条件:
Clojure
首先,如果你还没有安装,请安装 Clojure CLI 工具链(在 Mac 或 Linux 上,使用 homebrew 是一种很好的方式,但如果你更喜欢,也可以直接使用安装脚本)。
Wolfram Mathematica 或 Wolfram Engine
接下来,显然,你需要确保已安装 Wolfram Engine 或 Wolfram 桌面应用程序(以前称为 Mathematica),并且已注册你的许可证。在尝试 Wolframite 之前,请确保能够单独运行这些工具。
首先,你需要初始化到 Wolfram/Mathematica 内核的连接,如下所示:
(wolframite.api.v1/start!)
这还应该找到并加载随你的安装附带的 JLink JAR。通过 clojure.tools.logging 在标准输出中观察类似以下的 INFO 日志消息:
=== Adding path to classpath: /Applications/Wolfram Engine.app/Contents/Resources/Wolfram Player.app/Contents/SystemFiles/Links/JLink/JLink.jar ===
然而,有时 Wolframite 可能无法自动找到正确的路径,需要你的帮助。你可以设置 WOLFRAM_INSTALL_PATH 环境变量,
export WOLFRAM_INSTALL_PATH=/opt/mathematica/13.1
export WOLFRAM_INSTALL_PATH="/Applications/Wolfram Engine.app/Contents/Resources/Wolfram Player.app/Contents"
,或 Java 系统属性,
aliases {... :alias-name {:jvm-opts ["-DWOLFRAM_INSTALL_PATH=/usr/local/Wolfram/WolframEngine/14.2"]}
,(后者优先)指向正确的位置。
入门
启动一个带有 Wolframite 在类路径上的 Clojure REPL:
clj -Sdeps '{:deps {org.scicloj/wolframite {:mvn/version "1.0.0-SNAPSHOT"}}}'
并尝试一下:
(require '[wolframite.api.v1 :as wl]
'[wolframite.wolfram :as w :refer :all ; Wolfram symbols as Clojure vars / fns
:exclude [* + - -> / < <= = == > >= fn
Byte Character Integer Number Short String Thread]])
;; Initialize
(wl/start!) ; => {:status :ok, :wolfram-version 14.1, :started? true}
;; Use it:
(wl/! (Dot [2 2 4] [4 5 6]))
;=> 42
更多示例:
(wl/! (D (Power 'x 2) 'x)) ; derivative
;=> (* 2 x)
(wl/! (ChemicalData "Ethanol" "MolarMass"))
;=> (Quantity 46.069M (* "Grams" (Power "Moles" -1)))
;; Accessing WolframAlpha (BEWARE: must be online)
(wl/! (WolframAlpha "How many licks does it take to get to the center of a Tootsie Pop?"))
;=> [(-> [["Input" 1] "Plaintext"] "How many licks does it take to get to the Tootsie Roll
; center of a Tootsie Pop?") (-> [["Result" 1] "Plaintext"] "3481\n(according to student
; researchers at the University of Cambridge)")]
(wl/! (N Pi 20)) ; numerical value with 20 digit precision
;=> 3.141592653589793238462643383279502884197169399375105820285M
(wl/! (Map (w/fn [x] (Sqrt x)) [4 16]))
;=> [2 4]
TIP: Cursive - 教它解析 w/fn 为 clojure.core/fn。
NOTE: wolframite.wolfram (w) 命名空间包含 Wolframite 最后一次发布时所有 Wolfram 符号的变量。检查 w/*wolfram-kernel-name* 以获取内核类型/版本,并运行 (wolframite.impl.wolfram-syms.write-ns/write-ns!)
以生成你自己的 wolfram ns,包含你的 Wolfram/Mathematice 中可能存在的任何额外符号,和/或自定义“别名”。
Clerk 集成
我们主要使用 Clay 作为我们的笔记本工具,但也有对 Clerk 的实验性支持。
用法示例:(监视文件夹中的更改)
user> (require '[wolframite.tools.clerk-helper :as ch])
user> (ch/clerk-watch! ["dev/notebook"])
- 打开
dev/notebook/quickstart.clj,进行更改并保存。 - 在浏览器中打开
localhost:7777
工作原理?
您使用 wolframite.wolfram 中的便捷函数和变量来编写 Wolfram 表达式。这些表达式首先被转换为自身的符号表示,然后被转换为 JLink Expr 对象的树,并发送到由 wl/start! 启动的 Wolfram 内核子进程中进行求值。结果从 jlink.Expr 转换回 Clojure 形式。这种转换允许一些额外的便捷逻辑,例如支持 w/* 而不是 Times。
开发
运行测试
要从命令行运行测试,您需要将 JLink 添加到类路径中(仅 REPL 支持动态加载 jar 文件)-
创建一个 ./symlink-jlink.jar 符号链接,然后运行测试:
clojure -X:run-tests
部署与发布
发布流程如下:
- 清理(
rm -rf ./target) - 运行_测试_(见上文,
clojure -X:run-tests)。 - 更新_版本_(见下文),并确保
CHANGELOG.md也已更新 - 构建并部署到 Clojars - 见下文
- 创建并推送带有版本的 标签(例如
git tag v1.3.0 && git push --tags) - 重新构建、提交并推送 站点(
clojure -T:build site+ 提交,推送)
如有需要,请在 deps.edn 下的 :aliases - :neil - :project - :version 中更新版本(可能使用 neil)。
然后使用 clojure -T:build jar 构建 jar,然后使用
env CLOJARS_USERNAME=<tbd> CLOJARS_PASSWORD=<clojars-token> clojure -T:build deploy 进行部署。
注意:您需要登录 Clojars 并生成部署令牌。您还需要由管理员添加到 那里的 SciCloj 组中。
当您想要深入了解 JVM ↔ Wolfram 通信时,请考虑研究 Wolfram 的指南 编写使用 Wolfram 语言的 Java 程序 和 WSTP 与外部程序通信
编写文档
文档以字面编程源码的形式编写在 notebooks 目录中,并使用 Clay
和 Quarto 在 docs 下转换为 HTML。
要渲染单个命名空间/页面,请 require Clay 并运行 (clay/make! {:source-path "<path to the file>""})。提示:您也可以在不使用 quarto 的情况下执行此操作 - 只需将 :run-quarto false 添加到选项中。
要构建整个站点,请运行 clojure -T:build site(记得确保您拥有 ./symlink-jlink.jar 符号链接)。
作者
最初的 Clojuratica,Wolframite 的前身,由麻省理工学院和哈佛法学院研究生 Garth Sheldon-Coulson 创建。
多年来持续的维护和发展得益于
最近,Clojuratica 已被改造为 Wolframite,由
- Pawel Ceranka,
- Thomas Clark 和
- Jakub Holý;
负责,并作为 SciCloj 项目的一部分进行维护。Wolframite 是免费的开源软件,但如果您希望支持我们的工作,请引用我们。
@software{Holý_2024},
author = {Holý, Jakub and Clark, Thomas and Ceranka, Pawel and Richards, Norman and Farmer, Dan and Chan, Steve and Sheldon-Coulon, Garth},
license = {Mozilla Public License},
title = {{Wolframite: }},
url = {https://github.com/scicloj/wolframite},
version = {1.0.0-SNAPSHOT},
year = {2024}
赞助
我们感谢 Clojurists Together 的财政支持,他们于 2024 年资助了本工作一个季度。
联系方式
如果您希望联系维护者或从社区寻求其他帮助,请向我们的 zulip channel、Clojurians Slack 中的 #wolframite 频道发送消息,或联系 SciCloj 团队。
许可证
根据 Mozilla 公共许可证 2.0 版或(由您选择)任何后续版本分发。
法律声明
本网站中使用的产品名称仅用于识别目的。 所有商标和注册商标,包括 "Wolfram Mathematica",均为其各自所有者的财产。 Wolframite 不是 Wolfram Research 的产品。 本网站上的软件按“原样”提供,不附带任何明示或暗示的保证。
