YONAPO RESEARCH
研究記録
MedDSL(仮称)

RESEARCH / RECORD

P2-m:縦断比較(同じ slot の二時点の測定を比べる)の実装と内部評価

原文 docs/research/58-p2-m-results.md

17 KB

GitHubで見る

版 be280c0

この文書の目次 7項目

作成日:2026-10-21。状態:P2-iの二端点の換算領域を独立な変数としてP2-fの比較へ渡す専用R5を実装し、両 Python 版の全体回帰を通過。設計56・手指定期待57 に従いました。両文書の「未実装」という記載は設計時点の記録として保持します。独立確認・評価用正解の凍結は未実施で、運用方針29 に従います。単位・数値・property はすべて架空で、外部資料・患者情報・実データは使っていません。

1. 行ったこと

項目 内容
実装 longitudinal.py と native 仕様 longitudinal_spec.json。P2-i の計画を一度だけ再実行し(子の予算は全計画の料金 C)、同じ view の二つの query の行を端点とする。文脈(method・property・specimen)が一致すれば、換算領域から導いた別 ID のリテラルを P2-f の比較(予約12)へ渡す。振り分けは host.py に1行
実行例 examples/p2-longitudinal/:103 JSON・2020必須パス(L41条件・N11条件・B5条件)。生成器は native を import せず、関係・理由・料金を手指定する
宣言 p2-longitudinal-comparison.json:R5、19義務(共通4+R5の3+LC-1〜12)、防護例19。証拠は checked_native_template 9・finite_check 10
別計算 longitudinal_oracle.py:P2-i の別計算(区間差引き)と P2-f の別計算(整数対と証人点)を再利用し、文脈・時刻の順序・理由の和集合・料金・63bit 境界は自前で持つ。関係は二つの経路(換算領域から導いた値どうし、元のリテラルどうし)で求め、一致を要求する
検査 test_longitudinal.py 19テスト(手指定・列挙・単位の不変性・P2-g との差分・P2-i の直接実行との差分・料金・予算の掃引・原子性・接続面の閉包・静的検査・型破損・変異)と、再固定の連鎖の検査2テスト(test_quantity_version.py)
検査器 共通部品 p2_checks.py の未完了行の値の検査に、新しい欄5つを足した。変異の表に B17 を足した(検査器の変異は71件と対照)
登録の入口 既存の実装・仕様・宣言・旧実行例は変更していない。変更したのは登録の入口(host の振り分け、評価・検査の一覧、固定対象、再固定の連鎖、変異の表)だけ(W1)

2. 予測の結果(設計56の W1〜W8)

ID 予測 結果
W1 既存のモジュール・仕様・宣言・旧実行例を変更せずに実装できる。新しいクラスも宣言の書式の変更も要らない 成立。既存の src/med_dsl で変更したのは host.py の2行。既存の examples/p2-* と宣言は0件変更(索引に1行追加)。新しいクラスも書式の変更も不要。ただし、登録の入口として、手で保つ一覧(再固定の連鎖、検査器の欄名)に追加が要った(F4・F6)
W2 組み合わせの結果は個々の通過から決まらない(alias と独立な変数で別の関係)。親にない義務は LC-9〜12 の4件 成立。幅のある同じ記録を二時点で比べると、独立な変数では [less, equal, greater]、共有参照(P2-f の自己比較)では [equal](L02・L03)。点の領域では二つが一致する(L01・L06)。P2-i と P2-f の既存の義務にこの差を区別するものはない
W3 七欄は実装の前に埋まり、実装の最中に七欄へ収まらない決定は出ない(n=3) 成立(七欄の外の基盤を除く)。実装中に増えた決定は七欄の内側の細部(行の欄の形、根拠の欄)だけ。七欄の外にある評価の基盤の更新が2件要った(F4・F6)。設計者は同一
W4 文脈の判定は P2-g の matched_context と共通の断片(全組合せ324対)で一致する 成立。property(2)× specimen(3)× method(3)の18通りの二つの記録、324対で、P2-m の different_* の理由集合が P2-g の比較と一致。三つの理由の部分集合8通りが全て現れた
W5 料金 M = 2 + C + 18N が全要求で成り立つ。P2-i の実費は C、P2-f の実費は12 成立。7固定例(C=27〜71、比較1〜3)の呼び出しの追跡と、乱数430要求の料金の照合で、P2-i の呼び出しは1回・予算=実費=C、P2-f の呼び出しは computed の行ごとに予算=実費=12。途中の資源停止は先に完成した行を変えない
W6 P2-i が計算できても、P2-f の入力の63bit上限により比較が止まる入力がある。目標単位の選び方だけで変わる 成立。分子 2^62 の u_ten を u_base に換算すると 10×2^62(66bit)で、P2-i は計算し、P2-m は rational_integer_limit で resource_limit(L50)。目標が u_ten なら通る(L51)。一方の端点だけの超過でも止まる(L53)。境界の6入力(分子 2^63−1、分母 2^62 など)も別計算と一致。P2-f の呼び出しは1回で、元のリテラルに切り替えた呼び出しはない
W7 関係の集合は目標単位に依らず、元のリテラルを直接比べる第二の経路と一致する 成立。27の大きさ×2単位×27×3単位の全4,374対が、二つの経路で一致。57対×目標単位25通り(1,425比較)で、関係の集合は目標単位に依らない
W8 継承の差分を既存の書式の義務として宣言でき、検査は書けるが、registry は P2-i を指すと理解しない。P2-g との継承は宣言の外の検査だけになる 成立。LC-7(端点の行は P2-i の直接実行と一致)を宣言し、163要求の195組で完全一致を確認。registry はこの義務を P2-i と結び付けない。さらに、P2-g の measurement.py を変更したときの affected() は P2-g と P2-h だけを列挙し、P2-m を含めない。P2-g の比較の理由を一つ壊した木では、P2-g の宣言は登録を拒否されたが、P2-m の19テストのうち失敗したのは P2-g との差分の検査(D2)だけだった

3. 反例の結果(設計56の X1〜X9)

ID 結果
X1 L01・L02・L03・L06。点は certain equal、幅は三つ全てで certain なし
X2 L20〜L28。method の version だけの違いで not_comparable/different_method。選ばれなかった記録の違いは影響しない(L27)。slot の最初の記録・最新の記録で文脈を代用する変異は検出された
X3 L30〜L33。理由は二端点の和集合([no_adopted_measurement, unresolved_measurement_conflict] など)。片方の値で答えを作らない
X4・X5 N03・N04。同じ時点・逆順は invalid_comparison_order、別 slot は unsupported_cross_slot_comparison。自己比較に落とさない
X6 L50〜L53 と境界の6入力(W6)
X7 L12・L13・D3。目標単位が違っても同じ量なら equal。次元が違う目標単位は端点が止まり、理由 incompatible_dimension が出る(L37)
X8 L40。参照時点より後の記録を足しても関係・選択は不変で、source hash と料金(C=29、M=49)だけが変わる
X9 期間内の代表値・平均は作らない。結果に増減・差・傾向・改善・悪化の語を持つ欄も値もない(検査で確認)

4. 分かったこと

  1. 組み合わせが決める4つのこと。 独立な変数、比較可能性(文脈の一致)、方向と順序(同じ slot・前→後)、接続面の閉包。どれも P2-i と P2-f の個々の義務にはなく、断片を結ぶ側で決める必要があった(H4)。
  2. 合成では主題 A〜H だけでは足りない。 12の個別義務のうち8が A〜H、3が意味固有、1(LC-12)が「接続面の閉包」で、これは前段の出力が後段の入力の制約を満たすかという新しい主題だった。P2-k では新しい主題は要らなかったので、単独の能力と断片の合成で、義務の主題の組が違う可能性がある(H2)。1回の観察。
  3. 接続面の閉包は意味の誤りではなく、数値の上限の差である。 P2-i の出力(約分した有理数、中間256bit)は P2-f の入力(63bit)として常に有効ではない。止まるのは安全側で、元のリテラルへ切り替えると P2-i の選択と換算の連鎖を飛ばす。目標単位の選び方で止まる・止まらないが変わる。
  4. 継承は依存と別の関係。 文脈の判定は P2-g の観点を再び述べたもので、P2-g を読まないので depends_on にも書かない。P2-g の変更で affected() が P2-m を列挙しないのは、宣言の書式が継承を表せないため(H8 の根拠の追加)。
  5. 再固定の連鎖は手で保つ一覧(F4)。 一覧から P2-m を外しても、既存の全検査が通った。仕様の内容から連鎖を求める検査(test_quantity_version.py)を足し、外すと失敗することを確認した。
  6. 依存する拡張が増えるほど、依存される側の改訂が広がる(F5)。 P2-i の仕様の hash を含むファイルは、P2-i の例148、P2-j の例170で318、P2-m の例103で421になった(ほかに実装3・宣言1・台帳1)。P2-m を足したことによる既存ファイルの変更は 0。P2-i に比較を足す案(版を上げる案)なら、P2-j の170例を含む、hash を持つ既存のファイル318件を再固定することになる。
  7. 未完了行の値の検査は欄名の一覧に依る(F6)。 漏れの注入検査で、空配列・false の漏れが初回に検出されなかった。値を持たない行の検査を is not None に広げ、変異 B17 を足した。P2-h・j に続く三度目。
  8. 版の更新の予行。 数量の仕様に単位を一つ足す改訂を、コピーした木で行った。再固定の道具(連鎖に P2-m を載せた状態)と生成器だけで、P2-m の103例は hash の値を除いて同一になり、全て通った。手編集は連鎖への1行だけ。

実装の最中に直した誤り

  • 手計算の誤り2件:生成器の料金 L32(53→52)と L33(49→51)。実行前の見直しで式から再計算して見つけ、L32 は最初の置換が当たらず、実行で1件の不一致として現れた。いずれも設計57の表の値ではなく、生成器の転記の誤り。実装の出力に合わせたのではなく、式(設計56の§6)から再計算した値に直した。
  • 検査の2件:認定票に host が certifier 欄を足すことを、完全一致で比べて見落とした(比較を欄ごとにした)。未完了行の漏れの検査の穴(上記7)。

5. 検査の強さ

  • 別計算との比較:全4,374対(二つの経路)、目標単位25通りの不変性1,425比較、乱数400計画(1,004行:computed 466・unassessed 486・not_comparable 52)、境界の6入力、固定例9件。実装と別計算は、状態・理由・関係の集合・端点の選択・料金で比べた。
  • P2-g との差分:324対(W4)。P2-i の直接実行との差分:195組(W8)。
  • 変異:27件(native の関数を一時的に差し替える22件:alias、端点の入れ替え、文脈の省略、slot の最初の記録/最新の記録での代用、理由の片側化、停止した端点の比較、能力の検査の削除、単位の無視、区間の点化、certain の誤り、前提・方向の欠落、元のリテラルへの切り替え、順序・同じ時点・別 slot・方針・必須能力の検査の削除、先払い・確定料金の削除、認定の昇格。定数の変更5件:料金2、文脈の欄の削除3)。全て、意図した例の期待の不一致、または内部の前提の崩れで検出した(実行前に、変異のない状態で同じ例が通ることも確認)。
  • 検査器の変異:B09・B15・B17 を実行し全て検出(対照 Z0 は失敗0)。B17 が今回の追加。
  • 子の呼び出しの注入:P2-i の実費の不一致、P2-f の実費の不一致、P2-f の資源停止(2行目)、P2-i の部分結果、P2-f の未評価を注入し、いずれも期待どおり(部分結果を拾わない、完成した行は保持、実費の不一致は拒否)。
  • 型破損:要求の全ノード×6種の値(null・false・0・空文字・空配列・空object)で、状態は ok/invalid_input/unsupported_profile/resource_limit のいずれかで例外なし。P2-i の静的な負例(40件超)を新しい入口経由で渡し、修復されないことを確認。

6. 検証

Python 3.14.4 と 3.11.17 で、全テスト系列と統合評価を実行しました。

系列 件数 Python 3.14.4 Python 3.11.17
開発 231 通過 通過
追加レビュー系列 52 通過 通過
保存監査 8 通過 通過
P2 351(P2-lの330に、縦断比較19・再固定の連鎖2を追加) 通過 通過
統合評価 P1/P0・拡張・全P2・予算・版比較(2記録) 通過 通過
P1-d の CLI 照合・保存監査・登録検査 P1 20条件・80 JSON・417必須パス、別枠 P0 の37 JSON・221必須パス、監査600+256+32+1 通過 通過
統合評価の対象 P2-m 追加後の分母
登録・義務・防護例 20宣言・259義務・441防護例参照(P2-lの19宣言・240義務・422から、19義務と防護例19を追加)
証拠の強さ checked_native_template 172、finite_check 79、hand_derivation 8
防護例のない義務 既存の3件のまま
独立な拡張の組 150/171(P2-lは134/153)
縦断比較の系列 103 JSON・2,020必須パス。他の系列の分母は変更なし
予算 1,111要求・掃引20,909回、違反0(P2-lは1,009要求・17,177回)

旧い22,052件の挙動 digest(d0a2233574ab350e65217ef6da8ed037fe34020e8ee79eee2506bd9ce4320236)と、生成器による全例・宣言のバイト一致も通過しました(追加した生成器を含む)。固定対象に、設計56・期待57・縦断比較の例・検査・別計算・生成器を加えました。作成者 snapshot で、independent_review / evaluation_frozen は false です。

  • 新 native 仕様 hash:縦断比較 a571a773…(先頭8桁)。既存5仕様(数量 f52ea526…、測定 af1c3a09…、表示 36156316…、期間つき数量 5f5c1388…、期間つき表示 547aeb12…)は変更なし
  • 追加前(99de2ba、P2-lの版の記録の追加後):1,242ファイル、manifest d3b414bd…、束 1091c677…
  • 追加後:1,355ファイル、manifest cbf877d0…、束 fcd90770…(この文書の追加で固定対象は変わらない)

7. 限界と次

  • 三点以上の傾向、差の大きさ、変化率、基準範囲、臨床的有意性、別 slot(別の部位・個体)、別 view(知識の変化)の比較は未対応です。関係の集合の推移を導くことも行いません(L44 は三点の組を二つずつ比べるだけ)。
  • 「独立な変数」は、P2-i が時間相関を追加しないことに合わせた方針で、同じ記録の二時点の値が同じ未知値だという方針は範囲外です(unsupported_comparison_policy)。その方針を足すかは、医学的な意味を含むので別の判断です。
  • 文脈の判定は property・specimen・method の一致だけで、同等性の推論(別の方法だが同等、など)はしません。
  • 設計者・実装者・検査の作成者が同一で、独立確認はありません。手指定の期待と別計算が同じ読み違いを共有する可能性が残ります。
  • 次の候補は、複数の出力先への射影(C7)、実資料評価と薄い臨床ライブラリの試作範囲の選定、継承を宣言する欄(H8)を契約に足すかの判断です。後者は契約の書式の変更を伴うので、着手前に利用者の確認を取ります。独立確認は将来の英語の別リポジトリで行います。

P2-m

同じ区分の文書