[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.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>