# 逆ライフゲーム (Inverse Game of Life)

この例は、微分可能プログラミングを使用して、コンウェイのライフゲームの「逆問題」を解く方法を示しています。目標となる最終状態が与えられたとき、それに進化する初期状態を見つけます。

## 概念

- **順問題**: 初期状態 $S_0$ が与えられたとき、ライフゲームのルールで $T$ ステップ後の状態 $S_T$ を計算します。
- **逆問題**: 目標状態 $S_T$ が与えられたとき、$\text{Forward}(S_0, T) \approx S_T$ となる初期状態 $S_0$ を見つけます。

## 実装の詳細

- **グリッド**: `[1, 1, N, N]` テンソル (conv2d用のNCHWフォーマット)。
- **隣接セルのカウント**: 3x3の全1カーネル (中心セルを除く) を使った `conv2d` を使用。
- **微分可能な更新ルール**:
    - 標準GoL: 隣接セルが3つで誕生、2つまたは3つで生存。
    - 近似: "誕生"に $\exp(-(N - 3)^2)$、"生存"に $\exp(-(N - 2)^2)$ を使用。
- **最適化**: 初期状態のロジットに対する勾配降下法で、進化後の状態と目標とのMSEを最小化。

## 使用方法

```bash
tl run examples/tasks/tensor_logic/inverse_life/inverse_life.tl
```

## 注意事項

- このソルバーはGoLルールのソフト近似を使用しており、勾配の伝播を可能にしますが、離散的なダイナミクスとは完全に一致しない場合があります。
- ランタイムにMetal互換のカスタム `sigmoid` 実装 (`1 / (1 + exp(-x))`) を追加しました。
