データファイル
SpecForgeはシグナルデータとして CSV、JSON、JSONL(NDJSONとも呼ばれる)の3つのデータ形式をサポートしています。 パラメータはJSONファイルで別途指定します。
シグナルデータ
各データサンプルには time フィールドと1つ以上のシグナル値があります。
time フィールドは必須で、正確に time という名前でなければなりません(大文字・小文字を区別)。
任意の数値(整数または浮動小数点数)を受け付け、サンプルは時刻の昇順で並べる必要があります。
CSV
各列ヘッダーがシグナル名に対応します。
レコード型シグナルはセパレータ(デフォルトは _)でフラット化されます。
time,speed,ambient_temp,gps_lat,gps_lon
0.0,0.0,25.0,34.634,135.996
1.0,30.0,26.0,34.635,135.997
CSV内の真偽値は true/false、True/False、または 1/0 で記述できます。
JSON
time キーと value キーを持つオブジェクトのJSON配列です。
レコード型シグナルにはネストしたJSONオブジェクトを使用できます:
[
{
"time": 0.0,
"value": {
"speed": 0.0,
"ambient_temp": 25.0,
"gps": { "lat": 34.634, "lon": 135.996 }
}
},
{
"time": 1.0,
"value": {
"speed": 30.0,
"ambient_temp": 26.0,
"gps": { "lat": 34.635, "lon": 135.997 }
}
}
]
フラット化することもできます(レコードエンコーディングを参照):
[
{
"time": 0.0,
"value": {
"speed": 0.0,
"ambient_temp": 25.0,
"gps_lat": 34.634,
"gps_lon": 135.996
}
},
{
"time": 1.0,
"value": {
"speed": 30.0,
"ambient_temp": 26.0,
"gps_lat": 34.635,
"gps_lon": 135.997
}
}
]
JSONL
JSONと同じですが、外側の配列なしで1行に1オブジェクトずつ記述します。
{"time": 0.0, "value": {"speed": 0.0, "ambient_temp": 25.0, "gps": {"lat": 34.634, "lon": 135.996}}}
{"time": 1.0, "value": {"speed": 30.0, "ambient_temp": 26.0, "gps": {"lat": 34.635, "lon": 135.997}}}
列名
データファイルの列名はスペック内のシグナル宣言と一致する必要があります。 シグナル名が列名にどのように対応するかは、コンポーネント階層とレコードエンコーディングの2つの要素によって決まります。
注意: データファイル内でシグナル宣言と一致しない余分な列は、警告なく無視されます。
コンポーネント階層
システムコンポーネントのシグナルには、:: で区切られたコンポーネントパスがプレフィックスとして付きます。
例えば、Battery システムが次のように定義されている場合:
system Battery
signal level: Float
signal voltage: Float
そして、それを使用する Vehicle が次のように定義されている場合:
system Vehicle
signal speed: Float
component battery: Battery
データファイルには speed(直接シグナル)と battery::level、battery::voltage(Battery コンポーネントのシグナル)の列が必要です。
CSVでは次のようになります:
time,speed,battery::level,battery::voltage
0.0,0.0,80.0,7.4
JSONでは、コンポーネントをネストしたオブジェクトとして記述することもできます:
{
"time": 0.0,
"value": {
"speed": 0.0,
"battery": { "level": 80.0, "voltage": 7.4 }
}
}
レコードエンコーディング
レコード型のシグナルはフィールドを別々の列として表現する必要があります。 エンコーディングモードは2種類あります。
フラット(デフォルト): レコードフィールドをセパレータ(デフォルトは _)で連結します。
これはすべての形式に適用されます。
例えば、次のシグナルが定義されている場合:
signal gps: { lat: Float, lon: Float }
列は gps_lat と gps_lon になります。
time,gps_lat,gps_lon
0.0,34.634,135.996
カスタムセパレータを指定することができます。
セパレータには ,、"、\、:: を含めることはできません。
ネスト: レコードフィールドをネストしたJSONオブジェクトとして表現します。 これはJSONとJSONLにのみ適用されます。
{
"time": 0.0,
"value": { "gps": { "lat": 34.634, "lon": 135.996 } }
}
マップされたシグナル
式ボディを持つコンポーネントシグナル(マップされたシグナル)は他のシグナルから計算されるため、データを必要としません。
例えば、2つのシグナルを持つ PowerUnit が次のように定義されている場合:
system PowerUnit
param max_output: Float
signal output: Float
signal temperature: Float
Vehicle は temperature を式にマップできます:
component power: PowerUnit {
signal temperature = ambient_temp + speed * 0.5
}
ここで power::temperature は計算されるため、データファイルに含める必要はありません。
power::output のようなマップされていないシグナルのみがデータ列を必要とします。
パラメータファイル
パラメータファイルの構造は、スペック内のパラメータ宣言を反映します。
Vehicle システムは独自のパラメータを宣言し、PowerUnit のパラメータに値を提供します:
system Vehicle
param temp_threshold: Float
component power: PowerUnit {
param max_output = 100.0
}
対応するパラメータファイル:
{
"temp_threshold": 50.0
}
デフォルト値を持つパラメータは省略できます。
上記の例では、power::max_output のデフォルト値は 100.0 であるため、ファイルに含まれていません。
すべてをまとめる
上記の Battery と PowerUnit システムを組み合わせます:
system Vehicle
signal speed: Float
signal ambient_temp: Float
signal `fuel level`: Float
signal gps: { lat: Float, lon: Float }
param temp_threshold: Float
component battery: Battery
component power: PowerUnit {
param max_output = 100.0
signal temperature = ambient_temp + speed * 0.5
}
パラメータファイルには temp_threshold を指定し、power::max_output(デフォルト値あり)は省略します:
{
"temp_threshold": 50.0
}
このシステムのCSVデータファイル(フラットエンコーディング、_ セパレータ):
time,speed,ambient_temp,fuel level,gps_lat,gps_lon,battery::level,battery::voltage,power::output
0.0,0.0,25.0,100.0,34.634,135.996,80.0,7.4,0.0
1.0,30.0,26.0,99.8,34.635,135.997,78.0,7.3,40.0
`fuel level` はバッククォートなしで fuel level として表示され、power::temperature はマップされたシグナルであるため省略されています。
同じデータのJSON(ネストエンコーディング):
[
{
"time": 0.0,
"value": {
"speed": 0.0,
"ambient_temp": 25.0,
"fuel level": 100.0,
"gps": { "lat": 34.634, "lon": 135.996 },
"battery": { "level": 80.0, "voltage": 7.4 },
"power": { "output": 0.0 }
}
},
{
"time": 1.0,
"value": {
"speed": 30.0,
"ambient_temp": 26.0,
"fuel level": 99.8,
"gps": { "lat": 34.635, "lon": 135.997 },
"battery": { "level": 78.0, "voltage": 7.3 },
"power": { "output": 40.0 }
}
}
]
注意事項
- シグナル型が
Floatの場合、整数値は自動的に Float に変換されます。 - データ形式はファイル拡張子(
.csv、.json、.jsonl)から自動検出されますが、--file-formatCLIフラグで上書きすることもできます。