数式からプログラムとドキュメントの自動合成


OpenGLプログラミングのライブラリをC++からPythonに移植しようとしているなかでの報告です.

GUIはPyQt,OpenGLはPyOpenGL,低レベルのデータ構造と行列演算はNumPy,数値最適化はSciPyとツールが揃っているのですが,三次元グラフィックスのための基本的な計算ライブラリだけが欠けているので,自作しました.参考にしたのはC++のためのGLM (OpenGL Mathematics)なのですが,せっかくPythonを利用するので,ちょっと面白いことに手を出してみました.

単にライブラリを移植するだけならば,すぐにできてあまり面白くはありません.今回,試したのは,ともすると混乱するさまざまな座標変換について,数学的な解説をAPIドキュメントとして記述すること,そして,それをJupyterノートブックとして作成することです.以下がその成果です.

やってみるとすぐにわかるのですが,これが結構,面倒くさいです.ある座標変換APIを作成しようと思ったら,まず,その解説を書きます.直感的な説明に加えて,数学的な内容を数式を用いて記述します.つぎに,その数式に基づいたAPIの実装を記述します.そして,テストケースを用意します.

解説部分ではMathJaxを利用してLaTeX形式で記述するのですが,座標変換を扱うので,4×4行列がばんばん出てきて,記述もかなり面倒です.おまけに,APIの実装では,LaTeXで書いたのとほとんど同じような記述をPythonでやることになって間抜けな気がします.

そこで,以前にSciPyのチュートリアルで見つけて気になっていた数式処理システムのSymPy (Symbolic Python)を使ってみました.SymPyは数式処理なので,数式を構成することができます.さらにSymPyの数式をLaTeX化したり,Pythonの関数に変換することができるのです.

つまり,今回のような数式を基礎とするコードの場合,SymPyの数式を中心に添えて,ドキュメントもコードも数式から合成することができるのです.

雰囲気は上の画像のような感じです.2行目で拡大縮小変換に用いる行列の雛形を用意し,3行目でそれをλ抽象してPythonの関数を合成しています.5行目以後でドキュメントを生成しています.md関数はぼくが作った簡単なサポート関数で,MarkDown形式の文字列とSymPyの数式を与えると適宜整形してドキュメントを表示するようになっています.

詳しくは実際の実装をご覧下さい.