# 計算の精度

## TL;DR

AstroWay API は **Swiss Ephemeris**（Astrodienst 公式の C コードで、30 年以上にわたりプロのアストロロジーで使用されている **Solar Fire ($495)、Kepler ($995)、Astro Gold ($29.99/月)、Janus** の基盤）を採用しています。これを WebAssembly にコンパイルし、REST API 層で提供しています。仲介業者のマージンはありません。各基本計算エンドポイントは regression snapshot テストでカバーされており、精度は **triangulation**（3 つの独立したソースと **NASA 5-Millennium Eclipse Catalog** による検証）で確認されています。

- **惑星位置**: `< 0.1 秒角`（swetest CGI Astrodienst 公式と比較）
- **Placidus ハウス・カスプ**: `0.000"` exact match
- **日食**: `< 1 分`（NASA Eclipse Catalog と比較）
- **ACG ライン**: 赤道上で `< 1.5 km`（swetest と比較）
- **日の出/日の入り**: `< 10 秒`（timeanddate.com と比較）
- **ムーン VOC、イングレス、惑星会合**: 数秒単位の精度

## エンジン

| コンポーネント | 値 |
|---------------|----|
| ライブラリ | Swiss Ephemeris C code (aloistr/swisseph) |
| バージョン | upstream Astrodienst C code |
| バインディング | swisseph-wasm（Node.js 用 WebAssembly） |
| Ephemeris | DE431 JPL ephemeris（`.se1` ファイル経由） |
| フォールバック | Moshier analytical（1800–2399 年外の日付用） |
| コード共有 | app.astroway.info と共有の `@/core` — エンジンは 1 つ、トランスポートは 2 つ |

## 検証手法

精度は **triangulation**（3 つの独立したソースとの比較）で検証されます。

### 1. swetest CGI（リファレンス実装）

Astrodienst 自身が提供する Swiss Ephemeris の公式リファレンス実装です。Astro.com を作成し、世界中の数百万人のアストロロジストにサービスを提供しています。最も権威ある公開ソースです。当社のエンジンは **同一**（角度秒で 0.00–0.07 のドリフト）。

### 2. Kerykeion（Python）

Python ライブラリで、当社の WASM ではなく `pyswisseph` バインディングを使用しています。当社の WASM 層がデータを歪めていないことを確認します。

### 3. Prokerala API

リモート Swiss Ephemeris API（サイデリアン Lahiri）。8–17 秒角の系統的ドリフトは Lahiri ayanamsa の異なる計算式に起因し、**エンジンの精度とは関係ありません**。

## Triangulation 結果

| チャート | swetest（Astrodienst）と比較 | Kerykeion（Python）と比較 | Prokerala API と比較 |
|---------|-----------------------------|---------------------------|---------------------|
| Monroe 1926   | **0.00"** | 0.19" | 16.95" (systemic) |
| Diana 1961    | **0.00"** | 0.69" | 8.18" (systemic)  |
| Einstein 1879 | 0.07"     | Kerykeion の LMT アーティファクト | 14.96" (systemic) |

## エンドポイントレベルの regression テスト

各基本計算エンドポイントは、3 つのリファレンスチャート（Monroe / Diana / Einstein）に対して **{siteMeta.snapshotCount} 個の snapshot テスト** でカバーされています。

Snapshot-suite が検出するもの：
- **入力マッピングのバグ** — 惑星 ID、UT、ハウスシステムの誤り
- **後処理** — 四捨五入、単位変換、符号の損失
- **デフォルトの不一致** — mean vs true node、地心 vs 地上座標
- **Schema drift** — バリデーションで不正な形式が通過
- **古いデプロイ** — prod dist がコードと一致しない

許容誤差: デフォルトで全ての数値フィールドに対し `5e-5°`（≈0.18 秒角）。

## 詳細ベンチマーク

### 惑星位置（トロピカル、swetest と比較）

| チャート | 日付 | 最大ドリフト |
|---------|------|--------------|
| Marilyn Monroe  | 1926-06-01 | **0.00"** |
| Princess Diana  | 1961-07-01 | **0.00"** |
| Albert Einstein | 1879-03-14 | 0.07"     |

### Placidus ハウス・カスプ（swetest と比較）

| チャート | drift ASC | drift MC | 最大カスプドリフト |
|---------|-----------|----------|-------------------|
| Monroe | 0.000" | 0.000" | 0.000" |
| Diana  | 0.000" | 0.000" | 0.000" |

### 日食（NASA 5-Millennium Catalog と比較）

| イベント | NASA 最大値 | 当社最大値 | ドリフト |
|---------|------------|-----------|---------|
| 2025-03-14 皆既月食  | 06:58 UT | 06:58 UT | 0.8 分 |
| 2025-03-29 部分日食 | 10:47 UT | 10:47 UT | 0.5 分 |
| 2025-09-07 皆既月食  | 18:11 UT | 18:11 UT | 0.8 分 |
| 2025-09-21 部分日食 | 19:41 UT | 19:42 UT | 1.0 分 |

### アストロカルトログラフィー（swetest の RA 式と比較）

全ての MC/IC/ASC/DSC ラインは正しい式 `longitude = RA − GMST`（Kenneth Bowser 標準）を使用しています。基準とのドリフト: **赤道上で全惑星に対し < 1.5 km**。

### 日の出/日の入り（timeanddate.com と比較）

| 場所 | 日付 | パラメータ | ドリフト |
|------|------|-----------|---------|
| London | 2026-04-15 | Sunrise | 0.6 秒 |
| London | 2026-04-15 | Sunset  | 9 秒   |

**極地**（|緯度| > 66.5°）では自動的に `polarState` と、通常の planetary hours が定義されていないという警告を返します。

### アスペクト・オービス

AstroWay は **可変オービス**（各惑星ごと、2 惑星の MIN ルール）を使用しています。ZET9 や astro.com と同様です。デフォルトのオービス（natal チャート用）：

| アスペクト | Sun | Moon | Inner | Jupiter | Outer |
|-----------|-----|------|-------|---------|-------|
| 合 | 12°  | 10° | 5° | 8° | 5° |
| 六合 | 6.5° | 6°  | 5° | 5° | 5° |
| 四角 | 10°  | 8°  | 5° | 7° | 5° |
| 三合 | 12°  | 8°  | 5° | 5° | 5° |
| 衝 | 12°  | 10° | 5° | 8° | 5° |

マイナーアスペクト（36°、40°、45°、72°、108°、135°、144°）は **デフォルトで無効** です。`ALL_ASPECTS` で明示的に有効化します。

## 極地緯度

|緯度| > 66.5° の場合、Placidus / Koch / Regiomontanus は数学的に定義されません。この場合、Swiss Ephemeris は自動的に Porphyry を返し、当社 API は警告を追加します。

```json
{
  "system": "P",
  "warning": "緯度=68.96° (> 66.5°) のため Placidus システムは定義されません。Swiss Ephemeris は Porphyry を代用しました..."
}
```

## 継続的検証

Regression は **全ての PR に対し CI で検証** されます：

- `api-calc/tests/endpoints/` — {siteMeta.snapshotCount} 個の snapshot（Monroe / Diana / Einstein + synastry / composite / davison）
- `.github/workflows/api-accuracy.yml` — PR 時に自動実行
- swetest CGI + Kerykeion との triangulation — 毎週実行
- Dependabot による upstream Swiss Ephemeris のモニタリング

## 既知の制限

- **日付範囲外**（1800 年以前・2399 年以降）：Moshier analytical を使用。精度は DE431 ファイルを使用した SWIEPH（< 0.01"）と比較して ~0.1"。
- **True Lilith (id=13) vs Mean Lilith (id=12)**：最大 12° の差。デフォルトでは Mean Lilith（安定した動作）を使用。True Lilith は `planetIds: [13]` で取得可能。
- **地上座標 vs 地心座標**：デフォルトは地心座標。

## 参考リンク

- Swiss Ephemeris: https://www.astro.com/swisseph/
- swetest CGI: https://www.astro.com/swisseph/swetest.htm
- NASA Eclipse Catalog: https://eclipse.gsfc.nasa.gov/
- Kerykeion: https://github.com/g-battaglia/kerykeion
- Astrodienst: https://www.astro.com/

## お問い合わせ

精度に関する質問は、チャートデータと期待される基準（astro.com またはその他の権威あるソース）を添えて **support@astroway.info** までご連絡ください。
