トップ 最新 追記

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2008-12-10 [長年日記]

_ [雑記]Solaris10 on QEMU

SADのテスト用のSolatis10が欲しかったので、QEMU上に インストールしてみたのだが、QEMUの仮想NICを認識しない罠 Orz

_ [SAD]Hold

Mathematicaのマニュアルによれば、Holdは式を未評価のまま返すので

In[] := Hold[1 + 1]
Out[] = Hold[1 + 1]

になるのが、Mathematica的には正しい実装らしい

つまり、構文解析時に純粋関数を簡約する SADの実装は Mathematica互換では無い (「構文解析時に純粋関数を簡約する」のは、生出さんによれば仕様である)

本日のツッコミ(全1件) [ツッコミを入れる]

_ AC [他にもMathematicaの実装と異なるものは多いのでしょうか?]


2008-12-16 [長年日記]

_ [SAD]IEEE 754 binary floating pointと decimal表示の相互変換バグを修正完了

  • decimalからbinary floating point変換(Revision 2804)
  • binary floating pointからdecimal変換(Revision 2814)

実装には、ISO C89のstrtodとDavid M. Gayの dtoaを使っています。

ISO Cにstrtodが有るのに逆関数が存在しないのは片手落ちだと思う

昔の日記にある例だと

FFS;
l = {
  11.11111111111,
  11.111111111111,
  11.1111111111111,
  11.11111111111111,
  11.111111111111111,
  11.1111111111111111,
  11.11111111111111111,
  11.111111111111111111,
  11.1111111111111111111,
  11.11111111111111111111,
  11.111111111111111111111,
  11.1111111111111111111111,
  11.11111111111111111111111,
  11.111111111111111111111111,
  11.1111111111111111111111111,
  11.11111111111111111111111111,
  11.111111111111111111111111111,
  11.1111111111111111111111111111,
  11.11111111111111111111111111111,
  11.111111111111111111111111111111,
  11.1111111111111111111111111111111,
  11.11111111111111111111111111111111,
  Null[]};
Scan[With[{a = #}, Print[Map[SameQ[a, #]&, l]]]&, l]; Exit[];
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
String2RealConvTest[max_Real:40] := Module[{reference, min, loop, s, i},
  reference = 1 / 11;
  s = "0.";
  loop = "09";
  min = 1;

  Table[(s = s//loop[1 + Mod[i - 1, StringLength[loop]]];
    Print[StringFill[s, " ", max + 2], " - 1 / 9 -> ",
      ToExpression[s] - reference]), {i, min, max}]];

String2RealConvTest[]; Exit[];
0.0                                        - 1 / 9 -> -.09090909090909091
0.09                                       - 1 / 9 -> -.0009090909090909149
0.090                                      - 1 / 9 -> -.0009090909090909149
0.0909                                     - 1 / 9 -> -9.090909090916921e-06
0.09090                                    - 1 / 9 -> -9.090909090916921e-06
0.090909                                   - 1 / 9 -> -9.090909090792021e-08
0.0909090                                  - 1 / 9 -> -9.090909090792021e-08
0.09090909                                 - 1 / 9 -> -9.090909136588721e-10
0.090909090                                - 1 / 9 -> -9.090909136588721e-10
0.0909090909                               - 1 / 9 -> -9.090908581477208e-12
0.09090909090                              - 1 / 9 -> -9.090908581477208e-12
0.090909090909                             - 1 / 9 -> -9.09133879289925e-14
0.0909090909090                            - 1 / 9 -> -9.09133879289925e-14
0.09090909090909                           - 1 / 9 -> -9.159339953157541e-16
0.090909090909090                          - 1 / 9 -> -9.159339953157541e-16
0.0909090909090909                         - 1 / 9 -> -1.3877787807814457e-17
0.09090909090909090                        - 1 / 9 -> -1.3877787807814457e-17
0.090909090909090909                       - 1 / 9 -> 0
0.0909090909090909090                      - 1 / 9 -> 0
0.09090909090909090909                     - 1 / 9 -> 0
0.090909090909090909090                    - 1 / 9 -> 0
0.0909090909090909090909                   - 1 / 9 -> 0
0.09090909090909090909090                  - 1 / 9 -> 0
0.090909090909090909090909                 - 1 / 9 -> 0
0.0909090909090909090909090                - 1 / 9 -> 0
0.09090909090909090909090909               - 1 / 9 -> 0
0.090909090909090909090909090              - 1 / 9 -> 0
0.0909090909090909090909090909             - 1 / 9 -> 0
0.09090909090909090909090909090            - 1 / 9 -> 0
0.090909090909090909090909090909           - 1 / 9 -> 0
0.0909090909090909090909090909090          - 1 / 9 -> 0
0.09090909090909090909090909090909         - 1 / 9 -> 0
0.090909090909090909090909090909090        - 1 / 9 -> 0
0.0909090909090909090909090909090909       - 1 / 9 -> 0
0.09090909090909090909090909090909090      - 1 / 9 -> 0
0.090909090909090909090909090909090909     - 1 / 9 -> 0
0.0909090909090909090909090909090909090    - 1 / 9 -> 0
0.09090909090909090909090909090909090909   - 1 / 9 -> 0
0.090909090909090909090909090909090909090  - 1 / 9 -> 0
0.0909090909090909090909090909090909090909 - 1 / 9 -> 0
String2RealConvTest[max_Real:10] := Module[{x, s, i}, StandardForm[
  x = 1 - 1e-3;
  Table[(x = (1 + x) / 2;
    s = ToString[x];
    Print[("   "//ToString[i])[-3,-1],
      ": x=", x, " s=", s, " diff=", ToExpression[s] - x];
    ), {i, 1, max}];
  ]];
String2RealConvTest[45]; Exit[0];
  1: x=.9995 s=.9995 diff=0
  2: x=.99975 s=.99975 diff=0
  3: x=.9998750000000001 s=.9998750000000001 diff=0
  4: x=.9999375 s=.9999375 diff=0
  5: x=.9999687500000001 s=.9999687500000001 diff=0
  6: x=.999984375 s=.999984375 diff=0
  7: x=.9999921875 s=.9999921875 diff=0
  8: x=.99999609375 s=.99999609375 diff=0
  9: x=.999998046875 s=.999998046875 diff=0
 10: x=.9999990234375 s=.9999990234375 diff=0
 11: x=.99999951171875 s=.99999951171875 diff=0
 12: x=.999999755859375 s=.999999755859375 diff=0
 13: x=.9999998779296875 s=.9999998779296875 diff=0
 14: x=.9999999389648437 s=.9999999389648437 diff=0
 15: x=.9999999694824219 s=.9999999694824219 diff=0
 16: x=.9999999847412109 s=.9999999847412109 diff=0
 17: x=.9999999923706054 s=.9999999923706054 diff=0
 18: x=.9999999961853028 s=.9999999961853028 diff=0
 19: x=.9999999980926514 s=.9999999980926514 diff=0
 20: x=.9999999990463257 s=.9999999990463257 diff=0
 21: x=.9999999995231629 s=.9999999995231629 diff=0
 22: x=.9999999997615814 s=.9999999997615814 diff=0
 23: x=.9999999998807907 s=.9999999998807907 diff=0
 24: x=.9999999999403953 s=.9999999999403953 diff=0
 25: x=.9999999999701976 s=.9999999999701976 diff=0
 26: x=.9999999999850988 s=.9999999999850988 diff=0
 27: x=.9999999999925494 s=.9999999999925494 diff=0
 28: x=.9999999999962748 s=.9999999999962748 diff=0
 29: x=.9999999999981374 s=.9999999999981374 diff=0
 30: x=.9999999999990687 s=.9999999999990687 diff=0
 31: x=.9999999999995344 s=.9999999999995344 diff=0
 32: x=.9999999999997672 s=.9999999999997672 diff=0
 33: x=.9999999999998836 s=.9999999999998836 diff=0
 34: x=.9999999999999418 s=.9999999999999418 diff=0
 35: x=.9999999999999709 s=.9999999999999709 diff=0
 36: x=.9999999999999855 s=.9999999999999855 diff=0
 37: x=.9999999999999927 s=.9999999999999927 diff=0
 38: x=.9999999999999963 s=.9999999999999963 diff=0
 39: x=.9999999999999982 s=.9999999999999982 diff=0
 40: x=.9999999999999991 s=.9999999999999991 diff=0
 41: x=.9999999999999996 s=.9999999999999996 diff=0
 42: x=.9999999999999998 s=.9999999999999998 diff=0
 43: x=.9999999999999999 s=.9999999999999999 diff=0
 44: x=1 s=1 diff=0
 45: x=1 s=1 diff=0

_ [SAD]Ticket-16は根が深い

Holdした式が勝手に評価されるのは、構文解析器がtfestk()@src/tfeval.fで スタック上で式を組み立てる際に使うtfcomposefull()@src/tfeval.fの内部で tfcomposfun()とtfcomposeoper()で簡約しているためなので、 以下のパッチで抑制できる。

Index: src/tfeval.f
===================================================================
--- src/tfeval.f        (revision 2812)
+++ src/tfeval.f        (working copy)
@@ -820,6 +820,7 @@
      $     itx,irtc,ith,iah,isp0
       real*8 vx
       logical*4 tfconstq,tfheldq
+      go to 10
       if(isp .ne. isp1 .and. rlist(iaximmediate) .ne. 0.d0)then
         if(ith .eq. ntfoper)then
           if(iah .gt. mtfend)then

だが、ReleaseHoldEvaluate絡みの動作はおかしいままである。

特に、EvaluatePackages/init.nで定義されているが、 組み込み関数に対しても作用しなければならないので無理が有る。 (Holdは組み込み関数)

_ [SAD]ReleaseHold

SADScriptの実装とMathematicaのマニュアルを見る限り、 SAD/Tkinterマニュアルの以下の記述は間違いである。

  • 引き数が上の様に頭部にHoldを持たない場合、ReleaseHold[式1] は式1を評価し、その結果を返します

Mathematicaのマニュアルによれば、「複数のレベルにわたりHold等が 適用されている場合でも、ReleaseHoldは1つのレベルからしか Hold等を除去しない。Hold等がネストしている個所は 無視される。」らしい。

In[]  := ReleaseHold[{2, Hold[1 + 1]}]
Out[] := {2, 2}

問題は、一つのレベルの解釈論で...

In[]  := ReleaseHold[{Hold[Sin[1]],Hold[Hold[Cos[1]]],{Hold[Sin[2]]}}]

はどのようにHoldを外すべきであろうか? (注: 最後のHoldはリストの階層的に一段深い階層に存在している)

例えば、「一つのレベル」を式全体に通用する階数指定子だと考えるか、 ここの部分式を辿る際の階数指定子と考えるかで次のような解釈がありえる。

  1. 式を上から深さ方向に辿るときに最初に出会うHoldをすべて解除する
  2. 式を上から深さ方向に辿るときに最初に出会うHoldと同じ深さのHoldのみを解除する

SADScriptでのReleaseHoldは、現時点では(1)で実装されている。


2008-12-19 [長年日記]

_ [SAD]CaReadでSingle Pass BPMのWaveformが読めない

CaMonitor[]と cagetコマンドで見えるのにCaRead2[]で読めない。 発生するエラーメッセージは、EPICS_CA_MAX_ARRAY_BYTESもしくは 実装制限で転送に失敗という意味。

調査の結果、CaRead2[]の実装バグ。 IOC側の設定によらずDOUBLEでの転送を要求して、転送量超過で失敗 (IOC側は、INT(SHORT)で設定されている模様)


2008-12-22 [長年日記]

_ [SAD]いろいろバックポート

取り合えず、自分がOptics Panelで使うのに必要そうなものを入れてみる

  • eval1_()/autos_()修正
    • 数値データのascii dump/loadでのラウンドトリップ変換を実現
  • mkdepユーティリティアップデート
    • make dependのスピードアップ(再帰関数のメモ化による)
  • GO SAD scriptのコマンドロギング機能追加
    • クラッシュログからの起動コマンドラインの逆引き用
  • TrableForm[]のバグ修正というか再実装?
    • 末尾の指数部が欠損するバグの修正
  • ソレノイド中のTransferMatrices/ClosedOrbitの一個ずれバグの修正
    • アフィン変換抽出用の修正
  • Fortran bisonの掃除というか廃棄

カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記