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

Annotation of OpenXM/src/ox_math/documents/ox_math.tex, Revision 1.2

1.1       ohara       1: %#!platex
                      2: %% $OpenXM$
                      3:
                      4: \documentclass{jarticle}
                      5: \title{Mathematica の Open XM 化について
                      6: % \\ {\small --- Open Mathematica サーバの内部構成 ---}
                      7: }
                      8: %\date{January 19, 1999}
                      9: \date{July 12, 1999}
                     10: \author{小原功任}
                     11:
                     12: \begin{document}
                     13: \maketitle
                     14:
                     15: \section{Open Mathematicaの構成}
                     16:
                     17: Open Mathmatica サーバはOpen XM クライアントおよびmathematica カーネルと
                     18: 通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、
                     19: mathematica カーネルと協調して動作する。mathematica カーネルとは
                     20: MathLink ライブラリを利用して通信する。Open Mathmatica サーバはMathLink
                     21: のラッパだと思ってよい。Open XM クライアントとの間はソケットを利用して通
                     22: 信する。Open Mathmatica サーバはファイルディスクリプタ 3,4 が既にオープ
                     23: ンされていると思って, 3 から読み込み、4 に書き出す。
                     24:
                     25: さらに、Open Mathmatica サーバはコントロールプロセスからシグナルを受け取
                     26: る場合がある。シグナルを受け取った場合には,相応の動作が必要であるが、現
                     27: 在は実装していない.  SIGUSR1 (SM\_control\_reset\_connection) は計算が全
                     28: て終わってからOX\_SYNC\_BALL を投げるので、実際には意味がない。
                     29:
                     30: \section{OX スタックマシン}
                     31: スタックのオブジェクトは cmo 型の変数、あるいはその派生クラスである.
                     32: つまり、Open XM 規約で定められたデータ形式を流用している.
                     33: % cmo 構造体およびその派生クラスは/home/ohara/openxxx/lib/oxlib.h で定義さ
                     34: % れている.
1.2     ! ohara      35: この方法の利点は Open XM プロトコルを通して通信するにあたって
1.1       ohara      36: 特にデータの変換を必要としないことである.  すなわちCMO の各データタイプ
                     37: は Open Mathematicaサーバ(スタックマシン)の内部でも, CMO として保持する
                     38: わけである.
                     39:
                     40: サーバの各関数は cmo* を受け取り、タグをみて実際のクラスが何であるかを
                     41: 知り、動作を決定する.
                     42:
                     43: \section{Mathematica との通信(MathLink) について}
                     44:
                     45: CMO は 次のように変換されてから, MathLink を通して送られる.
                     46:
                     47: \begin{enumerate}
                     48: \item CMO\_INT32 は MLTKINT (多倍長整数型).
                     49: \item CMO\_STRING は MLTKSTR (文字列型).
                     50: \item その他のタイプの CMO は ToExpression[文字列] として送る.
                     51: \end{enumerate}
                     52:
                     53: 上で述べられている ToExpression は Mathematica の組み込み関数であり,
                     54: 文字列を引数として Mathematica の式を返す.
                     55: (\cite[pp.407]{Wolfram-1996})
                     56:
                     57: ここで一つ注意をしておく.
                     58: MathLink では, int 型以外のデータを MLTKINT として送ることは残念ながらで
                     59: きない.  したがって CMO\_ZZ を直接, 整数型であると Mathematica に思わせ
                     60: ることはできないのである.  そこで, 次のような方法をとることになる.
                     61:
                     62: \begin{verbatim}
                     63: char *CONVERT_ZZ_TO_CSTRING(cmo_t zz);
                     64:
                     65: int main()
                     66: {
                     67:   char *s;
                     68:   cmo_t zz;  /* zz.tag == CMO_ZZ */
                     69:   MLINK lp;  /* MathLink Socket */
                     70:   ...
                     71:   s = CONVERT_ZZ_TO_CSTRING(zz);
                     72:   MLPutFunction(lp, "ToExpression", 1);
                     73:   MLPutString(lp, s);
                     74:   ...
                     75: }
                     76: \end{verbatim}
                     77:
                     78: このようにすると, Mathematica 側では, 例えば
                     79: \[
                     80: \mbox{\tt ToExpression["1234567890"]}
                     81: \]
                     82: という評価が行われ, 文字列データから整数が復元される.
                     83:
                     84: 逆に, Mathematica から送られた整数データは,
                     85: マシン整数の範囲内であれば, int として
                     86: 取得可能(MLGetInteger を使う)であるが,
                     87: 受け取る前に int に収まるか否かを知ることはできない.
                     88: また, 直接 CMO\_ZZ として取得することも不可能である.
                     89: (MathLink 上でどのような形式でデータ交換されているのかの
                     90: 情報は手元にある資料からは得られなかった)
                     91:
                     92: しかしながら, たとえ Mathematica 側から整数データが送られていたとしても,
                     93: そのデータを文字列に変換して受け取ることは MathLink の機構上可能である.
                     94:
                     95: これを利用して, 我々は次のようにして整数を受け取る.
                     96: \begin{verbatim}
                     97: cmo_t CONVERT_CSTRING_TO_ZZ(char *s);
                     98:
                     99: int main()
                    100: {
                    101:   MLINK lp;
                    102:   char *s;
                    103:   cmo_t zz;
                    104:   ...
                    105:   if(MLGetNext(lp) == MLTHINT) {
                    106:     MLGetString(lp, &s);
                    107:     zz = CONVERT_CSTRING_TO_ZZ(s);  /* zz.tag == CMO_ZZ */
                    108:   }
                    109:   ...
                    110: }
                    111: \end{verbatim}
                    112:
                    113: つまり、Mathematica から整数データを文字列として受け取り、
                    114: その文字列を OX サーバ側で CMO\_ZZ に直している。
                    115:
                    116: 基本的に MathLink では全てのデータを文字列で受け取るしか方法はない。どの
                    117: ような種類のデータであるかは受け取る前に知ることはできる。データの型は、
                    118: MLTKERR(エラー), MLTKINT(整数), MLTKSTR(文字列), MLREAL(実数), MLTKSYM
                    119: (シンボル), MLTKFUNC(関数) のいずれかである。このような事情で
                    120: Mathematica から受け取ったデータは基本的に CMO\_STRINGとしてスタックに積
                    121: まれるので、クライアント側でその文字列の解釈をする必要がでてくる。
                    122:
                    123: しかしながら、全ての MathLink オブジェクトが文字列に変換できるわけではな
                    124: いので、その取り扱いには注意を要する。
                    125: まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。
                    126:
                    127: \section{個々のスタックマシン命令の実装}
                    128: 現在、実装しているのは
                    129: SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction,
                    130: SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ
                    131: で何もしない)である。
                    132:
                    133: \section{Mathematica を OX のクライアントに}
                    134:
                    135: \begin{verbatim}
                    136: In[1]:= Install["math2ox"]
                    137: \end{verbatim}
                    138: とすると、外部プログラムをロードし、
                    139:
                    140: \begin{verbatim}
                    141: In[2] := OxStart["ox_sm1"]
                    142: \end{verbatim}
                    143: によって OpenXM サーバに接続する。接続先は ox\_sm1 である。
                    144:
                    145: 接続が成功したら適当にデータを送ってみよう。
                    146: 利用できるコマンドは
                    147: {\tt OxStart[s\_String], OxExecute[s\_String], OxPopString[], OxClose[], OxReset[]}
                    148: の五つである。計算が終わったら、
                    149: \begin{verbatim}
                    150: In[3] := OxClose[]
                    151: \end{verbatim}
                    152: とすると、接続が終了する。
                    153:
                    154: \appendix
                    155: \section{付録}
                    156:
                    157: GMP における ``整数型'' {\tt mpz\_t} はつぎのような
                    158: 内部表現を持つ: \\
                    159: まず  {\tt mpz\_t} 型は
                    160: \begin{verbatim}
                    161: typedef struct __mpz_struct mpz_t[1];
                    162: \end{verbatim}
                    163: と typedef されており,
                    164: {\tt mpz\_t} 型の変数は(関数の仮引数でない限り)配列の
                    165: 扱いである. また,
                    166: \begin{verbatim}
                    167: typedef unsigned long int mp_limb_t;
                    168: \end{verbatim}
                    169: と宣言されている場合には,
                    170: 変数 {\tt mpz\_t x} の {\tt x->\_mp\_d} が unsigned long int の
                    171: 配列であり, データの実体である.
                    172: これは整数の最下位4バイトが配列の先頭にくる.
                    173: つまり全体としては``リトルエンディアンっぽい''が,
                    174: 各 unsigned long int はマシンのネイティブな integer である.
                    175: つまり, GMP の内部表現はマシン依存となっている.
                    176:
                    177: \begin{thebibliography}{99}
                    178: \bibitem{Openxxx-1998}
                    179: 野呂正行, 高山信毅.
                    180: {Open xxx の設計と実装, xxx = asir,kan}, 1998/10/11
                    181: \bibitem{Ohara-Takayama-Noro-1999}
                    182: 小原功任, 高山信毅, 野呂正行.
                    183: {Open asir 入門}.
                    184: \bibitem{Wolfram-1992}
                    185: ウルフラム.
                    186: {Mathematica (日本語版)},
                    187: アジソンウエスレイ, 1992.
                    188: \bibitem{Wolfram-1996}
                    189: Stephen Wolfram.
                    190: {The Mathematica Book}, Third edition,
                    191: Wolfram Media/Cambridge University Press, 1996.
                    192:
                    193: \bibitem{miyachi-1998}
                    194: 宮地力.
                    195: {Mathematica によるネットワークプログラミング},
                    196: 岩波コンピュータサイエンス,
                    197: 岩波書店, 1998.
                    198: \end{thebibliography}
                    199:
                    200: \end{document}

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