fullseye

空の op 名が lowpass に解決し、float16 / float32 が契約の float64 に昇格されていなかった

症状

GenSpark 第 15 報(境界値・型不一致の総当たり)。

なぜ門が通したか

直し

  1. find_op —— 空・空白だけ・文字列でない名前は None(→ _resolve が「unknown operator ‘‘」の KeyError)。
  2. _contract_dtype —— float16 / float32 は float64 に無損失で昇格して op に渡す(値も範囲も変わらないので記録しない。第 1 陣で「float32 昇格は記録しない」と決めた判断は、実は昇格そのものが行われていなかった —— 今回それを行う)。
  3. _policy の文に or None (= FULLSEYE_ON_ERROR, default 'fallback') を足す。
  4. 別名の大小文字とハイフン(第 17 報 N50)—— GAUSS_FILTER / Gauss-Filter が unknown だった。元の綴りに一致が無いときだけ lower() + -→_ で 1 度引き直す(既存の解決は変わらない)。

門: "" / " " / "\t" が apply と run_pipeline で KeyError / float16 と float32 の gaussian が float64 を返し float64 入力と一致(float16 の差は入力量子化のみ)・台帳に記録が無い / on_error の文に None がある。

同報で設計・直し済みとして分けたもの: N28(int8〜uint32 の 0..99 が「桁違い」)= 契約外の整数は dtype の最大値で割る文書化された変換で、台帳に記録される(0..99 の int32 は意味のある画像ではない)。N30(NaN 入力で出力が有限化 / sobel_amp が 1 を超える)= 第 3 陣で非有限出力を記録・strict では停止。1 超の出力は op 側の正規化の問題として保留(image sort の出力を門で clip するかは別判断)。N31(object / str)= 第 1 陣の _reject_untyped。N32〜N34 = 第 4・6 陣。N36 = 索引の層の合算。