気候システムレポートの読み方

数値は stats/climate.yaml にあります。 tests/diagnostics/climateStatsReport.test.ts が、core.yaml の定義どおりに世界を回して測った シミュレーションの実測値です。core.yaml を変更したら再生成します。

npm run stats:climate

この文書は手書きで、再生成しても書き換わりません。 持つのは読み方——何を測ったか、どこに線を 引いたか、何を数えていないか——だけです。数値そのものは1行も書きません(書けば、再生成した YAMLとずれます)。

YAMLの節

unit は、そのレコードの測定値(mean〜max・estimated・travel・outdoor_search・handwork)の 単位です。 件数(n・seeds・days)は単位を持ちません。segment は各季節インスタンスの実持続期間の 3等分区間で、overall(全体)・early(序盤)・middle(中盤)・late(終盤)です。

分布のレコードは mean・min・p5(5%ile)・p95・max・sd(標準偏差)・n(標本数)を 持ち、標本が足りずに決まらない数は null です。

節 中身
meta 回した種の数と、1種あたりの日数
input_fingerprint 指紋を取った入力ファイルと、その中身のsha256の先頭
season_moisture_rate 季節ごとの大気水分量レート(1tickあたり、非雨天時)
rain_weather_moisture_decrement 降雨の天気ごとの、推定した自己減算(1tickあたり)
rain_weather_net_moisture_delta 同じものの素の実測(天気×季節ごとの正味変化量)
season_duration 季節1インスタンスの持続日数
activity_hours 土地×季節ごとの、移動できる時間・屋外で見て探せる時間・手元の作業ができる時間
excluded_locations 活動時間表が数えなかった土地と、外した根拠のタグ
temperature 季節×区間ごとの気温(内部値)
weather_hours 季節×天気×区間ごとの発生時間
non_rain_streak 季節×区間ごとの連続未降雨時間
rain_streak 季節×区間ごとの連続降雨時間

この表とYAMLが食い違うと npm test が赤くなります。 表に挙げた節がYAMLに在って空でないことと、 表に無い節がYAMLに無いことの両方を、生成元のテストが見ます。

計測方法

再生成し忘れると赤くなる

このレポートだけ、npm test での見方が他と違います。 他は丸ごと作り直して比べますが、 このレポートのシミュレーションは1分強かかるので npm test では回せません。代わりに次を見ます。

指紋が見るのは core.yaml だけです——シミュレーションが読むのはworldの定義で、それはそこにしか 無いため。土地の明るさを読む activity_hours の側は、その線の外にあるので再計算で見ています。

丸ごとの突き合わせは、main への push のたびに走る regenerate-stats.yml が持ちます。 シミュレーションのコードを変えて古くなったぶんは、指紋にも再計算にも映らないので、そこでしか 現れません(見張りが2本立てであることは README.md 参照)。

大気水分量のレート・自己減算

core.yamlの設定値の実測値。atmospheric_moistureの値域の端に達したtickは除外します——端では レートが値域に食われ、宣言した量より小さく見えるためです。端がいくつかは定義から読むので、値域を 動かしても除外はついてきます。

rain_weather_moisture_decrement の estimated(推定自己減算)は「その天気の間の正味変化量 − その季節のレート」を、季節ごとの標本数で重み付け平均したもの。天気自身の自己減算は季節に依らない 単一の値のはずなので、どの季節から推定しても本来は同じ値になる。素の実測は rain_weather_net_moisture_delta に出しています。

season_moisture_rate で dry の標準偏差が0でないのは、最初のdry季節に難易度の初期補正 (ClimateSystem.md 5.2節)が重なるためです。

土地×季節ごとの活動時間

src/analysis/activityHours.tsが、core.yamlのhour・weatherの段(太陽高度と天気の透過率が ambient_brightnessへ与える寄与)・土地ごとのambient_brightness・上の天候の出現時間(平均)から 数える(IlluminationSystem.md 5節のしきい値: 移動 −5・ 屋外の採取 +3・手元の作業 +5)。光源は含まない——据えた炉も、手に持つ松明もこの表には入らない (松明1本が何を開くかはContentSkeleton.md 8.1.1.4節)。

列は行動のクラスと1対1で、travel(土地の間を移動する)・outdoor_search(屋外で見て探す=採取と 探索)・handwork(手元の細かい作業)。outdoor_searchがhandworkより長いのは、しきい値だけの差 ——見る値は違う(採る側はlooking_brightness、作る側はhand_brightness)が、据え付けの光源が無ければ どちらも土地のambient_brightnessをそのまま土台にするので、同じ明るさを別々のしきい値で切ったものになる。 採取と探索を別の列にしないのは、風雨の扱いまで揃っているから (ContentSkeleton.md 8.1.4節が嵐を屋外の行動すべてへ掛けている)。

嵐の時間はどの列からも引く。 引かないのは浅い洞窟だけ——岩陰に守られていて風雨が届かない。 建てた屋根は行にならないので、handworkの列は「屋根を建てていない場合」を出している。

数えるのは島の土地だけで、海区(voyage.yaml)は行にしない。海区は 探索でき、寝られ、雨も貯まるので集め方の条件(locationタグ+exploration_progress)をそのまま 満たすが、この表が答えたいのは島の1日。外した場所はexcluded_locationsに出る。