計算成功と検証完了を区別する
一言でいうと
計算機の終了コードが0でも、答えが正しいという意味ではありません。回路条件・波形・分析コード・モデルの限界がつながっていてはじめて、ほかの人が結果を再検討できます。
なぜ必要なのか
きれいなグラフが得られました。しかし、伝搬時間を2倍に誤入力していたり、昨日作ったCSVを読んでいたりすれば、そのグラフは誤った回路を忠実に描いているだけです。プログラムが終わったという事実と、知りたい質問に答えたという事実の間には隔たりがあります。このモジュールは、その隔たりをテストとファイルの根拠で埋めます。
「終端抵抗を入れました」という主張にも抜けは生じます。同じファイル名で上書きした前の波形、単位のない時間の列、入力電圧が抜けた表、公差の組み合わせが1つ欠けた要約は、再検討を難しくします。最後の課題は、長い文章の報告書ではなく、どのモデル・コード・データを使ったのかを確認できる小さな対応リストです。
どう動くのか
ラボのジェネレーターはJSONの数値だけを受け取り、固定されたngspiceのネットリストを作って実際に実行します。model.cirには回路、trace.csvにはtime_s・drive_v・tx_v・rx_vの4列、run.jsonには入力モデル・サンプル数・受信最大値・ファイルハッシュが保存されます。電源入力の列もあるので、誤った入力と出力側の回路の問題を区別できます。
時間刻みは、単なるグラフの解像度の設定ではありません。エッジや変化を数値計算がどれだけ細かく追えるかに影響します。ラボでは、直列終端のモデルを最大時間刻み0.02nsと0.01nsでそれぞれ実行します。ngspiceは必要な位置に追加のサンプルを置くことがあるので、2つのCSVの行番号が同じ時刻を指すと仮定してはいけません。
比較の規約は、粗い波形のすべての時刻で細かい波形を線形補間し、TXとRXの電圧差の絶対値のうち最大のものを求めることです。入力の列は、この関数の比較対象から外します。2つの波形の時間は昇順で、開始と終了が同じで、少なくとも2点あると仮定します。範囲の外には外挿せず、戻り値の単位はVです。
簡単な例を考えてみましょう。細かい波形が1秒で1V、3秒で3Vなら、2秒の値は線形補間で2Vです。粗い波形の2秒のサンプルが2.1Vなら、その点での差は0.1Vです。行番号どうしで比べると、2秒の値を3秒と突き合わせて、0.9Vの差があると誤って判断することがあります。実際のラボはns規模ですが、補間の方法そのものは同じです。
時間刻みを小さくしたら差が小さくなったのは、数値的に有用な根拠です。ただし、2回とも同じ誤ったモデルを計算していたなら、互いに一致することがあります。そのため採点ツールは、新しいソルバーの実行と比べるだけでなく、別の反射の漸化式で最初の3つの平坦部も確認します。独立した基準も同じ理想的な線路の仮定を使うので、実物の正確さを保証するものではありません。
ファイルハッシュは、別の質問に答えます。「この結果は正しいか」ではなく、「検討したファイルはそのファイルか」です。SHA-256の文字列はファイルの内容が変わると変わりますが、誤った回路も自分のハッシュを持てます。したがって、trace.csvを修正してrun.jsonのハッシュまで計算し直しただけでは、正しい実験にはなりません。採点は、ファイルの内容と実際の回路の応答も比較します。
最終的なrelease.jsonには、model_typeをideal_single_mode_losslessに、measuredとpcb_certifiedをfalseに、target_verification_requiredをtrueにして書きます。これは免責のための飾りではなく、行った範囲の明示です。数値実験を実際の計測と呼んだり、伝送線路の例題に合格したことをPCB全体の認証にすり替えたりしないためのフィールドです。実物の検証は、あとで別の実験によって示す必要があります。
sha256オブジェクトは、ステップカードが指定した相対パスをキーに使います。波形・実行レポート・入力JSON・Python分析・公差の最大値リストをつなぎます。絶対パスをキーにしたり、バックアップファイルまで勝手に入れたりすると、約束した報告書の形式と変わります。分析コードを修正したなら、結果を確認し直してから、最後にハッシュを書き直す必要があります。
現場での姿
今回のラボは、基本的なシェルコマンドと、Pythonの関数・リスト・辞書を使える学習者を対象にしています。mkdirで作業フォルダーを作り、JSONの数値は引用符で囲みません。csv.DictReaderが返す値は文字列なので、floatに変換しないと計算できません。ファイル名・関数の引数・戻りのキーを先にそろえておけば、形式の推測に時間を使わずに済みます。
分析関数では、画面への出力ではなく戻り値を使います。採点ツールはさまざまな入力を新しいプロセスに渡してJSONの結果を読むので、デバッグ用のprintが混ざると結果の形式が壊れます。NaNや無限大は許可されません。関数の実行にはCPU・メモリ・時間・出力の上限があり、無限ループは正解ではなく実行失敗として知らされます。この上限は、受講時間とは別の制限です。
回路ジェネレーターの出力フォルダーは、新しい名前でなければなりません。前の結果を保存するために、同じフォルダーへの上書きを拒否します。正解を見ながら進める操作で再実行すると、既存のファイルやフォルダーはpreviousが付いた別の名前で保管され、新しい結果が作られます。必要な比較が終わったら、どのファイルを提出の対象にしたのかを、もう一度確認してください。バックアップがあっても、セッションの終了後に残るわけではありません。
ラボの所要時間の目安は75分です。基本セッションの60分が終わる前に、+時間で延長する必要があり、最大は180分です。理論を読む時間とラボの時間を区別し、終了前にソースと報告書を自分の保存先にコピーしておいてください。Podには永続的に保存するボリュームがないので、終了後にターミナルのファイルを復旧することはできません。実際の機器の接続や、外部パッケージのインストールは必要ありません。
次のラボですること
基準波形の生成、しきい電圧への到達時刻、反射式の実装、直列終端、並列終端と電力、9つの公差の組み合わせ、時間刻みの比較、最終的な根拠の報告書を、順に仕上げます。途中のステップでは、次のステップがまだ通らないのが正常です。最後の採点は前のステップのファイルまで確認し直すので、数字だけを書いた報告書で代わりにすることはできません。