ToDo:
軌道応答に対してTransfer Matrixを当てはめる動作原理自体には 問題は無いようなので、ツール形式のものを作成&テストベクターを 作って入出力の検証を開始。
ラフなテストでは、エラーに対する感度がβ関数のフィットよりも 厳しいような感触なのが気がかりだが、それ以上に致命的なのが 実行速度で、テストデータで共役勾配法が収束するのに手元の NotePCで2時間以上かかる。
βのフィットが数分のオーダーで終わることを考えると100倍程度遅い。 使っている軌道の本数の差を考慮しても 20倍以上遅いので、 オンラインでの使用には厳しいだろう。
ただ、問題の次元数を考えると当然の結果かもしれない。 β関数のフィットの場合、軌道に摂動をかけるステアリング側の β関数と位相関数をパラメータにして計算しているのに対して、 Transfer Matrixのフィットでは各BPMに 3自由度 (実際には4自由度&行列式への拘束条件)を与えて計算しているので 「BPMの数 / 軌道の数」の比で演算量が増えている。 それなりに実用的な条件を想定すると、「BPMの数 >> 軌道の数」が 成立するので、激しく重くなる。
一台実施
portsのリビルドに関して、メモを残す
waitが真(default)の場合、cmdstat引数を省略するとコマンドが見つからない場合、Fortran runtime errorでプロセスが終了する(gfortran8.3で確認)
waitが偽の場合は、cmdstat引数の有無に依らずexecute_command_lineは成功する (cmdstatの戻り値は常に0、exitstatは更新されない)
非同期実行時にエラーハンドルできなくなる理屈は理解できるが、動作が一貫してない気がする…
さらに調べると、Fortran runtime errorの発生条件は正確にはcommand not foundでは無くexitstatの戻り値で決まる模様(gfortran8.3の実装)
少なくともgfrotran8.2の実装では、exitsat=127だとFortran runtime errorとなる(exitstat=126も同様)
call execute_command_line('exit 1', exitstat=i) write(*,*)'exit 1 -> ', i call execute_command_line('exit 127', exitstat=i) write(*,*)'exit 127 -> ', i
libgfotranをバラしてみるとそのものズバリのコードが
/* Synchronous execution. */ int res = system (cmd); if (res == -1) set_cmdstat (cmdstat, EXEC_SYSTEMFAILED); #ifndef HAVE_FORK else if (!wait) set_cmdstat (cmdstat, EXEC_SYNCHRONOUS); #endif else if (res == 127 || res == 126 #if defined(WEXITSTATUS) && defined(WIFEXITED) || (WIFEXITED(res) && WEXITSTATUS(res) == 127) || (WIFEXITED(res) && WEXITSTATUS(res) == 126) #endif ) /* Shell return codes 126 and 127 mean that the command line could not be executed for various reasons. */ set_cmdstat (cmdstat, EXEC_INVALIDCOMMAND); else set_cmdstat (cmdstat, EXEC_NOERROR);
stdoutのredirectionまで考慮すると、自前でsystem(3)総統を実装すべきか? (シグナル処理回りの可搬性が気になる所だが…)
一応、sort_utils.hとseq_utils.hを使ったIntersection/Complement実装が完了
これで、Sort/Union/Intersection/Complementに関しては、SADインタプリタスタックに依存せずに処理可能になったはず
とりあえず、基本機能は実装完了
実装途中で整理が必要なのは
実用上必要なのが、
実用上、Join/Map関連が再実装できると、長いリストが気軽に扱える用になってGood
実装の整理を目的にAPIよstring-buffer構造体の中身と動作の調査を開始…
コンソール向けに出力幅制御関連の妙な仕掛けが多く、関連コードが散らかっている・パラメータがilist配列のインデックスのみで無名なので、意味論の解読に骨が折れる Orz
一部のイケてない実装 (arguemnt数確認前にstackを読み出すおバカさん)のために、関数コール前に zero arguement時に Nullを積み込んでいる実装の副作用で引数エラー回りの処理が面倒になっているので解決したい
アイデア段階だけど、次のような手順で直せばいいのでは?
とりあえず、NPTv6の予備的な試験でipfwのcrashを見つけた int_prefixに/nなprefixlen付き表記を使うと落ちる
ipfw nptv6 foo create ext_if em0 int_prefix ####::/64
int_prefixにprefixlenを含めず、別途prefixlenパラメータを指定するのはOK
sbin/ipfw/nptv6.cのnptv6_createのバグで、nptv6_parse_prefixでデコードした結果にprefixlenが含まれる際にgoto check_prefix;でprefixlenの範囲を検査するコードに委譲するのだが、先方はprefixlenオプション直後のchar pointer pの指す内容も検査しているため、未初期化ポインタによる参照でcrashする
とりあえず、check_prefixラベルの前後にポインタ検査とplenの検査を分離して解決
やはり、main(14-CURRENT)も治ってないぽぃ
あまり使ったという話が流れてないので、誰も使ってないのかなぁ・・・
IPv6 LAN向けの検証作業
実装完了〜
Linux/SambaなNASからのNFSマウントを除けば、MicrosoftなUCS符号位置のファイルは見ずに済むようになった
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記