Annotation of OpenXM/src/ox_math/documents/ox_math.tex, Revision 1.1
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: % れている.
! 35: この方法の利点は open xm プロトコルを通して通信するにあたって
! 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>