MMLF 1.0
文件本身就是程式。
MMLF 是一份具型別的 YAML 或 JSON 文件,它同時是輸入、是程式、也是被稽核的對象。v1.0 凍結了它的表面與計算語意。
穩定性規則
MMLF 1.0 凍結 Runtime 0.9 所實作的文件表面與計算語意。Runtime 1.x 可以新增選用的向後相容欄位。不相容的語意變更必須進到 MMLF 2.0 並提供遷移路徑 —— 它沒有資格從一個 minor release 溜進來。
一份完整的文件
這就是 CI 每次 commit 都會跑的穩定範例。四個根欄位是必要的,其餘全部選用且只增不減。
format: MMLF
version: "1.0"
ledger_id: mmlf-v1-stable-demo
metadata:
title: Stable MMLF 1.0 arithmetic demo
authors: [Neo.K]
license: Apache-2.0
objects:
- id: source-three
type: real
value: 3
branches:
- id: add
source_id: source-three
base: 3
operator: add
operand: 2
expected_result: 5
- id: multiply
source_id: source-three
base: 3
operator: multiply
operand: 2
expected_result: 6
layout:
- [add, multiply]
traversals:
display: [left_to_right, right_to_left]
execute: dependency_topological
audit_policy:
local_required: true
signed_global_cancellation_allowed: false
numeric_tolerance: 1.0e-12注意 traversals。顯示順序與執行順序是分開宣告的,因為「由左至右讀一個矩陣」和「依相依關係執行它」是關於同一個物件的兩個不同問題。
也注意 expected_result。文件自己說出它認為答案是什麼 —— 這正是局部稽核之所以可能的原因:Runtime 有一個可以跟它意見不同的對象。
選用區段
每一個都打開一層能力。一份全部省略的文件依然有效,並以「決定性算術+局部稽核」的方式執行。
| 區段 | 打開什麼 |
|---|---|
metadata | 標題、作者、授權、遷移來源 |
objects | 分支可以取用的具型別來源 |
layout | 矩陣排列 |
traversals | 顯示與執行順序,分開宣告 |
audit_policy | 什麼算失敗、容忍度多少 |
evaluation_scenarios | 對符號值的代入情境 |
constraints | 列、欄、區塊與區域條件 |
fixed_point_groups | 帶收斂契約的疊代群組 |
corrections | 只追加的補帳,絕不就地修改 |
fdcs | 反事實干預、不確定性、決策 |
boundary_events | 模型邊界上宣告的事件 |
遷移
0.1 到 0.9 的文件依然載入得進來,也依然照它自己宣告的版本執行。遷移到 1.0 是一個獨立且經過驗證的操作。
mmlc migrate examples/four_operations.yaml \
--output migrated/four_operations_v1.yaml- 以原始 Schema 驗證來源文件。
- 正規化舊語法。
- 寫出一份穩定的 MMLF 1.0 文件。
- 透過 metadata 保存原本的語意功能輪廓。
- 驗證遷移後的文件。
- 決定性地執行來源與目標,比對一份與版本無關的快照。
第四步才是關鍵。遷移後的文件會帶著 metadata.migrated_from,Runtime 依那個被記下來的輪廓執行它。
migrated_from 是有作用的,不是裝飾。少了它,把一份 v0.5 文件遷到 1.0 表面就會默默啟用那份文件被寫下來時還不存在的執行語意。
在發布驗證中,40 個範例完成遷移、12 個遷移等價案例受檢,失敗數為零。
形狀與語意
跑的是兩種不同的檢查。把它們混為一談,就是一份文件「通過驗證卻什麼都沒表達」的由來。
- JSON Schema
- 驗文件形狀。
- Runtime 驗證
- 另外檢查 ID、版面、參照、運算子定義域、相依環、干預衝突、固定點契約,以及各功能專屬的不變式。
所有 Schema 都隨安裝後的 Python 套件放在 mmlc.schemas 底下,因此不論是 editable 安裝、wheel、source distribution 或一般安裝環境,驗證行為完全一致。
正規化數值
有支援的地方,MMLC 保留精確分數與符號值。輸出序列化使用正規化的帶標記表示,而不是安靜地把一切轉成浮點 —— 這就是「一本可稽核的帳」與「一本大致正確的帳」之間的差別。