[BACK]Return to gtt_ekn-ja.texi CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / doc / gtt_ekn

Annotation of OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi, Revision 1.8

1.8     ! takayama    1: %% $OpenXM: OpenXM/src/asir-contrib/packages/doc/gtt_ekn/gtt_ekn-ja.texi,v 1.7 2017/08/31 06:31:45 takayama Exp $
1.7       takayama    2: %% xetex gtt_ekn.texi   (.texi までつける. )
1.6       takayama    3: %% 以下コメントは @comment で始める.  \input texinfo 以降は普通の tex 命令は使えない.
1.7       takayama    4: \input texinfo-ja
1.1       takayama    5: @iftex
                      6: @catcode`@#=6
                      7: @def@fref#1{@xrefX[#1,,@code{#1},,,]}
1.7       takayama    8: @def@b#1{{@bf #1}}
1.1       takayama    9: @catcode`@#=@other
                     10: @end iftex
                     11: @overfullrule=0pt
1.7       takayama   12: @documentlanguage ja
1.1       takayama   13: @c -*-texinfo-*-
                     14: @comment %**start of header
1.6       takayama   15: @comment --- おまじない終り ---
1.1       takayama   16:
1.6       takayama   17: @comment --- GNU info ファイルの名前 ---
1.1       takayama   18: @setfilename xyzman
                     19:
1.6       takayama   20: @comment --- タイトル ---
                     21: @settitle 2元分割表HGM
1.1       takayama   22:
                     23: @comment %**end of header
                     24: @comment %@setchapternewpage odd
                     25:
1.6       takayama   26: @comment --- おまじない ---
1.1       takayama   27: @ifinfo
                     28: @macro fref{name}
                     29: @ref{\name\,,@code{\name\}}
                     30: @end macro
                     31: @end ifinfo
                     32:
                     33: @iftex
                     34: @comment @finalout
                     35: @end iftex
                     36:
                     37: @titlepage
1.6       takayama   38: @comment --- おまじない終り ---
1.1       takayama   39:
1.6       takayama   40: @comment --- タイトル, バージョン, 著者名, 著作権表示 ---
                     41: @title 2元分割表HGM関数
                     42: @subtitle Risa/Asir 2元分割表HGM関数説明書
1.8     ! takayama   43: @subtitle 1.2 版
        !            44: @subtitle 2019 年 2 月 14 日
1.1       takayama   45:
                     46: @author  by Y.Goto, Y.Tachibana, N.Takayama
                     47: @page
                     48: @vskip 0pt plus 1filll
                     49: Copyright @copyright{} Risa/Asir committers
                     50: 2004--2010. All rights reserved.
                     51: @end titlepage
                     52:
1.6       takayama   53: @comment --- おまじない ---
1.1       takayama   54: @synindex vr fn
1.6       takayama   55: @comment --- おまじない終り ---
1.1       takayama   56:
1.6       takayama   57: @comment --- @node は GNU info, HTML 用 ---
                     58: @comment --- @node  の引数は node-name,  next,  previous,  up ---
1.1       takayama   59: @node Top,, (dir), (dir)
                     60:
1.6       takayama   61: @comment --- @menu は GNU info, HTML 用 ---
                     62: @comment --- chapter 名を正確に並べる ---
                     63: @comment --- この文書では chapter XYZ, Chapter Index がある.
                     64: @comment ---  Chapter XYZ には section XYZについて, section XYZに関する関数がある.
1.1       takayama   65: @menu
1.6       takayama   66: * 2元分割表HGMの関数説明書について::
                     67: * 2元分割表HGMの関数::
                     68: * modular計算
1.1       takayama   69: * Index::
                     70: @end menu
                     71:
1.6       takayama   72: @comment --- chapter の開始 ---
                     73: @comment --- 親 chapter 名を正確に. 親がない場合は Top ---
                     74: @node 2元分割表HGMの関数説明書について,,, Top
                     75: @chapter 2元分割表HGMの関数説明書について
                     76:
                     77: この説明書では
                     78: HGM(holonomic gradient method) を用いた2元分割表の関数について説明する.
                     79: ChangeLog の項目は www.openxm.org の cvsweb で
                     80: ソースコードを読む時の助けになる情報が書かれている.
1.8     ! takayama   81: このパッケージは下記のようにロードする.
        !            82: @example
        !            83: load("gtt_ekn.rr");
        !            84: @end example
        !            85: @noindent
        !            86: 最新版の asir-contrib package を取得するには, 下記のように更新関数を呼び出す.
        !            87: @example
        !            88: import("names.rr");
        !            89: asir_contrib_update(|update=1);
        !            90: @end example
        !            91: @noindent
1.6       takayama   92: 本文中で引用している文献を列挙する.
1.1       takayama   93: @itemize @bullet
                     94: @item [GM2016]
                     95: Y.Goto, K.Matsumoto, Pfaffian equations and contiguity relations of the hypergeometric function of type (k+1,k+n+2) and their applications, arxiv:1602.01637 (version 1)
                     96: @item [T2016]
1.6       takayama   97: Y.Tachibana, 差分ホロノミック勾配法のモジュラーメソッドによる計算の高速化,
                     98: 2016, 神戸大学修士論文.
1.1       takayama   99: @item [GTT2016]
1.6       takayama  100: Y.Goto, Y.Tachibana, N.Takayama, 2元分割表に対する差分ホロノミック勾配法の実装,
1.8     ! takayama  101: 数理研講究録.
        !           102: @item [TGKT]
        !           103: Y.Tachibana, Y.Goto, T.Koyama, N.Takayama,
        !           104: Holonomic Gradient Method for Two Way Contingency Tables,
        !           105: arxiv:1803.04170
1.1       takayama  106: @item [TKT2015]
                    107: N.Takayama, S.Kuriki, A.Takemura,
                    108:          $A$-hypergeometric distributions and Newton polytopes.
                    109:          arxiv:1510.02269
                    110: @end itemize
                    111:
1.6       takayama  112: このマニュアルで説明する関数を用いたプログラム例は
1.1       takayama  113: gtt_ekn/test-t1.rr
1.6       takayama  114: など.
1.1       takayama  115:
1.4       takayama  116:
1.6       takayama  117: @node 2元分割表HGMの関数,,, Top
                    118: @chapter 2元分割表HGMの関数
1.1       takayama  119:
1.6       takayama  120: @comment --- section ``実験的関数'' の subsection xyz_abc
                    121: @comment --- subsection xyz_pqr xyz_stu がある.
1.1       takayama  122: @menu
                    123: * gtt_ekn.gmvector::
                    124: * gtt_ekn.nc::
                    125: * gtt_ekn.lognc::
                    126: * gtt_ekn.expectation::
                    127: * gtt_ekn.setup::
                    128: * gtt_ekn.upAlpha::
1.5       takayama  129: * gtt_ekn.cmle::
1.8     ! takayama  130: * gtt_ekn.set_debug_level::
1.1       takayama  131: @end menu
                    132:
1.6       takayama  133: @node 超幾何関数E(k,n),,, 2元分割表HGMの関数
                    134: @section 超幾何関数E(k,n)
1.1       takayama  135:
                    136: @comment **********************************************************
1.6       takayama  137: @comment --- ◯◯◯◯  の説明
                    138: @comment --- 個々の関数の説明の開始 ---
                    139: @comment --- section 名を正確に ---
                    140: @node gtt_ekn.gmvector,,, 超幾何関数E(k,n)
1.1       takayama  141: @subsection @code{gtt_ekn.gmvector}
1.6       takayama  142: @comment --- 索引用キーワード
1.1       takayama  143: @findex gtt_ekn.gmvector
                    144:
                    145: @table @t
                    146: @item gtt_ekn.gmvector(@var{beta},@var{p})
1.6       takayama  147: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表に付随する超幾何関数
                    148: E(k,n) の値およびその微分の値を戻す.
1.1       takayama  149: @item gtt_ekn.ekn_cBasis_2(@var{beta},@var{p})
1.6       takayama  150: の別名である.
1.1       takayama  151: @end table
                    152:
1.6       takayama  153: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  154: @table @var
                    155: @item return
1.6       takayama  156: ベクトル, 超幾何関数の値とその微分. 詳しくは下記.
1.1       takayama  157: @item beta
1.6       takayama  158: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  159: @item p
1.6       takayama  160: 二元分割表のセルの確率のリスト
1.1       takayama  161: @end table
                    162:
1.6       takayama  163: @comment --- ここで関数の詳しい説明 ---
                    164: @comment --- @itemize〜@end itemize は箇条書き ---
                    165: @comment --- @bullet は黒点付き ---
1.1       takayama  166: @itemize @bullet
                    167: @item
1.6       takayama  168: gmvector は Gauss-Manin vector の略である [GM2016].
1.1       takayama  169: @item
1.6       takayama  170: gmvector の戻り値は
                    171: [GM2016] の 6章 p.23 のベクトル Sである.
                    172: これは
                    173: [GM2016] の4章で定義されているベクトル F の定数倍であり,
                    174: その定数は
                    175: 第一成分が [GM2016] の6章で定義されている級数 S の値と等しく
                    176: なるように決められている.
1.1       takayama  177: @item
1.6       takayama  178:  r1 x r2 分割表を考える.
                    179:  m+1=r1, n+1=r2 とおく.
                    180:  正規化定数 Z は分割表 u を (m+1) × (n+1) 行列とするとき p^u/u! の和である.
                    181:  ここで和は行和列和が @var{beta} であるような u 全体でとる
1.1       takayama  182:  [TKT2015], [GM2016].
1.6       takayama  183:  S はこの多項式 Z の p を
1.1       takayama  184: @verbatim
                    185:   [[1,y11,...,y1n],
                    186:    [1,y21,...,y2n],...,
                    187:    [1,ym1, ...,ymn],
                    188:    [1,1, ..., 1]]
                    189: @end verbatim
1.6       takayama  190:  (1 が L 字型に並ぶ),
                    191: と正規化した級数である.
1.1       takayama  192: @item
1.6       takayama  193: 2x(n+1)分割表で, gmvector の戻り値を Lauricella  F_D で書くことが
                    194: 以下のようにできる
                    195: (b[2][1]-b[1][1] >= 0 の場合).
                    196: ここで b[1][1], b[1][2] は, それぞれ 1 行目の行和, 2 行目の行和,
                    197: b[2][i] は i 列目の列和である.
1.1       takayama  198: @comment ekn/Talks/2015-12-3-goto.tex
                    199: @verbatim
                    200: S=F_D(-b[1,1], [-b[2,2],...,-b[2,n+1]], b[2,1]-b[1,1]+1 ; y)/C,
                    201: @end verbatim
1.8     ! takayama  202: C=b[1,1]! b[2,2]! ... b[2,n+1]! (b[2,1]-b[1,1])!
1.6       takayama  203: とおく.
                    204: 1/C は L 字型の分割表
1.1       takayama  205: @verbatim
                    206: [[b[1,1],       0,      ..., 0       ],
                    207:  [b[2,1]-b[1,1],b[2,2], ..., b[2,n+1]]]
                    208: @end verbatim
1.6       takayama  209: に対応.
                    210: gmvector は
1.1       takayama  211: @verbatim
                    212: [S,(y11/a2) d_11 S,(y12/a3) d_12 S, ..., (y1n/a_(n+1)) d_1n S]
                    213: @end verbatim
1.6       takayama  214: である.
                    215: ここで d_ij は yij についての微分,
1.1       takayama  216: @verbatim
                    217:   [a0,     a1, ...                      ,a_(n+2)]
                    218: = [-b[1,2],-b[1,1],b[2,2], ..., b[2,n+1],b[2,1]]
                    219: @end verbatim
1.6       takayama  220: である.
1.1       takayama  221: @item
1.6       takayama  222: 周辺和 @var{beta}の時の正規化定数のセル確率 @var{p} に対する値は 多項式に退化した E(k,n) の値で表現できる. 文献 [TKT2015], [GM2016] 参照.
1.1       takayama  223: @item
1.6       takayama  224: option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう
1.1       takayama  225: [T2016].
1.6       takayama  226: 分散計算用の各種パラメータの設定は
                    227: gtt_ekn.setup で行なう.
1.1       takayama  228: @end itemize
                    229:
1.6       takayama  230: @comment --- @example〜@end example は実行例の表示 ---
                    231: 例: 次は2 x 2 分割表で行和が [5,1],  列和が [3,3], 各セルの確率が
                    232: [[1/2,1/3],[1/7,1/5]] の場合の gmvector の値である.
1.1       takayama  233: @example
                    234: [3000] load("gtt_ekn.rr");
                    235: [3001] ekn_gtt.gmvector([[5,1],[3,3]],[[1/2,1/3],[1/7,1/5]])
                    236: [775/27783]
                    237: [200/9261]
                    238: @end example
                    239:
1.8     ! takayama  240: 例: N を2以上の自然数とする時, Gauss の超幾何関数(この場合は多項式となる)
        !           241: F(-36N,-11N,2N,(1-1/N)/56) の値は T3 に代入される ( [TGKT] ).
        !           242: @comment ekn/Prog2/2x2.rr
        !           243: @example
        !           244: N=2;
        !           245: T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],[[1,(1-1/N)/56],[1,1]])[0][0];
        !           246: D=fac(36*N)*fac(11*N)*fac(2*N-1);
        !           247: T3=T2*D;
        !           248: @end example
        !           249: ちなみに同じ値を Mathematica に計算させるには
        !           250: @example
        !           251: n=2; Hypergeometric2F1[-36*n,-11*n,2*n,(1-1/n)/56]
        !           252: @end example
        !           253:
1.6       takayama  254: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    255: 計算ができる.
                    256: 守備範囲の異なるプログラム同士の比較, debug 用参考.
1.1       takayama  257: @example
                    258: [3080] import("tk_fd.rr");
                    259: [3081] A=tk_fd.marginal2abc([4,5],[2,4,3]);
1.6       takayama  260: [-4,[-4,-3],-1]  // 2変数 FD のパラメータ. a,[b1,b2],c
1.1       takayama  261: [3082] tk_fd.fd_hessian2(A[0],A[1],A[2],[1/2,1/3]);
                    262: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    263: [4483/124416,[ 1961/15552 185/1728 ],
                    264:  [ 79/288 259/864 ]
                    265:  [ 259/864 47/288 ]]
1.6       takayama  266: // 戻値は [F=F_D, gradient(F), Hessian(F)]
1.1       takayama  267:
1.6       takayama  268: // ekn_gt での例と同じパラメータ.
1.1       takayama  269: [3543] A=tk_fd.marginal2abc([5,1],[3,3]);
                    270: [-5,[-3],-1]
                    271: [3544] tk_fd.fd_hessian2(A[0],A[1],A[2],[(1/3)*(1/7)/((1/2)*(1/5))]);
                    272: Computing Dmat(ca) for parameters B=[-3],X=[ 10/21 ]
                    273: [775/27783,[ 20/147 ],[ 17/42 ]]
                    274: @end example
                    275:
1.6       takayama  276: 参考: 一般の A 分布の正規化定数についての Hessian の計算は実験的 package ot_hessian_ahg.rr
                    277: で実装のテストがされている. (これはまだ未完成のテスト版なので出力形式等も将来的には変更される.)
1.1       takayama  278: @example
                    279: import("ot_hgm_ahg.rr");
                    280: import("ot_hessian_ahg.rr");
                    281: def  htest4() @{
                    282:   extern C11_A;
                    283:   extern C11_Beta;
                    284:   Hess=newmat(7,7);
                    285:   A =C11_A;
                    286:   Beta0= [b0,b1,b2,b3];
                    287:   BaseIdx=[4,5,6];
                    288:   X=[x0,x1,x2,x3,x4,x5,x6];
                    289:   for (I=0; I<7; I++) for (J=0; J<7; J++) @{
                    290:     Idx = [I,J];
                    291:     H=hessian_simplify(A,Beta0,X,BaseIdx,Idx);
                    292:     Hess[I][J]=H;
                    293:     printf("[I,J]=%a, Hessian_ij=%a\n",Idx,H);
                    294:   @}
                    295:   return(Hess);
                    296: @}
                    297: [2917] C11_A;
                    298: [[0,0,0,1,1,1,1],[1,0,0,1,0,1,0],[0,1,1,0,1,0,1],[1,1,0,1,1,0,0]]
                    299: [2918] C11_Beta;
                    300: [166,36,290,214]
                    301: [2919] Ans=htest4$
                    302: [2920] Ans[0][0];
                    303: [[((b1-b0-1)*x4)/(x0^2),[4]],[((b1-b0-1)*x6)/(x0^2),[6]],
                    304:  [(b1^2+(-2*b0-1)*b1+b0^2+b0)/(x0^2),[]],[(x6)/(x0),[6,0]],[(x4)/(x0),[4,0]]]
                    305: @end example
                    306:
1.6       takayama  307: @comment --- 参照(リンク)を書く ---
1.1       takayama  308: @table @t
1.6       takayama  309: @item 参照
1.1       takayama  310: @ref{gtt_ekn.setup}
                    311: @ref{gtt_ekn.pfaffian_basis}
                    312: @end table
                    313:
1.6       takayama  314: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  315: @noindent
                    316: ChangeLog
                    317: @itemize @bullet
                    318: @item
1.6       takayama  319:  この関数は
                    320: [GM2016] のアルゴリズムおよび
                    321: [T2016] による modular method を用いた高速化を実装したものである.
1.1       takayama  322: @item
1.6       takayama  323:  変更を受けたファイルは
1.1       takayama  324:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_pfaffian_8.rr
                    325: @end itemize
                    326:
                    327:
                    328: @comment **********************************************************
1.6       takayama  329: @node gtt_ekn.nc,,, 超幾何関数E(k,n)
1.1       takayama  330: @subsection @code{gtt_ekn.nc}
1.6       takayama  331: @comment --- 索引用キーワード
1.1       takayama  332: @findex gtt_ekn.nc
                    333:
                    334: @table @t
                    335: @item gtt_ekn.nc(@var{beta},@var{p})
1.6       takayama  336: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の条件付き確率の正規化定数 Z
                    337: およびその微分の値を戻す.
1.1       takayama  338: @end table
                    339:
1.6       takayama  340: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  341: @table @var
                    342: @item return
1.6       takayama  343: ベクトル [Z,[[d_11 Z, d_12 Z, ...], ..., [d_m1 Z, d_m2 Z, ...., d_mn Z]]]
1.1       takayama  344: @item beta
1.6       takayama  345: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  346: @item p
1.6       takayama  347: 二元分割表のセルの確率のリスト
1.1       takayama  348: @end table
                    349:
1.6       takayama  350: @comment --- ここで関数の詳しい説明 ---
                    351: @comment --- @itemize〜@end itemize は箇条書き ---
                    352: @comment --- @bullet は黒点付き ---
1.1       takayama  353: @itemize @bullet
                    354: @item
1.6       takayama  355:  r1 x r2 分割表を考える.
                    356:  m=r1, n=r2 とおく.
                    357:  正規化定数 Z は分割表 u を m × n 行列とするとき p^u/u! の和である.
                    358:  ここで和は行和列和が @var{beta} であるような u 全体でとる
1.1       takayama  359:  [TKT2015], [GM2016].
1.6       takayama  360:  p^u は p_ij^u_ij の積, u! は u_ij! の積である.
                    361:  d_ij Z で Z の変数 p_ij についての偏微分を表す.
1.1       takayama  362: @item
1.6       takayama  363: nc は gmvector の値を元に, [GM2016] の Prop
                    364:  7.1 に基づいて Z の値を計算する.
1.1       takayama  365: @item
1.6       takayama  366: option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
                    367: 分散計算用の各種パラメータの設定は
                    368: gtt_ekn.setup で行なう.
1.1       takayama  369: @end itemize
                    370:
1.6       takayama  371: @comment --- @example〜@end example は実行例の表示 ---
                    372: 例: 2x3 分割表での Z とその微分の計算.
1.1       takayama  373: @example
                    374: [2237] gtt_ekn.nc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
                    375: [4483/124416,[ 353/7776 1961/15552 185/1728 ]
                    376: [ 553/20736 1261/15552 1001/13824 ]]
                    377: @end example
                    378:
1.6       takayama  379: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    380: 計算ができる.
1.1       takayama  381: @example
                    382: [3076] import("tk_fd.rr");
                    383: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                    384: [-4,[-4,-3],-1]
                    385: [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                    386: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                    387: [ 1 1 1 ]
                    388: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    389: [4483/124416,[[353/7776,1961/15552,185/1728],
                    390:               [553/20736,1261/15552,1001/13824]]]
1.6       takayama  391: // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z],
                    392: //             [d_21 Z, d_22 Z, d_23 Z]]] の値.
                    393: //           ここで d_ij は i,j 成分についての微分を表す.
1.1       takayama  394: @end example
                    395:
1.6       takayama  396: @comment --- 参照(リンク)を書く ---
1.1       takayama  397: @table @t
1.6       takayama  398: @item 参照
1.1       takayama  399: @ref{gtt_ekn.setup}
                    400: @ref{gtt_ekn.lognc}
                    401: @end table
                    402:
1.6       takayama  403: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  404: @noindent
                    405: ChangeLog
                    406: @itemize @bullet
                    407: @item
1.6       takayama  408:  変更を受けたファイルは
1.1       takayama  409:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1, gtt_ekn/ekn_eval.rr
                    410: @end itemize
                    411:
                    412:
                    413: @comment **********************************************************
1.6       takayama  414: @node gtt_ekn.lognc,,, 超幾何関数E(k,n)
1.1       takayama  415: @subsection @code{gtt_ekn.lognc}
1.6       takayama  416: @comment --- 索引用キーワード
1.1       takayama  417: @findex gtt_ekn.lognc
                    418:
                    419: @table @t
                    420: @item gtt_ekn.lognc(@var{beta},@var{p})
1.6       takayama  421: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の条件付き確率の正規化定数 Z
                    422: の log の近似値およびその微分の近似値を戻す.
1.1       takayama  423: @end table
                    424:
1.6       takayama  425: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  426: @table @var
                    427: @item return
1.6       takayama  428: ベクトル [log(Z), [[d_11 log(Z), d_12 log(Z), ...], [d_21 log(Z),...], ... ]
1.1       takayama  429: @item beta
1.6       takayama  430: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  431: @item p
1.6       takayama  432: 二元分割表のセルの確率のリスト
1.1       takayama  433: @end table
                    434:
1.6       takayama  435: @comment --- ここで関数の詳しい説明 ---
                    436: @comment --- @itemize〜@end itemize は箇条書き ---
                    437: @comment --- @bullet は黒点付き ---
1.1       takayama  438: @itemize @bullet
                    439: @item
1.6       takayama  440: 条件付き最尤推定に利用する [TKT2015].
                    441: @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
                    442: 分散計算用の各種パラメータの設定は
                    443: gtt_ekn.setup で行なう.
1.1       takayama  444: @end itemize
                    445:
1.6       takayama  446: @comment --- @example〜@end example は実行例の表示 ---
                    447: 例: 2 × 3 分割表での例. 第一成分のみ近似値.
1.1       takayama  448: @example
                    449: [2238] gtt_ekn.lognc([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
                    450: [-3.32333832422461674630,[ 5648/4483 15688/4483 13320/4483 ]
                    451: [ 3318/4483 10088/4483 9009/4483 ]]
                    452: @end example
                    453:
1.6       takayama  454: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    455: 計算ができる.
1.1       takayama  456: @example
                    457: [3076] import("tk_fd.rr");
                    458: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                    459: [-4,[-4,-3],-1]
                    460: [3078] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                    461: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                    462: [ 1 1 1 ]
                    463: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    464: [-3.32333832422461674639485797719209322217260539267246045320,
                    465:  [[1.2598706, 3.499442, 2.971224],
                    466:   [0.7401293, 2.250278, 2.009591]]]
1.6       takayama  467: // 戻値は [log(Z),
1.1       takayama  468: //          [[d_11 log(Z), d_12 log(Z), d_13 log(Z)],
                    469: //           [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]]
1.6       takayama  470: // の近似値.
1.1       takayama  471: @end example
                    472:
1.6       takayama  473: @comment --- 参照(リンク)を書く ---
1.1       takayama  474: @table @t
1.6       takayama  475: @item 参照
1.1       takayama  476: @ref{gtt_ekn.setup}
                    477: @ref{gtt_ekn.nc}
                    478: @end table
                    479:
1.6       takayama  480: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  481: @noindent
                    482: ChangeLog
                    483: @itemize @bullet
                    484: @item
1.6       takayama  485:  変更を受けたファイルは
1.1       takayama  486:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1.
                    487: @end itemize
                    488:
                    489: @comment **********************************************************
1.6       takayama  490: @node gtt_ekn.expectation,,, 超幾何関数E(k,n)
1.1       takayama  491: @subsection @code{gtt_ekn.expectation}
1.6       takayama  492: @comment --- 索引用キーワード
1.1       takayama  493: @findex gtt_ekn.expectation
                    494:
                    495: @table @t
                    496: @item gtt_ekn.expectation(@var{beta},@var{p})
1.6       takayama  497: :: 周辺和 @var{beta}, セルの確率 @var{p} の二元分割表の期待値を計算する.
1.1       takayama  498: @end table
                    499:
1.6       takayama  500: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  501: @table @var
                    502: @item return
1.6       takayama  503: 二元分割表の各セルの期待値のリスト.
1.1       takayama  504: @item beta
1.6       takayama  505: 行和, 列和のリスト. 成分はすべて正であること.
1.1       takayama  506: @item p
1.6       takayama  507: 二元分割表のセルの確率のリスト
1.1       takayama  508: @end table
                    509:
1.6       takayama  510: @comment --- ここで関数の詳しい説明 ---
                    511: @comment --- @itemize〜@end itemize は箇条書き ---
                    512: @comment --- @bullet は黒点付き ---
1.1       takayama  513: @itemize @bullet
                    514: @item
1.6       takayama  515: [GM2016] の Algorithm 7.8 の実装.
                    516: @item option crt=1 (crt = Chinese remainder theorem) を与えると, 分散計算をおこなう.
                    517: 分散計算用の各種パラメータの設定は
                    518: gtt_ekn.setup で行なう.
                    519: @item option index を与えると, 指定された成分の期待値のみ計算する.
                    520: たとえば 2 x 2 分割表で index=[[0,0],[1,1]] と指定すると, 1 のある成分の期待値のみ計算する.
1.1       takayama  521: @end itemize
                    522:
1.6       takayama  523: @comment --- @example〜@end example は実行例の表示 ---
1.1       takayama  524:
1.6       takayama  525: 2×2, 3×3 の分割表の期待値計算例.
1.1       takayama  526: @example
                    527: [2235] gtt_ekn.expectation([[1,4],[2,3]],[[1,1/3],[1,1]]);
                    528: [ 2/3 1/3 ]
                    529: [ 4/3 8/3 ]
                    530: [2236] gtt_ekn.expectation([[4,5],[2,4,3]],[[1,1/2,1/3],[1,1,1]]);
                    531: [ 5648/4483 7844/4483 4440/4483 ]
                    532: [ 3318/4483 10088/4483 9009/4483 ]
                    533:
                    534: [2442] gtt_ekn.expectation([[4,14,9],[11,6,10]],[[1,1/2,1/3],[1,1/5,1/7],[1,1,1]]);
                    535: [ 207017568232262040/147000422096729819 163140751505489940/147000422096729819
                    536:                                         217843368649167296/147000422096729819 ]
                    537: [ 1185482401011137878/147000422096729819 358095302885438604/147000422096729819
                    538:                                          514428205457640984/147000422096729819 ]
                    539: [ 224504673820628091/147000422096729819 360766478189450370/147000422096729819
                    540:                                         737732646860489910/147000422096729819 ]
                    541: @end example
                    542:
1.6       takayama  543: 参考: 2 x m 分割表(Lauricella FD)についてはパッケージ tk_fd でも下記のように同等な
                    544: 計算ができる.
1.1       takayama  545: @example
                    546: [3076] import("tk_fd.rr");
                    547: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                    548: [-4,[-4,-3],-1]
                    549: [3078] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                    550: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                    551: [ 1 1 1 ]
                    552: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                    553: [[5648/4483,7844/4483,4440/4483],
                    554:  [3318/4483,10088/4483,9009/4483]]
1.6       takayama  555: // 各セルの期待値.
1.1       takayama  556: @end example
                    557:
1.6       takayama  558: 参考: 一般の A 分布の計算は ot_hgm_ahg.rr. まだ実験的なため, module 化されていない.
                    559: ot_hgm_ahg.rr についての参考文献:
1.1       takayama  560: K.Ohara, N.Takayama, Pfaffian Systems of A-Hypergeometric Systems II --- Holonomic Gradient Method, arxiv:1505.02947
                    561: @example
                    562: [3237] import("ot_hgm_ahg.rr");
1.6       takayama  563: // 2 x 2 分割表.
1.1       takayama  564: [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]],
                    565:         [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1);
                    566: oohg_native=0, oohg_curl=1
                    567: [1376777025/625400597,1750225960/625400597,
                    568:  2375626557/625400597,3252978816/625400597]
1.6       takayama  569: // 2 x 2 分割表の期待値.
1.1       takayama  570:
1.6       takayama  571: // 2 x 3 分割表.
1.1       takayama  572: [3238] hgm_ahg_expected_values_contiguity(
                    573:  [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]],
                    574:  [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1);
                    575: [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483]
1.6       takayama  576: // 2 x 3 分割表の期待値. 上と同じ問題.
1.1       takayama  577: @end example
                    578:
1.6       takayama  579: 3 x 3 分割表. 構造的0が一つ.
1.1       takayama  580: @example
                    581: /*
1.6       takayama  582:   dojo, p.221 のデータ.  成績3以下の生徒は集めてひとつに.
1.1       takayama  583:   2 1 1
                    584:   8 3 3
                    585:   0 2 6
                    586:
                    587:   row sum: 4,14,8
                    588:   column sum: 10,6,10
1.6       takayama  589:   0 を一つ含むので, (3,6) 型の A から 7 列目を抜く.
1.1       takayama  590: */
                    591:
                    592: A=[[0,0,0,1,1,1, 0,0],
                    593:    [0,0,0,0,0,0, 1,1],
                    594:    [1,0,0,1,0,0, 0,0],
                    595:    [0,1,0,0,1,0, 1,0],
                    596:    [0,0,1,0,0,1, 0,1]];
                    597: B=[14,8,10,6,10];
                    598: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1],
1.6       takayama  599:                 [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
1.1       takayama  600:
1.6       takayama  601: // 答.
1.1       takayama  602: [14449864949304/9556267369631,
                    603:  10262588586540/9556267369631, 13512615942680/9556267369631,
                    604:  81112808747006/9556267369631,
                    605:  21816297744346/9556267369631, 30858636683482/9556267369631,
                    606:
                    607:  25258717886900/9556267369631,51191421070148/9556267369631]
                    608: @end example
                    609:
1.6       takayama  610: 3 x 3 分割表.
1.1       takayama  611: @example
                    612: /*
1.6       takayama  613:  上のデータで 0 を 1 に変更.
1.1       takayama  614:   2 1 1
                    615:   8 3 3
                    616:   1 2 6
                    617:
                    618:   row sum: 4,14,9
                    619:   column sum: 11,6,10
                    620: */
                    621: A=[[0,0,0,1,1,1,0,0,0],
                    622:    [0,0,0,0,0,0,1,1,1],
                    623:    [1,0,0,1,0,0,1,0,0],
                    624:    [0,1,0,0,1,0,0,1,0],
                    625:    [0,0,1,0,0,1,0,0,1]];
                    626: B=[14,9,11,6,10];
                    627: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1],
                    628:                               [x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
                    629:
1.6       takayama  630: // 期待値, 答.   x9 を指定していないので, 9番目の期待値は出力してない.
1.1       takayama  631: [207017568232262040/147000422096729819,
                    632:  163140751505489940/147000422096729819,217843368649167296/147000422096729819,
                    633:  1185482401011137878/147000422096729819,
                    634:  358095302885438604/147000422096729819,514428205457640984/147000422096729819,
                    635:  224504673820628091/147000422096729819,360766478189450370/147000422096729819]
                    636:
1.6       takayama  637: // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは
                    638: // まだ書いてない.
1.1       takayama  639: @end example
                    640:
                    641:
                    642:
1.6       takayama  643: @comment --- 参照(リンク)を書く ---
1.1       takayama  644: @table @t
1.6       takayama  645: @item 参照
1.1       takayama  646: @ref{gtt_ekn.setup}
                    647: @ref{gtt_ekn.nc}
                    648: @end table
                    649:
1.6       takayama  650: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  651: @noindent
                    652: ChangeLog
                    653: @itemize @bullet
                    654: @item
1.6       takayama  655:  変更を受けたファイルは
1.1       takayama  656:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1.
                    657: @end itemize
                    658:
                    659:
                    660: @comment **********************************************************
1.6       takayama  661: @comment --- ◯◯◯◯  の説明
                    662: @comment --- 個々の関数の説明の開始 ---
                    663: @comment --- section 名を正確に ---
                    664: @node gtt_ekn.setup,,, 超幾何関数E(k,n)
1.1       takayama  665: @subsection @code{gtt_ekn.setup}
1.6       takayama  666: @comment --- 索引用キーワード
1.1       takayama  667: @findex gtt_ekn.setup
                    668:
                    669: @table @t
                    670: @item gtt_ekn.setup()
1.6       takayama  671: :: 分散計算用の環境設定をおこなう. 現在の環境を報告する.
1.1       takayama  672: @end table
                    673:
1.6       takayama  674: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  675: @table @var
                    676: @item return
                    677:
                    678: @end table
                    679:
1.6       takayama  680: @comment --- ここで関数の詳しい説明 ---
                    681: @comment --- @itemize〜@end itemize は箇条書き ---
                    682: @comment --- @bullet は黒点付き ---
1.3       takayama  683: @itemize @bullet
1.6       takayama  684: @item 使用するプロセスと素数の個数, 最小の素数を表示する. 準備されていない場合はその旨を表示.
                    685: @item このパッケージでの分散計算は複数のcpuを搭載した計算機で実行されることを想定している.
                    686: @item option nps (または number_of_processes)を与えると指定した数だけプロセスを用意する.
                    687: @item option nprm (または number_of_primes)を与えるとnprmが文字列の場合指定された素数リストのファイルを読み込む. nprmが自然数の場合さらにoption minp (minp =MINimum Prime)を与えるとminpより大きな素数をnprm個生成する. その際option fgp (または file_of_generated_primes)を与えると生成した素数リストをファイル名をfgpとして保存する.
                    688: @item 上記のoption を指定しなかった場合次のデフォルト値が用いられる. nps=1. nprm=10. fgp=0.
                    689: @item option report=1を与えると現在の環境の報告のみを行う. setup(|report=1)の別名としてreport関数を使用することもできる.
                    690: @item option subprogs=[file1,file2,...] により分散計算の子供プロセスにロードすべきファイル file1, file2, ... を指定する. default は subprogs=["gtt_ekn/childprocess.rr"] である.
1.8     ! takayama  691: @item gtt_ekn.set_debug_level(Mode) で Ekn_debug の値を設定する.
1.1       takayama  692: @end itemize
                    693:
1.6       takayama  694: @comment --- @example〜@end example は実行例の表示 ---
                    695: 例: 素数のリストを生成してファイル p.txt へ書き出す.
1.1       takayama  696: @example
                    697: gtt_ekn.setup(|nps=2,nprm=20,minp=10^10,fgp="p.txt")$
                    698: @end example
                    699:
1.8     ! takayama  700: 例: chinese remainder theorem (crt) を使って gmvector を計算.
        !           701: @example
        !           702: [2867] gtt_ekn.setup(|nprm=20,minp=10^20);
        !           703: [2868] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],
        !           704:                                 [[1,(1-1/N)/56],[1,1]] | crt=1)$
        !           705: @end example
        !           706:
1.1       takayama  707:
1.6       takayama  708: @comment --- 参照(リンク)を書く ---
1.1       takayama  709: @table @t
1.6       takayama  710: @item 参照
1.1       takayama  711: @ref{gtt_ekn.nc}
                    712: @ref{gtt_ekn.gmvector}
                    713: @end table
                    714:
1.6       takayama  715: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  716: @noindent
                    717: ChangeLog
                    718: @itemize @bullet
                    719: @item
1.6       takayama  720:  変更を受けたファイルは
1.1       takayama  721:  OpenXM/src/asir-contrib/packages/src/gtt_ekn.rr 1.1,
                    722:  gtt_ekn/g_mat_fac.rr
                    723:
                    724: @end itemize
                    725:
                    726: @comment **********************************************************
1.6       takayama  727: @comment --- ◯◯◯◯  の説明
                    728: @comment --- 個々の関数の説明の開始 ---
                    729: @comment --- section 名を正確に ---
                    730: @node gtt_ekn.upAlpha,,, 超幾何関数E(k,n)
1.1       takayama  731: @subsection @code{gtt_ekn.upAlpha}
1.6       takayama  732: @comment --- 索引用キーワード
1.1       takayama  733: @findex gtt_ekn.upAlpha
                    734:
                    735: @table @t
                    736: @item gtt_ekn.upAlpha(@var{i},@var{k},@var{n})
                    737: ::
                    738: @end table
                    739:
1.6       takayama  740: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.1       takayama  741: @table @var
1.6       takayama  742: @item i  a_i を a_i+1 と変化させる contiguity relation.
                    743: @item k  E(k+1,n+k+2)型の超幾何関数の k. 分割表では (k+1)×(n+1).
                    744: @item n  E(k+1,n+k+2)型の超幾何関数の n. 分割表では (k+1)×(n+1).
                    745: @item return  contiguity relation の pfaffian_basis についての行列表現を戻す. [GM2016] の Cor 6.3.
1.1       takayama  746: @end table
                    747:
1.6       takayama  748: @comment --- ここで関数の詳しい説明 ---
                    749: @comment --- @itemize〜@end itemize は箇条書き ---
                    750: @comment --- @bullet は黒点付き ---
1.1       takayama  751: @itemize @bullet
                    752: @item
1.6       takayama  753:  upAlpha は [GM2016] の Cor 6.3 の行列 U_i を戻す.
                    754: @item 関連する各関数の簡潔な説明と例も加える.
                    755: @item a_i を a_i-1 と変化させたい場合は関数 downAlpha を用いる.
                    756: @item a_i と分割表の周辺和を見るには, 関数 marginaltoAlpha([行和,列和]) を用いる.
1.1       takayama  757: @item
1.6       takayama  758:    pfaffian_basis は [GM2016] の4章のベクトル F に対応する偏微分を戻す.
1.1       takayama  759: @end itemize
                    760:
1.6       takayama  761: @comment --- @example〜@end example は実行例の表示 ---
                    762: 例: 以下の例は 2×2分割表(E(2,4)), 2×3分割表(E(2,5))の場合である.
                    763: [2225] までは出力を略している.
1.1       takayama  764: @example
                    765: [2221] gtt_ekn.marginaltoAlpha([[1,4],[2,3]]);
                    766: [[a_0,-4],[a_1,-1],[a_2,3],[a_3,2]]
1.6       takayama  767: [2222] gtt_ekn.upAlpha(1,1,1);  // E(2,4) の a_1 方向の
                    768:                                 //     contiguity を表現する行列
                    769: [2223] gtt_ekn.upAlpha(2,1,1);  // E(2,4) の a_2 方向
                    770: [2224] gtt_ekn.upAlpha(3,1,1);  // E(2,4) の a_3 方向
1.1       takayama  771: [2225] function f(x_1_1);
                    772: [2232] gtt_ekn.pfaffian_basis(f(x_1_1),1,1);
                    773: [ f(x_1_1) ]
                    774: [ (f{1}(x_1_1)*x_1_1)/(a_2) ]
                    775: [2233] function f(x_1_1,x_1_2);
                    776: f() redefined.
1.6       takayama  777: [2234] gtt_ekn.pfaffian_basis(f(x_1_1,x_1_2),1,2); // E(2,5), 2*3 分割表
1.1       takayama  778: [ f(x_1_1,x_1_2) ]
                    779: [ (f{1,0}(x_1_1,x_1_2)*x_1_1)/(a_2) ]
                    780: [ (f{0,1}(x_1_1,x_1_2)*x_1_2)/(a_3) ]
                    781: @end example
                    782:
                    783:
1.6       takayama  784: @comment --- 参照(リンク)を書く ---
1.1       takayama  785: @table @t
1.6       takayama  786: @item 参照
1.1       takayama  787: @ref{gtt_ekn.nc}
                    788: @ref{gtt_ekn.gmvector}
                    789: @end table
                    790:
1.6       takayama  791: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.1       takayama  792: @noindent
                    793: ChangeLog
                    794: @itemize @bullet
                    795: @item
1.6       takayama  796:  この関数は [GM2016]
                    797: で与えられたアルゴリズムに従い contiguity relation を導出する.
1.1       takayama  798: @item
1.6       takayama  799:  変更を受けたファイルは
1.1       takayama  800:  OpenXM/src/asir-contrib/packages/src/gtt_ekn/ekn_pfaffian_8.rr 1.1.
                    801: @end itemize
                    802:
                    803:
1.5       takayama  804: @comment **********************************************************
1.6       takayama  805: @comment --- ◯◯◯◯  の説明
                    806: @comment --- 個々の関数の説明の開始 ---
                    807: @comment --- section 名を正確に ---
                    808: @node gtt_ekn.cmle,,, 超幾何関数E(k,n)
1.5       takayama  809: @subsection @code{gtt_ekn.cmle}
1.6       takayama  810: @comment --- 索引用キーワード
1.5       takayama  811: @findex gtt_ekn.cmle
                    812:
                    813: @table @t
1.6       takayama  814: @item gtt_ekn.cmle(@var{u}) u を観測データとするとき, P(U=u | row sum, column sum = these of U) を最大化する, 各セルの確率の近似値を求める.
1.5       takayama  815: ::
                    816: @end table
                    817:
1.6       takayama  818: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.5       takayama  819: @table @var
1.6       takayama  820: @item u  観測データ(分割表)
                    821: @item return  セルの確率(分割表形式)
1.5       takayama  822: @end table
                    823:
1.6       takayama  824: @comment --- ここで関数の詳しい説明 ---
                    825: @comment --- @itemize〜@end itemize は箇条書き ---
                    826: @comment --- @bullet は黒点付き ---
1.5       takayama  827: @itemize @bullet
1.6       takayama  828: @item u を観測データとするとき, P(U=u | row sum, column sum = these of U) を最大化する, 各セルの確率の近似値を求める.
                    829: @item optional parameter で algorithm の振る舞い(たとえば有理数を近似して, 分母分子が小さい有理数にする, gradient descent の step幅)を調整すべきだが, これは作業中. 2017.03.03
1.5       takayama  830: @end itemize
                    831:
1.6       takayama  832: @comment --- @example〜@end example は実行例の表示 ---
                    833: 例: 2 x 4 分割表.
1.5       takayama  834: @example
                    835: U=[[1,1,2,3],[1,3,1,1]];
                    836: gtt_ekn.cmle(U);
                    837:  [[ 1 1 2 3 ]
                    838:   [ 1 3 1 1 ],[[7,6],[2,4,3,4]],   // Data, row sum, column sum
                    839:  [ 1 67147/183792 120403/64148 48801/17869 ]  // probability obtained.
                    840:  [ 1 1 1 1 ]]
                    841: @end example
                    842:
1.6       takayama  843: 例: 上の例は次の関数に.
1.5       takayama  844: @example
                    845: gtt_ekn.cmle_test3();
                    846: @end example
                    847:
1.6       takayama  848: @comment --- 参照(リンク)を書く ---
1.5       takayama  849: @table @t
1.6       takayama  850: @item 参照
1.5       takayama  851: @ref{gtt_ekn.expectation}
                    852: @end table
                    853:
1.6       takayama  854: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.5       takayama  855: @noindent
                    856: ChangeLog
                    857: @itemize @bullet
1.6       takayama  858: @item  gtt_ekn/mle.rr に本体がある.
                    859: @item  gtt_ekn.rr の cmle 関数は wrapper.
1.5       takayama  860: @end itemize
                    861: @comment end cmle.
                    862:
1.8     ! takayama  863: @comment **********************************************************
        !           864: @comment --- ◯◯◯◯  の説明
        !           865: @comment --- 個々の関数の説明の開始 ---
        !           866: @comment --- section 名を正確に ---
        !           867: @node gtt_ekn.set_debug_level,,, 超幾何関数E(k,n)
        !           868: @subsection @code{gtt_ekn.set_debug_level}
        !           869: @comment --- 索引用キーワード
        !           870: @findex gtt_ekn.set_debug_level
        !           871:
        !           872: @table @t
        !           873: @item gtt_ekn.set_debug_level(@var{m}) debug メッセージのレベルを設定.
        !           874: ::
        !           875: @end table
        !           876:
        !           877: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
        !           878: @table @var
        !           879: @item  m  レベル.
        !           880: @end table
        !           881:
        !           882: @comment --- ここで関数の詳しい説明 ---
        !           883: @comment --- @itemize〜@end itemize は箇条書き ---
        !           884: @comment --- @bullet は黒点付き ---
        !           885: @itemize @bullet
        !           886: @item (@var{m} & 0x1) == 0x1 の時 g_mat_fac_test_plain と g_mat_fac_itor の両方を呼び出し値を比較する (gtt_ekn.setup した状態で).
        !           887: @item (@var{m} & 0x2) == 0x2 の時 g_mat_fac_itor への引数を tmp-input.ab として保存.
        !           888: @item (@var{m} & 0x4) == 0x4 の時 matrix factorial の計算の呼び出し引数を表示.
        !           889: @end itemize
        !           890:
        !           891: @comment --- @example〜@end example は実行例の表示 ---
        !           892: @example
        !           893: [2846] gtt_ekn.set_debug_level(0x4);
        !           894: [2847] N=2; T2=gtt_ekn.gmvector([[36*N,13*N-1],[38*N-1,11*N]],
        !           895:                                 [[1,(1-1/N)/56],[1,1]])$
        !           896: [2848] level&0x4: g_mat_fac_test([ 113/112 ]
        !           897: [ 1/112 ],[ (t+225/112)/(t^2+4*t+4) (111/112*t+111/112)/(t^2+4*t+4) ]
        !           898: [ (1/112)/(t^2+4*t+4) (111/112*t+111/112)/(t^2+4*t+4) ],0,20,1,t)
        !           899: Note: we do not use g_mat_fac_itor. Call gtt_ekn.setup(); to use the crt option.
        !           900: level&0x4: g_mat_fac_test([ 67/62944040755546030080000 ]
        !           901: [ 1/125888081511092060160000 ],[ (t+24)/(t^2+25*t+46) (2442)/(t^2+25*t+46) ]
        !           902: [ (1)/(t^2+25*t+46) (-111*t-111)/(t^2+25*t+46) ],0,73,1,t)
        !           903: level&0x4: g_mat_fac_test ------  snip
        !           904: @end example
        !           905:
        !           906: @comment --- 参照(リンク)を書く ---
        !           907: @table @t
        !           908: @item 参照
        !           909: @ref{gtt_ekn.nc}
        !           910: @end table
        !           911:
        !           912: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
        !           913: @noindent
        !           914: ChangeLog
        !           915: @itemize @bullet
        !           916: @item  gtt_ekn/ekn_eval.rr で matrix factorial の計算の呼び出し引数を表示する.
        !           917: @item grep 'iand(Ekn_debug,0x1)' *.rr でソースコードの該当の位置をさがす.
        !           918: @end itemize
        !           919: @comment end set_debug_level
        !           920:
1.5       takayama  921:
                    922:
1.6       takayama  923: @node modular計算,,, 2元分割表HGMの関数
                    924: @chapter modular計算
1.4       takayama  925:
                    926: @menu
                    927: * gtt_ekn.chinese_itor::
                    928: @end menu
                    929:
1.6       takayama  930: @node 中国剰余定理とitor,,, modular計算
                    931: @section 中国剰余定理とitor
1.4       takayama  932:
                    933: @comment **********************************************************
1.6       takayama  934: @comment --- ◯◯◯◯  の説明
                    935: @comment --- 個々の関数の説明の開始 ---
                    936: @comment --- section 名を正確に ---
1.4       takayama  937: @node gtt_ekn.chinese_itor,,,
                    938: @subsection @code{gtt_ekn.chinese_itor}
1.6       takayama  939: @comment --- 索引用キーワード
                    940: @findex gtt_ekn.chinese_itor 中国剰余定理とitor
1.4       takayama  941:
                    942: @table @t
                    943: @item gtt_ekn.chinese_itor(@var{data},@var{idlist})
1.6       takayama  944: :: mod p で計算した結果(ベクトル)から chinese remainder theorem, itor(integer to rational) で有理数ベクトルを得る.
1.4       takayama  945: @end table
                    946:
1.6       takayama  947: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.4       takayama  948: @table @var
1.6       takayama  949: @item return  [val, n]  ここで val は答え. また, n = n1*n2*...
                    950: @item data   [[val1,n1],[val2,n2], ...], ここで val mod n1 = val1, val mod n2 = val2,...
                    951: @item idlist  chinese, itor を実行するサーバIDのリスト.
1.4       takayama  952: @end table
                    953:
1.6       takayama  954: @comment --- ここで関数の詳しい説明 ---
                    955: @comment --- @itemize〜@end itemize は箇条書き ---
                    956: @comment --- @bullet は黒点付き ---
1.4       takayama  957: @itemize @bullet
1.6       takayama  958: @item 中国剰余定理を用いて val0 mod n1 = val1, val0 mod n2 = val2, ... となる val0 を求める. val に algorithm itor を適用する.
                    959: @item sqrt(n) より val0 が大きい時は itor が適用されて val0 が有理数 val=a/b に変換される. つまり b*x =1 mod n となる逆数 x を考えて, x*a % n = val0 となる数 val を戻す. 見つからないときは failure を戻す.
1.4       takayama  960: @end itemize
                    961:
1.6       takayama  962: @comment --- @example〜@end example は実行例の表示 ---
                    963: 例: [3!, 5^3*3!]=[6,750] が戻り値.
                    964: 6 mod 109 =6, 750 mod 109=96 が最初の引数の [[6,96],109]. 以下同様.
1.4       takayama  965: @example
                    966: gtt_ekn.setup(|nps=2,nprm=3,minp=101,fgp="p_small.txt");
                    967: SS=gtt_ekn.get_svalue();
                    968: SS[0];
                    969:   [103,107,109]   // list of primes
                    970: SS[1];
                    971:   [0,2]           // list of server ID's
                    972: gtt_ekn.chinese_itor([[[ 6,96 ],109],[[ 6,29 ],103],[[ 6,1 ],107]],SS[1]);
                    973:   [[ 6 750 ],1201289]
                    974:
1.6       takayama  975: // 引数はスカラーでもよい.
1.4       takayama  976: gtt_ekn.chinese_itor([[96,109],[29,103]],SS[1]);
                    977:   [[ 750 ],11227]
                    978: @end example
                    979:
                    980:
1.6       takayama  981: @comment --- @example〜@end example は実行例の表示 ---
                    982: 例: gtt_ekn/childprocess.rr (server で実行される) の関数 chinese (chinese remainder theorem) と euclid.
1.4       takayama  983: @example
                    984: load("gtt_ekn/childprocess.rr");
                    985: chinese([newvect(2,[6,29]),103],[newvect(2,[6,750]),107*109]);
1.6       takayama  986:   // mod 103 で [6,29], mod (107*109) で [6,750] となる数を mod 103*(107*109)
                    987:   // で求めると,
1.4       takayama  988:   [[ 6 750 ],1201289]
1.6       takayama  989: euclid(3,103);  // mod 103 での 3 の逆数. つまり 1/3
1.4       takayama  990:   -34
1.6       takayama  991: 3*(-34) % 103; // 確かに逆数.
1.4       takayama  992:    1
                    993: @end example
                    994:
1.6       takayama  995: @comment --- @example〜@end example は実行例の表示 ---
                    996: 例: gtt_ekn/childprocess.rr (server で実行される) の関数 itor (integer to rational) の例.
                    997: itor(Y,Q,Q2,Idx) では Y < Q2 なら Y がそのまま戻る.  Idx は 内部用の index で好きな数でよい. 戻り値の第2成分となる.
1.4       takayama  998: @example
                    999: load("gtt_ekn/childprocess.rr");
                   1000: for (I=1;I<11; I++) print([I,itor(I,11,3,0)]);
                   1001: [1,[1,0]]
                   1002: [2,[2,0]]
1.6       takayama 1003: [3,[-2/3,0]] //euclid(3,11); ->4,  4*(-2)%11 -> 3 なので確かに -2/3 は元の数の候補
1.4       takayama 1004: [4,[failure,0]]
                   1005: [5,[-1/2,0]]
                   1006: [6,[1/2,0]]
                   1007: [7,[-1/3,0]]
                   1008: [8,[failure,0]]
                   1009: [9,[-2,0]]
                   1010: [10,[-1,0]]
                   1011: @end example
                   1012:
                   1013:
1.6       takayama 1014: @comment --- 参照(リンク)を書く ---
1.4       takayama 1015: @table @t
1.6       takayama 1016: @item 参照
1.4       takayama 1017: @ref{gtt_ekn.setup}
                   1018: @end table
                   1019:
1.6       takayama 1020: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.4       takayama 1021: @noindent
                   1022: ChangeLog
                   1023: @itemize @bullet
                   1024: @item
1.6       takayama 1025:  関連ファイルは
1.4       takayama 1026:  gtt_ekn/g_mat_fac.rr
                   1027:  gtt_ekn/childprocess.rr
                   1028: @end itemize
                   1029:
                   1030:
1.1       takayama 1031:
1.6       takayama 1032: @comment --- おまじない ---
1.1       takayama 1033: @node Index,,, Top
                   1034: @unnumbered Index
                   1035: @printindex fn
                   1036: @printindex cp
                   1037: @iftex
                   1038: @vfill @eject
                   1039: @end iftex
                   1040: @summarycontents
                   1041: @contents
                   1042: @bye
1.6       takayama 1043: @comment --- おまじない終り ---
1.1       takayama 1044:
                   1045:
1.6       takayama 1046: @comment テンプレート.  start_of_template.
1.5       takayama 1047: @comment **********************************************************
1.6       takayama 1048: @comment --- ◯◯◯◯  の説明
                   1049: @comment --- 個々の関数の説明の開始 ---
                   1050: @comment --- section 名を正確に ---
                   1051: @node gtt_ekn.hoge,,, 超幾何関数E(k,n)
1.5       takayama 1052: @subsection @code{gtt_ekn.hoge}
1.6       takayama 1053: @comment --- 索引用キーワード
1.5       takayama 1054: @findex gtt_ekn.hoge
                   1055:
                   1056: @table @t
                   1057: @item gtt_ekn.hoge(@var{i})
                   1058: ::
                   1059: @end table
                   1060:
1.6       takayama 1061: @comment --- 引数の簡単な説明 ---  以下まだ書いてない.
1.5       takayama 1062: @table @var
                   1063: @item i  hage
                   1064: @item return
                   1065: @end table
                   1066:
1.6       takayama 1067: @comment --- ここで関数の詳しい説明 ---
                   1068: @comment --- @itemize〜@end itemize は箇条書き ---
                   1069: @comment --- @bullet は黒点付き ---
1.5       takayama 1070: @itemize @bullet
1.6       takayama 1071: @item 説明.
1.5       takayama 1072: @end itemize
                   1073:
1.6       takayama 1074: @comment --- @example〜@end example は実行例の表示 ---
                   1075: 例:
1.5       takayama 1076: @example
                   1077: [2221] gtt_ekn.hoge([[1,4],[2,3]]);
                   1078: @end example
                   1079:
                   1080:
1.6       takayama 1081: @comment --- 参照(リンク)を書く ---
1.5       takayama 1082: @table @t
1.6       takayama 1083: @item 参照
1.5       takayama 1084: @ref{gtt_ekn.nc}
                   1085: @ref{gtt_ekn.gmvector}
                   1086: @end table
                   1087:
1.6       takayama 1088: @comment --- ChangeLog を書く. ソースコードの位置. 変更日時 など CVSサーバを見るため
1.5       takayama 1089: @noindent
                   1090: ChangeLog
                   1091: @itemize @bullet
                   1092: @item
                   1093: @end itemize
                   1094: @comment end_of_template
                   1095:
                   1096:
1.6       takayama 1097: // 2 x m 分割表において似た機能を有する関数の利用例を参考までに記載する;
                   1098: // 正規化定数とその微分関連.
                   1099: // その1.
1.1       takayama 1100: [3077] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                   1101: [-4,[-4,-3],-1]
                   1102: [3078] tk_fd.ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                   1103: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                   1104: [ 1 1 1 ]
                   1105: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1106: [4483/124416,[[353/7776,1961/15552,185/1728],[553/20736,1261/15552,1001/13824]]]
1.6       takayama 1107: // 戻値は [Z, [[d_11 Z, d_12 Z, d_13 Z],[d_21 Z, d_22 Z, d_23 Z]]] の値.
1.1       takayama 1108:
1.6       takayama 1109: // その2.
1.1       takayama 1110: [3079] tk_fd.log_ahmat_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                   1111: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                   1112: [ 1 1 1 ]
                   1113: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1114: [-3.32333832422461674639485797719209322217260539267246045320,
                   1115:  [[1.25987062235110417131385233102832924380994869507026544724,3.49944233772027660049074280615659156814633058219942003122,2.97122462636627258532232879768012491635065804149007361142],
                   1116:   [0.740129377648895828686147668971670756190051304929734552754,2.25027883113986169975462859692170421592683470890028998438,2.00959179121124247155922373410662502788311398616997546285]]]
1.6       takayama 1117: // 戻値は [log(Z),
1.1       takayama 1118: //          [[d_11 log(Z), d_12 log(Z), d_13 log(Z)],
                   1119: //           [d_21 log(Z), d_22 log(Z), d_23 log(Z)]]]
1.6       takayama 1120: // の近似値.
1.1       takayama 1121:
1.6       takayama 1122: // その3.
1.1       takayama 1123: [3082] fd_hessian2(A[0],A[1],A[2],[1/2,1/3]);
                   1124: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1125: [4483/124416,[ 1961/15552 185/1728 ],
                   1126:  [ 79/288 259/864 ]
                   1127:  [ 259/864 47/288 ]]
1.6       takayama 1128: // 戻値は [F=F_D, gradient(F), Hessian(F)]
1.1       takayama 1129:
1.6       takayama 1130: // 参考.
                   1131: // ygahvec で巾関数分の調整. 独立した関数はないようだ.
1.1       takayama 1132:
                   1133: //-----------------------------------------------------------------------
1.6       takayama 1134: // 2 x m 分割表において似た機能を有する関数の利用例を参考までに記載する;
                   1135: // 期待値関連.
1.1       takayama 1136: [3079] A=tk_fd.marginal2abc([4,5],[2,4,3]);
                   1137: [-4,[-4,-3],-1]
                   1138: [3080] tk_fd.expectation_abc(A[0],A[1],A[2],[[1,1/2,1/3],[1,1,1]]);
                   1139: RS=[ 4 5 ], CSnew=[ 2 4 3 ], Ynew=[ 1 1/2 1/3 ]
                   1140: [ 1 1 1 ]
                   1141: Computing Dmat(ca) for parameters B=[-4,-3],X=[ 1/2 1/3 ]
                   1142: [[5648/4483,7844/4483,4440/4483],
                   1143:  [3318/4483,10088/4483,9009/4483]]
1.6       takayama 1144: // 各セルの期待値.
1.1       takayama 1145:
                   1146: //-----------------------------------------------------------------------
1.6       takayama 1147: // ot_hgm_ahg.rr の例.  実験的なため module 化されていない.
1.1       takayama 1148: [3237] import("ot_hgm_ahg.rr");
1.6       takayama 1149: // 2 x 2 分割表.
1.1       takayama 1150: [3238] hgm_ahg_expected_values_contiguity([[0,0,1,1],[1,0,1,0],[0,1,0,1]],
                   1151:         [9,6,8],[1/2,1/3,1/5,1/7],[x1,x2,x3,x4]|geometric=1);
                   1152: oohg_native=0, oohg_curl=1
                   1153: [1376777025/625400597,1750225960/625400597,2375626557/625400597,3252978816/625400597]
1.6       takayama 1154: // 2 x 2 分割表の期待値.
1.1       takayama 1155:
1.6       takayama 1156: // 2 x 3 分割表.
1.1       takayama 1157: [3238] hgm_ahg_expected_values_contiguity(
                   1158:  [[0,0,0,1,1,1],[1,0,0,1,0,0],[0,1,0,0,1,0],[0,0,1,0,0,1]],
                   1159:  [5,2,4,3],[1,1/2,1/3,1,1,1],[x1,x2,x3,x4,x5,x6]|geometric=1);
                   1160: [5648/4483,7844/4483,4440/4483,3318/4483,10088/4483,9009/4483]
1.6       takayama 1161: // 2 x 3 分割表の期待値. 上と同じ問題.
1.1       takayama 1162:
                   1163: /*
1.6       takayama 1164:   dojo, p.221.  成績3以下の生徒は集めてひとつに.
1.1       takayama 1165:   2 1 1
                   1166:   8 3 3
                   1167:   0 2 6
                   1168:
                   1169:   row sum: 4,14,8
                   1170:   column sum: 10,6,10
1.6       takayama 1171:   0 を一つ含むので, (3,6) 型の A から 7 列目を抜く.
1.1       takayama 1172: */
1.6       takayama 1173: // 3 x 3 分割表. 構造的0が一つ.
1.1       takayama 1174:
                   1175: A=[[0,0,0,1,1,1, 0,0],
                   1176:    [0,0,0,0,0,0, 1,1],
                   1177:    [1,0,0,1,0,0, 0,0],
                   1178:    [0,1,0,0,1,0, 1,0],
                   1179:    [0,0,1,0,0,1, 0,1]];
                   1180: B=[14,8,10,6,10];
                   1181: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1],[x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
                   1182:
1.6       takayama 1183: // 答.
1.1       takayama 1184: [14449864949304/9556267369631,10262588586540/9556267369631,13512615942680/9556267369631,
                   1185:  81112808747006/9556267369631,21816297744346/9556267369631,30858636683482/9556267369631,
                   1186:                               25258717886900/9556267369631,51191421070148/9556267369631]
                   1187:
                   1188:
                   1189: /*
1.6       takayama 1190:  上のデータで 0 を 1 に変更.
1.1       takayama 1191:   2 1 1
                   1192:   8 3 3
                   1193:   1 2 6
                   1194:
                   1195:   row sum: 4,14,9
                   1196:   column sum: 11,6,10
                   1197: */
1.6       takayama 1198: // 3 x 3 分割表.
1.1       takayama 1199: A=[[0,0,0,1,1,1,0,0,0],
                   1200:    [0,0,0,0,0,0,1,1,1],
                   1201:    [1,0,0,1,0,0,1,0,0],
                   1202:    [0,1,0,0,1,0,0,1,0],
                   1203:    [0,0,1,0,0,1,0,0,1]];
                   1204: B=[14,9,11,6,10];
                   1205: hgm_ahg_expected_values_contiguity(A,B,[1,1/2,1/3,1,1/5,1/7,1,1,1],[x1,x2,x3,x4,x5,x6,x7,x8]|geometric=1);
                   1206:
1.6       takayama 1207: // 期待値, 答.
1.1       takayama 1208: [207017568232262040/147000422096729819,163140751505489940/147000422096729819,217843368649167296/147000422096729819,
                   1209:  1185482401011137878/147000422096729819,358095302885438604/147000422096729819,514428205457640984/147000422096729819,
                   1210:  224504673820628091/147000422096729819,360766478189450370/147000422096729819]
                   1211:
1.6       takayama 1212: // Z やその微分の計算は hgm_ahg_contiguity 関数がおこなうが, これの簡易インターフェースは
                   1213: // まだ書いてない.
1.1       takayama 1214:
                   1215:
1.6       takayama 1216: 4. x_ij は [GM2016] の1章で,
                   1217:  たとえば 3x3 の時 [[1,1,1],[x_11,x_12,1],[x_21,x_22,1]]
                   1218: となっているが, [GM2016] の Prop 7.1 の対応では,
                   1219:    p = [[1,x_11,x_12],[1,x_21,x_22],[1,1,1]] となっているので注意.

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