[BACK]Return to ox_math.tex CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_math / documents

Diff for /OpenXM/src/ox_math/documents/ox_math.tex between version 1.5 and 1.8

version 1.5, 2000/01/20 15:09:24 version 1.8, 2005/07/19 15:58:37
Line 1 
Line 1 
 %#!platex  %#!platex
 %% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.4 1999/11/29 12:05:15 ohara Exp $  %% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.7 2002/04/17 01:09:23 takayama Exp $
   
 \documentclass{jarticle}  \documentclass{jarticle}
 \title{Mathematica の Open XM 化について  \title{Mathematica の Open XM 化について
Line 7 
Line 7 
 }  }
 %\date{January 19, 1999}  %\date{January 19, 1999}
 %\date{July 12, 1999}  %\date{July 12, 1999}
 \date{November 25, 1999}  \date{November 25, 1999\\
   (Revised July 20, 2005)
   }
 \author{小原功任}  \author{小原功任}
   
   \def\oxmath{{\tt ox\_math}}
   
 \begin{document}  \begin{document}
 \maketitle  \maketitle
   
 \section{Open Mathematicaの構成}  \noindent
   {\bf
   注意 (2002.04.17):
   この文書は, 古いインタフェースをもとに記述してあるので,
   例はこのままでは動作しないので注意.
   math2ox.texi が最新のインタフェースのマニュアルである.
   一番の変更点は, {\tt OxStart} が pid (ox process id) を戻すようになり,
   {\tt OxParse} など多くの関数が, pid を引数として求めるようになったことで
   ある.
   たとえば, この文書の {\tt OxParse} を用いる例は, 次のように変更しないと
   いけない.}
   \begin{verbatim}
   Install["math2ox"]
   pid = OxStart["ox_sm1"]
   OxParse[pid,"(CMO_ZERO)"]
   OxPopCMO[pid]
   \end{verbatim}
   
 Open Mathmatica サーバはOpen XM クライアントおよびmathematica カーネルと  
 通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、  \section{我々が提供するもの}
 mathematica カーネルと協調して動作する。mathematica カーネルとは  
 MathLink ライブラリを利用して通信する。Open Mathmatica サーバはMathLink  我々が提供するのは二つのプログラムとそのソースである。一つ目は
   \oxmath プログラムであり、これは OpenXM サーバの一種である。二つ
   目は {\tt math2ox} であり、OpenXM クライアントである。
   
   動作環境は Solaris, Linux および Windows、対象としている Mathematica の
   バージョンは、3.0 〜 4.2 までである。バージョン 5.x については、我々が所
   有していないため調査していない。
   
   Windows 上では \oxmath は、cygwin のもとで動作する。\oxmath の Windows
   対応は藤本さんによる(2002年4月)。ありがとう。
   
   \section{Open Mathematica サーバの構成}
   
   Open Mathmatica サーバ(\oxmath)はOpen XM クライアントおよび Mathematica
   Kernel と通信する。\oxmath は起動直後に Mathematica Kernel を起動し、
   Mathematica Kernel と協調して動作する。Mathematica Kernel とは MathLink
   ライブラリを利用して通信する。つまり \oxmath は MathLink
 のラッパだと思ってよい。Open XM クライアントとの間はソケットを利用して通  のラッパだと思ってよい。Open XM クライアントとの間はソケットを利用して通
 信する。Open Mathmatica サーバはファイルディスクリプタ 3,4 が既にオープ  信する。\oxmath はファイルディスクリプタ 3,4 が既にオープ
 ンされていると思って, 3 から読み込み、4 に書き出す。  ンされていると思って, 3 から読み込み、4 に書き出す。
   
 さらに、Open Mathmatica サーバはコントロールプロセスからシグナルを受け取  さらに \oxmath には計算中断機能が必要であるが、この機能は 2003年のはじめに実装された。
 る場合がある。シグナルを受け取った場合には,相応の動作が必要であるが、現  
 在は実装していない.  SIGUSR1 (SM\_control\_reset\_connection) は計算が全  
 て終わってからOX\_SYNC\_BALL を投げるので、実際には意味がない。  
   
 \section{OX スタックマシン}  \section{OX スタックマシン}
 スタックのオブジェクトは cmo 型の変数、あるいはその派生クラスである.  スタックのオブジェクトは cmo 型の変数、あるいはその派生クラスである.
Line 41  MathLink ライブラリを利用して通信する。Open Mathmatica
Line 74  MathLink ライブラリを利用して通信する。Open Mathmatica
 サーバの各関数は cmo* を受け取り、タグをみて実際のクラスが何であるかを  サーバの各関数は cmo* を受け取り、タグをみて実際のクラスが何であるかを
 知り、動作を決定する.  知り、動作を決定する.
   
   \section{MathLink プログラミングの基礎知識}
   
   ここでは、MathLink についての基礎的事項を説明する。概ね、Mathematica
   Book~\cite{Wolfram-1996} や宮地~\cite{miyachi-1998} などを参照すればよい
   が、必ずしもこれらの書籍に明確に書かれているわけではない(探せば見つかる
   が)。
   
   まず MathLink とは、Wolfram が提供するライブラリであり、Mathematica のネッ
   トワーク対応部分に相当する。Mathematica Kernel と通信するプログラムを書
   こうとするならば、MathLink を利用する必要がある。MathLink の内部構成は明
   らかにされていないが、{\bf 大部分はネットワーク透過的}である(例外はある)。
   
   まず、MathLink の通信路で交換されるデータが何なのか、ということを理解す
   る必要がある。答は{\bf Mathematicaの式}である。これは自明ではない。
   次のような式がその例である。
   \begin{verbatim}
       EvaluatePacket[Sin[\$VersionNumber]]
       ReturnPacket[Sin[x]]
       InputNamePacket["In[1]:= "]
       MenuPacket[1,"Interrupt> "]
   \end{verbatim}
   このような *Packet[] を \cite{Wolfram-1996}ではパケットと呼んでいる.
   MathLink を用いて、確実なプログラミングをするためには、これらのパケット
   を正しく扱う必要がある。
   
   さて、Mathematica Kernel の起動および通信路の確立については省略する。
   いったん、通信路が確立されたら、
   \begin{enumerate}
   \item Mathematica Kernel に式を送る。
   \item Mathematica Kernel から式を受け取る。
   \end{enumerate}
   を繰り返すのが MathLink でのプログラミングである。
   
   \oxmath は Mathematica と以下のような意味で{\bf 文字列ベース}で通信して
   いる。まず Mathematica Kernel に評価させたい式が、C 言語の文字列で与えら
   れているとして、link で指し示すMathematica Kernel に
   \begin{verbatim}
   int ml_evaluateStringByLocalParser(char *str)
   {
       MLPutFunction(link, "EvaluatePacket", 1);
       MLPutFunction(link, "ToExpression", 1);
       MLPutString(link, str);
       MLEndPacket(link);
   }
   \end{verbatim}
   として送信する。パケットは、
   EvaluatePacket[ToExpression[{\it str}]] である。
   
   評価された結果を配列 str に格納するには、単純には次のようになる。
   \begin{verbatim}
   int receive_sample(char str[])
   {
       while (MLNextPacket(link) != RETURNPKT)
           MLNewPacket(link);
       switch(MLGetNext(link)) {
       MLTKSTR:
           MLGetString(link, &str);
           ...
       MLTKINT:
           ...
       }
       MLNewPacket(link);
   }
   \end{verbatim}
   この例では ReturnPacket[] 以外を無視しているが、実際にはこんなに単純には
   書けない。\oxmath の実装では、mlo.c の
   ml\_next\_packet(), ml\_new\_packet(), ml\_read\_packet(),
   ml\_read\_returnpacket(), ml\_read\_menupacket(), ml\_read\_textpacket()
   などを見てほしい。
   
 \section{Mathematica との通信(MathLink) について}  \section{Mathematica との通信(MathLink) について}
   
 CMO は 次のように変換されてから, MathLink を通して送られる.  CMO は 次のように変換されてから, MathLink を通して送られる.
Line 126  Mathematica から受け取ったデータは基本的に CMO\_STRING
Line 229  Mathematica から受け取ったデータは基本的に CMO\_STRING
 まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。  まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。
   
 \section{個々のスタックマシン命令の実装}  \section{個々のスタックマシン命令の実装}
 現在、実装しているのは  
   現在、実装されているのは
 SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction,  SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction,
 SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ  SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ
 で何もしない)である。  で何もしない)である。
   
   \section{\oxmath への計算中断機能の実装}
   
   \noindent
   {\bf 注意: {\tt ox\_math\_interruption.tex}
   に Risa/Asir Conference (2003) での講演原稿がある.}
   
   OpenXM プロトコルは、エンジンに対して、計算中断機能を要求する。\oxmath
   のような wrapper プログラムでは、そのような機能を実装するのは一般には難
   しいが、MathLink には Mathematica Book~\cite{Wolfram-1996} に書かれてい
   ない機能があり(\cite{MathSource-Google1}, \cite{MathSource-Google2},
   \cite{Math-Output1})、そのひとつを用いて、\oxmath に計算中断機能を実装し
   た。この節では、その実装について説明する。
   
   Mathematica Kernel に対する割り込みは、
   \begin{enumerate}
   \item MLPutMessage で Mathematica Kernel に MLInterruptMessage を送る。
   \item 通信路の後始末を行い、最終的に ReturnPacket[\$Aborted] を受け取る。
   \end{enumerate}
   ことでなされる。
   MLPutMessage は MathLink の非公開関数でネットワーク透過性はない。
   Unix と Windows では異なるが、Unix の場合、MLInterruptMessage の実体は
   SIGINT である。
   通信路の後始末には、{\bf Mathematica Kernel のバージョン依存性がある}ので、
   それを回避すると、結局、次の手順になる。
   \begin{enumerate}
   \item MLPutMessage(link, MLInterruptMessage)
   \item MenuPacket[1,"Interrupt> "] を受け取れば計算が中断されている
   \item MLPutString(link, "$\backslash$n")
   \item MenuPacket[0,"Interrupt> "] を受け取る
   \item MLPutString(link, "a")
   \item TextPacket["..."] を受け取る
   \item EvaluatePacket[0] を送って、ReturnPacket[...] をふたつ受け取る。
   最初のものが ReturnPacket[\$Aborted] である。
   \end{enumerate}
   
   最後の手順を説明する。
   ここで、ReturnPacket[\$Aborted] が素直に返ってくればいいのであるが、
   バージョン 3.x では返ってくるのに、バージョン4.xでは、何故か、
   返ってこず、次の計算を行うとき、ふたつまとめて返ってくる。
   よって、ダミーにEvaluatePacket[0] を送るのである。
   
 \section{Mathematica を OX のクライアントに}  \section{Mathematica を OX のクライアントに}
 OpenXM クライアントは Mathematica の外部プログラム({\tt math2ox})  
 の形で実現されている。  
 すなわち、Mathematica -- math2ox の間は MathLink プロトコルで、  
 math2ox -- OpenXM サーバの間は OpenXM プロトコルで通信し、  
 math2ox が適切に情報を変換しながらやりとりする。  
 その意味で wrapper の一種であるとも言える。  
   
   OpenXM クライアントは Mathematica の外部プログラム({\tt math2ox}) の形で
   実現されている。すなわち、Mathematica と math2ox の間は MathLink プロト
   コルで、math2ox と OpenXM サーバの間は OpenXM プロトコルで通信し、
   math2ox が適切に情報を変換しながらやりとりする。その意味で wrapper の一
   種であるとも言える。
   
 利用するには、最初に  利用するには、最初に
 \begin{verbatim}  \begin{verbatim}
 In[1]:= Install["math2ox"]  In[1]:= Install["math2ox"]
Line 223  typedef unsigned long int mp_limb_t;  
Line 368  typedef unsigned long int mp_limb_t;  
 \bibitem{Openxxx-1998}  \bibitem{Openxxx-1998}
 野呂正行, 高山信毅.  野呂正行, 高山信毅.
 {Open XM の設計と実装 --- Open message eXchange protocol for Mathematics},  {Open XM の設計と実装 --- Open message eXchange protocol for Mathematics},
 1999/11/22  November 22, 1999, Revised March 4, 2005.
 \bibitem{Ohara-Takayama-Noro-1999}  \bibitem{Ohara-Takayama-Noro-1999}
 小原功任, 高山信毅, 野呂正行.  小原功任, 高山信毅, 野呂正行.
 {Open asir 入門}, 1999, 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).  {Open asir 入門}, 1999, 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).
Line 235  typedef unsigned long int mp_limb_t;  
Line 380  typedef unsigned long int mp_limb_t;  
 Stephen Wolfram.  Stephen Wolfram.
 {The Mathematica Book}, Third edition,  {The Mathematica Book}, Third edition,
 Wolfram Media/Cambridge University Press, 1996.  Wolfram Media/Cambridge University Press, 1996.
   
 \bibitem{miyachi-1998}  \bibitem{miyachi-1998}
 宮地力.  宮地力.
 {Mathematica によるネットワークプログラミング},  {Mathematica によるネットワークプログラミング},
 岩波コンピュータサイエンス,  岩波コンピュータサイエンス,
 岩波書店, 1998.  岩波書店, 1998.
   \bibitem{MathSource-Google1}
   Todd Gayley.
   [mg17015] in MathArchive,
   1999 April.
   \bibitem{MathSource-Google2}
   昔の MathLink にあった MLSignal の解説.
   (以前、Google のキャッシュにあったが、もうない)
   \bibitem{Math-Output1}
   mathlink.h, libMLa のシンボル表, mprep の生成するソース.
 \end{thebibliography}  \end{thebibliography}
   
 \end{document}  \end{document}

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.8

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>