{ "cells": [ { "cell_type": "markdown", "id": "f8aa68cc", "metadata": {}, "source": [ "# **Physics Generator - Design Philosophy**\n", "\n", "The physics generator creates synthetic missile engagement scenarios for ATAS.\n", "\n", "Real engagement data is difficult and unrealistic to obtain at scale, so synthetic data is used to generate controlled training scenarios with known ground-truth labels.\n", "\n", "The generator uses metadata-derived aircraft capability ranges from `aircraft_metadata.csv` instead of fully hardcoded values.\n" ] }, { "cell_type": "markdown", "id": "57887b61", "metadata": {}, "source": [ "### **aircraft_metadata.csv**\n", "\n", "This CSV is the threat database for ATAS.\n", "\n", "The classifier only predicts:\n", "```python\n", "\"F22\"\n", "````\n", "\n", "The metadata adds tactical information:\n", "\n", "* missile speed\n", "* missile range\n", "* aircraft generation\n", "* maneuverability\n", "* combat capability\n", "\n", "This allows the system to simulate engagement scenarios.\n", "\n", "---\n", "\n", "### Columns\n", "\n", "#### `aircraft`\n", "\n", "Aircraft class name.\n", "\n", "Used to match classifier output with metadata.\n", "\n", "---\n", "\n", "#### `missile_speed`\n", "\n", "Approx missile speed (m/s).\n", "\n", "Used for:\n", "\n", "* closure rate\n", "* evasion time\n", "* threat level\n", "\n", "Higher speed = less reaction time.\n", "\n", "---\n", "\n", "#### `missile_range`\n", "\n", "Approx max missile range (m).\n", "\n", "Used for:\n", "\n", "* launch distance generation\n", "* engagement realism\n", "\n", "Higher range = longer reach.\n", "\n", "---\n", "\n", "#### `enemy_generation`\n", "\n", "Aircraft technology level.\n", "\n", "Values:\n", "\n", "* 3.5\n", "* 4\n", "* 4.5\n", "* 5\n", "\n", "Used for:\n", "\n", "* threat weighting\n", "* hit probability modifiers\n", "\n", "Higher generation = more dangerous.\n", "\n", "---\n", "\n", "#### `maneuverability`\n", "\n", "Aircraft agility.\n", "\n", "Values:\n", "\n", "* 0 = low\n", "* 1 = medium\n", "* 2 = high\n", "\n", "Used for:\n", "\n", "* evasion logic\n", "* survival probability\n", "\n", "Higher maneuverability = harder to hit.\n", "\n", "---\n", "\n", "#### `no_aa_capability`\n", "\n", "Whether aircraft lacks air-to-air combat capability.\n", "\n", "Values:\n", "\n", "* 0 = combat capable\n", "* 1 = not combat capable\n", "\n", "Used to:\n", "\n", "* lower threat score\n", "* skip missile logic for support aircraft\n", "\n", "---\n", "\n", "## Why This Exists\n", "\n", "The metadata converts:\n", "\n", "```python\n", "\"What aircraft is this?\"\n", "```\n", "\n", "into:\n", "\n", "```python\n", "\"How dangerous is this aircraft?\"\n", "```" ] }, { "cell_type": "code", "execution_count": 2, "id": "ce0f85d7", "metadata": {}, "outputs": [], "source": [ "# Importing the libraries\n", "\n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "id": "6831bd71", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
0A10222857350004.010
1A400M255-1-14.001
2AG600155-1-14.001
3AH6410175080004.010
4AKINCI1001372650004.010
........................
97Y20255-1-14.001
98YF2364813721600005.020
99Z108368680004.010
100Z197868680004.010
101Z218368680004.010
\n", "

102 rows × 7 columns

\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "0 A10 222 857 35000 \n", "1 A400M 255 -1 -1 \n", "2 AG600 155 -1 -1 \n", "3 AH64 101 750 8000 \n", "4 AKINCI 100 1372 65000 \n", ".. ... ... ... ... \n", "97 Y20 255 -1 -1 \n", "98 YF23 648 1372 160000 \n", "99 Z10 83 686 8000 \n", "100 Z19 78 686 8000 \n", "101 Z21 83 686 8000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "0 4.0 1 0 \n", "1 4.0 0 1 \n", "2 4.0 0 1 \n", "3 4.0 1 0 \n", "4 4.0 1 0 \n", ".. ... ... ... \n", "97 4.0 0 1 \n", "98 5.0 2 0 \n", "99 4.0 1 0 \n", "100 4.0 1 0 \n", "101 4.0 1 0 \n", "\n", "[102 rows x 7 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Importing the CSV to work with\n", "\n", "df = pd.read_csv(\"../data/aircraft_metadata.csv\")\n", "df" ] }, { "cell_type": "code", "execution_count": 4, "id": "3ac9444c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 102 entries, 0 to 101\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 aircraft 102 non-null str \n", " 1 aircraft_max_speed 102 non-null int64 \n", " 2 missile_speed 102 non-null int64 \n", " 3 missile_range 102 non-null int64 \n", " 4 enemy_generation 102 non-null float64\n", " 5 maneuverability 102 non-null int64 \n", " 6 no_aa_capability 102 non-null int64 \n", "dtypes: float64(1), int64(5), str(1)\n", "memory usage: 5.7 KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 5, "id": "c29a7656", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
count102102.000000102.000000102.000000102.000000102.000000102.000000
unique102NaNNaNNaNNaNNaNNaN
topA10NaNNaNNaNNaNNaNNaN
freq1NaNNaNNaNNaNNaNNaN
meanNaN345.764706636.46078464724.9901964.1176470.8529410.500000
stdNaN226.619242692.537831102267.6025540.4781180.8253060.502469
minNaN61.000000-1.000000-1.0000003.5000000.0000000.000000
25%NaN164.500000-1.000000-1.0000004.0000000.0000000.000000
50%NaN268.000000342.5000003999.5000004.0000001.0000000.500000
75%NaN544.0000001372.000000108750.0000004.5000002.0000001.000000
maxNaN983.0000002058.000000400000.0000005.0000002.0000001.000000
\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "count 102 102.000000 102.000000 102.000000 \n", "unique 102 NaN NaN NaN \n", "top A10 NaN NaN NaN \n", "freq 1 NaN NaN NaN \n", "mean NaN 345.764706 636.460784 64724.990196 \n", "std NaN 226.619242 692.537831 102267.602554 \n", "min NaN 61.000000 -1.000000 -1.000000 \n", "25% NaN 164.500000 -1.000000 -1.000000 \n", "50% NaN 268.000000 342.500000 3999.500000 \n", "75% NaN 544.000000 1372.000000 108750.000000 \n", "max NaN 983.000000 2058.000000 400000.000000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "count 102.000000 102.000000 102.000000 \n", "unique NaN NaN NaN \n", "top NaN NaN NaN \n", "freq NaN NaN NaN \n", "mean 4.117647 0.852941 0.500000 \n", "std 0.478118 0.825306 0.502469 \n", "min 3.500000 0.000000 0.000000 \n", "25% 4.000000 0.000000 0.000000 \n", "50% 4.000000 1.000000 0.500000 \n", "75% 4.500000 2.000000 1.000000 \n", "max 5.000000 2.000000 1.000000 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe(include=\"all\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "ce49133d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4. 3.5 4.5 5. ]\n", "[1 0 2]\n", "[0 1]\n" ] } ], "source": [ "print(df[\"enemy_generation\"].unique())\n", "print(df[\"maneuverability\"].unique())\n", "print(df[\"no_aa_capability\"].unique())" ] }, { "cell_type": "code", "execution_count": 7, "id": "0297a837", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
0A10222857350004.010
1AH6410175080004.010
2AKINCI1001372650004.010
3AV8B30013721600004.010
4EF200059013722000004.520
\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "0 A10 222 857 35000 \n", "1 AH64 101 750 8000 \n", "2 AKINCI 100 1372 65000 \n", "3 AV8B 300 1372 160000 \n", "4 EF2000 590 1372 200000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "0 4.0 1 0 \n", "1 4.0 1 0 \n", "2 4.0 1 0 \n", "3 4.0 1 0 \n", "4 4.5 2 0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Getting data of aircarfts that has air-to-air combact ability\n", "combat_df = df[df[\"no_aa_capability\"]==0].reset_index(drop=True)\n", "combat_df.head()" ] }, { "cell_type": "code", "execution_count": 8, "id": "c578c9c1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 51 entries, 0 to 50\n", "Data columns (total 7 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 aircraft 51 non-null str \n", " 1 aircraft_max_speed 51 non-null int64 \n", " 2 missile_speed 51 non-null int64 \n", " 3 missile_range 51 non-null int64 \n", " 4 enemy_generation 51 non-null float64\n", " 5 maneuverability 51 non-null int64 \n", " 6 no_aa_capability 51 non-null int64 \n", "dtypes: float64(1), int64(5), str(1)\n", "memory usage: 2.9 KB\n" ] } ], "source": [ "combat_df.info()" ] }, { "cell_type": "code", "execution_count": 9, "id": "2dc32a13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
count5151.00000051.00000051.00000051.00000051.00000051.0
unique51NaNNaNNaNNaNNaNNaN
topA10NaNNaNNaNNaNNaNNaN
freq1NaNNaNNaNNaNNaNNaN
meanNaN440.2352941273.921569129450.9803924.2843141.5294120.0
stdNaN225.509609373.955497112160.6550850.4610300.5041010.0
minNaN78.000000686.0000008000.0000003.5000001.0000000.0
25%NaN246.500000857.00000037500.0000004.0000001.0000000.0
50%NaN532.0000001372.000000110000.0000004.0000002.0000000.0
75%NaN590.0000001372.000000160000.0000004.5000002.0000000.0
maxNaN833.0000002058.000000400000.0000005.0000002.0000000.0
\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "count 51 51.000000 51.000000 51.000000 \n", "unique 51 NaN NaN NaN \n", "top A10 NaN NaN NaN \n", "freq 1 NaN NaN NaN \n", "mean NaN 440.235294 1273.921569 129450.980392 \n", "std NaN 225.509609 373.955497 112160.655085 \n", "min NaN 78.000000 686.000000 8000.000000 \n", "25% NaN 246.500000 857.000000 37500.000000 \n", "50% NaN 532.000000 1372.000000 110000.000000 \n", "75% NaN 590.000000 1372.000000 160000.000000 \n", "max NaN 833.000000 2058.000000 400000.000000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "count 51.000000 51.000000 51.0 \n", "unique NaN NaN NaN \n", "top NaN NaN NaN \n", "freq NaN NaN NaN \n", "mean 4.284314 1.529412 0.0 \n", "std 0.461030 0.504101 0.0 \n", "min 3.500000 1.000000 0.0 \n", "25% 4.000000 1.000000 0.0 \n", "50% 4.000000 2.000000 0.0 \n", "75% 4.500000 2.000000 0.0 \n", "max 5.000000 2.000000 0.0 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combat_df.describe(include=\"all\")" ] }, { "cell_type": "code", "execution_count": 10, "id": "b51a060f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Missile Speed ranges: \n", "\n", "Max → 2058 \n", "Min → 686\n" ] } ], "source": [ "# Getting missile speed ranges\n", "print(\"Missile Speed ranges: \\n\")\n", "print(f\"Max → {combat_df['missile_speed'].max()} \\nMin → {combat_df['missile_speed'].min()}\")" ] }, { "cell_type": "code", "execution_count": 11, "id": "d76aabf2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Missile range: \n", "\n", "Max → 400000 \n", "Min → 8000\n" ] } ], "source": [ "# Getting missile speed ranges\n", "print(\"Missile range: \\n\")\n", "print(f\"Max → {combat_df['missile_range'].max()} \\nMin → {combat_df['missile_range'].min()}\")" ] }, { "cell_type": "code", "execution_count": 12, "id": "1e7207e0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Aircraft speed range: \n", "\n", "Max → 983 \n", "Min → 61\n" ] } ], "source": [ "# Getting aircraft speed ranges\n", "print(\"Aircraft speed range: \\n\")\n", "print(f\"Max → {df['aircraft_max_speed'].max()} \\nMin → {df['aircraft_max_speed'].min()}\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "21a1d9d3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "enemy_generation\n", "4.0 25\n", "4.5 11\n", "5.0 11\n", "3.5 4\n", "Name: count, dtype: int64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Getting the number of unique generation\n", "combat_df[\"enemy_generation\"].value_counts()" ] }, { "cell_type": "code", "execution_count": 14, "id": "d47323a4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "maneuverability\n", "2 27\n", "1 24\n", "Name: count, dtype: int64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Getting the maneverability level\n", "combat_df[\"maneuverability\"].value_counts()" ] }, { "cell_type": "code", "execution_count": 15, "id": "7471829e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
14FCK153220581000004.020
39Su5759020584000005.020
32Mig3183320584000004.010
18J3659017154000005.020
19J5059017154000005.020
17J3559017153000005.020
16J2059017153000005.020
15J1065017153000004.520
10F259015441050004.520
41Tejas55015441100004.520
\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "14 FCK1 532 2058 100000 \n", "39 Su57 590 2058 400000 \n", "32 Mig31 833 2058 400000 \n", "18 J36 590 1715 400000 \n", "19 J50 590 1715 400000 \n", "17 J35 590 1715 300000 \n", "16 J20 590 1715 300000 \n", "15 J10 650 1715 300000 \n", "10 F2 590 1544 105000 \n", "41 Tejas 550 1544 110000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "14 4.0 2 0 \n", "39 5.0 2 0 \n", "32 4.0 1 0 \n", "18 5.0 2 0 \n", "19 5.0 2 0 \n", "17 5.0 2 0 \n", "16 5.0 2 0 \n", "15 4.5 2 0 \n", "10 4.5 2 0 \n", "41 4.5 2 0 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get values of ranges of missile speed\n", "combat_df.sort_values(\"missile_speed\", ascending=False).head(10)" ] }, { "cell_type": "code", "execution_count": 16, "id": "f14cb2cf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
19J5059017154000005.020
39Su5759020584000005.020
18J3659017154000005.020
32Mig3183320584000004.010
17J3559017153000005.020
16J2059017153000005.020
15J1065017153000004.520
34Rafale53113722000004.520
20JAS3959013722000004.520
24KF2153213722000004.520
\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "19 J50 590 1715 400000 \n", "39 Su57 590 2058 400000 \n", "18 J36 590 1715 400000 \n", "32 Mig31 833 2058 400000 \n", "17 J35 590 1715 300000 \n", "16 J20 590 1715 300000 \n", "15 J10 650 1715 300000 \n", "34 Rafale 531 1372 200000 \n", "20 JAS39 590 1372 200000 \n", "24 KF21 532 1372 200000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "19 5.0 2 0 \n", "39 5.0 2 0 \n", "18 5.0 2 0 \n", "32 4.0 1 0 \n", "17 5.0 2 0 \n", "16 5.0 2 0 \n", "15 4.5 2 0 \n", "34 4.5 2 0 \n", "20 4.5 2 0 \n", "24 4.5 2 0 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get sorted decending missile ranges\n", "combat_df.sort_values(\"missile_range\", ascending=False)[:10]" ] }, { "cell_type": "code", "execution_count": 17, "id": "5e723e87", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraftaircraft_max_speedmissile_speedmissile_rangeenemy_generationmaneuverabilityno_aa_capability
11F2266913721600005.020
\n", "
" ], "text/plain": [ " aircraft aircraft_max_speed missile_speed missile_range \\\n", "11 F22 669 1372 160000 \n", "\n", " enemy_generation maneuverability no_aa_capability \n", "11 5.0 2 0 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combat_df[combat_df[\"aircraft\"]==\"F22\"]" ] }, { "cell_type": "code", "execution_count": 18, "id": "41f0712c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aircraft_max_speedmissile_speedmissile_range
aircraft_max_speed1.0000000.7538650.633663
missile_speed0.7538651.0000000.820434
missile_range0.6336630.8204341.000000
\n", "
" ], "text/plain": [ " aircraft_max_speed missile_speed missile_range\n", "aircraft_max_speed 1.000000 0.753865 0.633663\n", "missile_speed 0.753865 1.000000 0.820434\n", "missile_range 0.633663 0.820434 1.000000" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# correlation between aircraft speed and missile \n", "combat_df[[\"aircraft_max_speed\", \"missile_speed\", \"missile_range\"]].corr()" ] }, { "cell_type": "code", "execution_count": 19, "id": "468e508e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "enemy_generation\n", "3.5 26500.000000\n", "4.0 83240.000000\n", "4.5 159090.909091\n", "5.0 242272.727273\n", "Name: missile_range, dtype: float64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combat_df.groupby(\"enemy_generation\")[\"missile_range\"].mean()" ] }, { "cell_type": "markdown", "id": "f7850284", "metadata": {}, "source": [ "## **Extracted Metadata Insights**\n", "\n", "### **Combat-Capable Aircraft**\n", "- Total aircraft: 102\n", "- Combat-capable aircraft: 56\n", "- Non combat-capable aircraft: 46\n", "\n", "---\n", "\n", "### Aircraft Speed Range\n", "\n", "```python\n", "61 m/s → 983 m/s\n", "```\n", "\n", "---\n", "\n", "### Missile Speed Range\n", "\n", "```python \n", "686 m/s → 2058 m/s\n", "````\n", "\n", "---\n", "\n", "### Missile Range\n", "\n", "```python id=\"e2h15d\"\n", "8,000 m → 400,000 m\n", "```\n", "\n", "---\n", "\n", "### Enemy Generation Distribution\n", "\n", "```python id=\"txut2q\"\n", "4.0 → 23 aircraft\n", "5.0 → 13 aircraft\n", "4.5 → 10 aircraft\n", "3.5 → 5 aircraft\n", "```\n", "\n", "---\n", "\n", "### Maneuverability Distribution\n", "\n", "```python id=\"nt11ao\"\n", "2 (high) → 27 aircraft\n", "1 (medium) → 24 aircraft\n", "```\n", "\n", "---\n", "\n", "### Key Observations\n", "\n", "* Most combat aircraft belong to Gen 4 and Gen 5.\n", "* Most combat aircraft have medium or high maneuverability.\n", "* Advanced aircraft generally have longer missile ranges.\n", "* High-end aircraft like Su57, Mig31, J35, J36, and J50 dominate the upper missile range limits.\n", "\n", "The goal of the generator is not perfect aerospace simulation, but generation of believable and internally consistent combat scenarios that allow ML models to learn meaningful relationships.\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "8832d356", "metadata": {}, "source": [ "## **Plan to build physics generator**\n", "\n", "### **How it should be called**\n", "\n", "```python\n", "from src.physics_generator import generate_dataset\n", "generate_dataset()\n", "```\n", "\n", "### **How it will be build**\n", "\n", "```markdown\n", "generate_dataset() ← the one function the notebook calls\n", " └── load_metadata() ← reads aircraft_metadata.csv\n", " └── generate_row() ← builds one scenario\n", " └── derive_missile_phase()\n", " └── derive_closure_rate()\n", " └── derive_evasion_time()\n", " └── derive_hit_label()\n", " └── save_dataset() ← saves to CSV\n", "```\n", "---\n", "\n", "### **The sequence of `physics_generator.py` script**\n", "\n", "```python\n", "_generate_row()\n", "│\n", "├── 1. Pick a random enemy aircraft from metadata\n", "│ (combat-capable only — no_aa_capability = 0)\n", "│\n", "├── 2. Sample raw feature values\n", "│ your_speed, your_altitude, azimuth, elevation,\n", "│ maneuverability, countermeasure_deployed\n", "│ launch_distance (within that aircraft's missile_range)\n", "│ remaining_distance (between 0 and launch_distance)\n", "│\n", "├── 3. _derive_missile_phase()\n", "│ \"How far has the missile already traveled?\"\n", "│ → returns 0, 1, or 2\n", "│\n", "├── 4. _derive_closure_rate()\n", "│ \"How fast is the gap closing in 3D space?\"\n", "│ → returns a speed in m/s\n", "│\n", "├── 5. _derive_evasion_time()\n", "│ \"How many seconds before it reaches you?\"\n", "│ → returns a float in seconds\n", "│\n", "├── 6. _derive_hit_label()\n", "│ \"After your evasion attempt, does it hit?\"\n", "│ → returns 0 or 1\n", "│\n", "└── 7. Package everything into a dict → one row\n", "```\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "c3d32245", "metadata": {}, "source": [ "## **Sanity Check - Physics Generator**\n", "\n", "Quick validation that `generate_dataset()` produces clean, physically sensible output.\n", "Run with `N_ROWS = 1_000` before the full 1M generation." ] }, { "cell_type": "code", "execution_count": 26, "id": "37b78e79", "metadata": {}, "outputs": [], "source": [ "import sys\n", "from pathlib import Path\n", "\n", "# Add src/ to path so we can import physics_generator\n", "sys.path.append(str(Path.cwd().resolve().parent.parent / \"src\"))\n", "\n", "from physics_generator import generate_dataset" ] }, { "cell_type": "code", "execution_count": null, "id": "4181ca14", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Done. 1,000 rows saved to /mnt/d/Eakem/Learning ML and DS/Project_ATAS/ATAS_Project/data/synthetic_engagements.csv\n" ] } ], "source": [ "# # Running the generator for N_ROWS = 1_000\n", "# df = generate_dataset()" ] }, { "cell_type": "code", "execution_count": null, "id": "54d3fc2c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 1000\n", "Columns: 16\n", "Shape: (1000, 16)\n" ] } ], "source": [ "# import pandas as pd\n", "# df = pd.read_csv(\"../data/synthetic_engagements_1000.csv\")\n", "# print(f\"Rows: {len(df)}\")\n", "# print(f\"Columns: {len(df.columns)}\")\n", "# print(f\"Shape: {df.shape}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "14d1f643", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
launch_distanceremaining_distanceclosure_rateazimuthelevationmissile_phaseyour_speedyour_altitudeyour_maneuverabilityenemy_altitudemissile_speedmissile_rangeenemy_generationcountermeasure_deployedevasion_timehit
022570.8933672961.9800671185.76399261.005549-34.7075632825.0508186512.66197213655.798699857350004.012.2294210
12367.0071961652.662358625.878279212.46638268.6302750751.77714418782.156933119508.648175857350004.002.7725771
26602.3464752558.752556871.179381281.11264045.2660551104.5273573625.183143229894.396018857350004.003.2308250
318281.79240518049.709650648.636953115.135435-37.3728870617.2675145759.552561115002.849014857350004.0132.1403440
49834.3796651522.9834601088.038782316.104680-45.8056282459.93259728821.64015224643.721244857350004.011.3087670
\n", "
" ], "text/plain": [ " launch_distance remaining_distance closure_rate azimuth elevation \\\n", "0 22570.893367 2961.980067 1185.763992 61.005549 -34.707563 \n", "1 2367.007196 1652.662358 625.878279 212.466382 68.630275 \n", "2 6602.346475 2558.752556 871.179381 281.112640 45.266055 \n", "3 18281.792405 18049.709650 648.636953 115.135435 -37.372887 \n", "4 9834.379665 1522.983460 1088.038782 316.104680 -45.805628 \n", "\n", " missile_phase your_speed your_altitude your_maneuverability \\\n", "0 2 825.050818 6512.661972 1 \n", "1 0 751.777144 18782.156933 1 \n", "2 1 104.527357 3625.183143 2 \n", "3 0 617.267514 5759.552561 1 \n", "4 2 459.932597 28821.640152 2 \n", "\n", " enemy_altitude missile_speed missile_range enemy_generation \\\n", "0 3655.798699 857 35000 4.0 \n", "1 19508.648175 857 35000 4.0 \n", "2 29894.396018 857 35000 4.0 \n", "3 15002.849014 857 35000 4.0 \n", "4 4643.721244 857 35000 4.0 \n", "\n", " countermeasure_deployed evasion_time hit \n", "0 1 2.229421 0 \n", "1 0 2.772577 1 \n", "2 0 3.230825 0 \n", "3 1 32.140344 0 \n", "4 1 1.308767 0 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# df.head()" ] }, { "cell_type": "code", "execution_count": null, "id": "19f98851", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Negative closure_rate: 0\n", "Negative evasion_rate: 0\n" ] } ], "source": [ "# # CHecking for negatives values\n", "# print(f\"Negative closure_rate: {(df['closure_rate'] < 0).sum()}\")\n", "# print(f\"Negative evasion_rate: {(df['evasion_time'] < 0).sum()}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "3b3d531f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "missile_speed\n", "1372 473\n", "857 154\n", "686 100\n", "1715 97\n", "2058 58\n", "847 40\n", "1544 39\n", "750 20\n", "1475 19\n", "Name: count, dtype: int64" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# df.missile_speed.value_counts() # From metadata csv" ] }, { "cell_type": "code", "execution_count": null, "id": "e7bd832a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456789...990991992993994995996997998999
launch_distance22570.8933672367.0071966602.34647518281.7924059834.37966512661.48803325901.7247248890.584630983.73439613859.562006...4981.47880132056.69536053419.68904019021.028127128594.27724364845.03351483532.658041146555.41180577971.6571182253.861997
remaining_distance2961.9800671652.6623582558.75255618049.7096501522.9834603400.93883217955.4943647886.781225483.79386013391.098584...1605.0880874117.67433426058.4527543767.54106040310.30140360646.53754013843.58694094701.45086317925.4452771103.757518
closure_rate1185.763992625.878279871.179381648.6369531088.038782725.990269844.9601851020.8751191066.347972386.272373...590.8265981312.7737781663.712597438.7581291394.5910331186.8469631211.4454631803.7079561636.533985405.627102
azimuth61.005549212.466382281.112640115.135435316.104680259.107852211.731931283.740414349.132944176.945221...240.738983191.34522572.020487206.76505569.911001251.992973243.51009441.013277305.568549117.061738
elevation-34.70756368.63027545.266055-37.372887-45.805628-2.007360-83.509892-13.091010-43.024865-55.574971...73.492841-85.265763-30.73132827.430184-76.994103-14.818047-43.173902-54.366817-32.225887-20.136454
missile_phase2.0000000.0000001.0000000.0000002.0000002.0000000.0000000.0000001.0000000.000000...2.0000002.0000001.0000002.0000002.0000000.0000002.0000001.0000002.0000001.000000
your_speed825.050818751.777144104.527357617.267514459.932597693.742453125.237980708.341294291.592189833.848608...685.281835731.899168451.183218527.764085292.249519619.546047493.576101982.046031537.593520656.393231
your_altitude6512.66197218782.1569333625.1831435759.55256128821.6401529790.6921121510.77908414553.5222844020.28819115714.406817...4796.9456314000.6909607211.0590322657.27304916145.50566923094.84189324159.52853726605.67688622146.3984791624.780195
your_maneuverability1.0000001.0000002.0000001.0000002.0000001.0000001.0000001.0000001.0000000.000000...0.0000002.0000001.0000000.0000000.0000001.0000002.0000001.0000001.0000000.000000
enemy_altitude3655.79869919508.64817529894.39601815002.8490144643.72124426557.88964111515.1403684119.5632782974.93609528617.057195...13657.74544024585.42110928243.55051716566.70022315476.26279526693.60007317534.9617287711.2964124263.97752317091.003655
missile_speed857.000000857.000000857.000000857.000000857.000000857.000000857.000000857.000000857.000000857.000000...686.0000001372.0000001544.000000857.0000001372.0000001372.0000001372.0000001372.0000001372.000000686.000000
missile_range35000.00000035000.00000035000.00000035000.00000035000.00000035000.00000035000.00000035000.00000035000.00000035000.000000...8000.000000160000.000000105000.00000040000.000000160000.00000065000.000000160000.000000200000.000000110000.0000008000.000000
enemy_generation4.0000004.0000004.0000004.0000004.0000004.0000004.0000004.0000004.0000004.000000...4.0000005.0000004.5000004.0000004.0000004.5000004.5000004.5000004.0000004.000000
countermeasure_deployed1.0000000.0000000.0000001.0000001.0000000.0000000.0000001.0000000.0000001.000000...1.0000000.0000000.0000001.0000000.0000001.0000000.0000000.0000000.0000001.000000
evasion_time2.2294212.7725773.23082532.1403441.3087674.59905823.3751188.9229640.45369240.040966...2.6671032.77144017.2291168.43011924.56903553.65381310.68455360.64184410.7534013.142886
hit0.0000001.0000000.0000000.0000000.0000001.0000001.0000000.0000001.0000000.000000...0.0000001.0000000.0000000.0000001.0000000.0000000.0000001.0000001.0000000.000000
\n", "

16 rows × 1000 columns

\n", "
" ], "text/plain": [ " 0 1 2 \\\n", "launch_distance 22570.893367 2367.007196 6602.346475 \n", "remaining_distance 2961.980067 1652.662358 2558.752556 \n", "closure_rate 1185.763992 625.878279 871.179381 \n", "azimuth 61.005549 212.466382 281.112640 \n", "elevation -34.707563 68.630275 45.266055 \n", "missile_phase 2.000000 0.000000 1.000000 \n", "your_speed 825.050818 751.777144 104.527357 \n", "your_altitude 6512.661972 18782.156933 3625.183143 \n", "your_maneuverability 1.000000 1.000000 2.000000 \n", "enemy_altitude 3655.798699 19508.648175 29894.396018 \n", "missile_speed 857.000000 857.000000 857.000000 \n", "missile_range 35000.000000 35000.000000 35000.000000 \n", "enemy_generation 4.000000 4.000000 4.000000 \n", "countermeasure_deployed 1.000000 0.000000 0.000000 \n", "evasion_time 2.229421 2.772577 3.230825 \n", "hit 0.000000 1.000000 0.000000 \n", "\n", " 3 4 5 \\\n", "launch_distance 18281.792405 9834.379665 12661.488033 \n", "remaining_distance 18049.709650 1522.983460 3400.938832 \n", "closure_rate 648.636953 1088.038782 725.990269 \n", "azimuth 115.135435 316.104680 259.107852 \n", "elevation -37.372887 -45.805628 -2.007360 \n", "missile_phase 0.000000 2.000000 2.000000 \n", "your_speed 617.267514 459.932597 693.742453 \n", "your_altitude 5759.552561 28821.640152 9790.692112 \n", "your_maneuverability 1.000000 2.000000 1.000000 \n", "enemy_altitude 15002.849014 4643.721244 26557.889641 \n", "missile_speed 857.000000 857.000000 857.000000 \n", "missile_range 35000.000000 35000.000000 35000.000000 \n", "enemy_generation 4.000000 4.000000 4.000000 \n", "countermeasure_deployed 1.000000 1.000000 0.000000 \n", "evasion_time 32.140344 1.308767 4.599058 \n", "hit 0.000000 0.000000 1.000000 \n", "\n", " 6 7 8 \\\n", "launch_distance 25901.724724 8890.584630 983.734396 \n", "remaining_distance 17955.494364 7886.781225 483.793860 \n", "closure_rate 844.960185 1020.875119 1066.347972 \n", "azimuth 211.731931 283.740414 349.132944 \n", "elevation -83.509892 -13.091010 -43.024865 \n", "missile_phase 0.000000 0.000000 1.000000 \n", "your_speed 125.237980 708.341294 291.592189 \n", "your_altitude 1510.779084 14553.522284 4020.288191 \n", "your_maneuverability 1.000000 1.000000 1.000000 \n", "enemy_altitude 11515.140368 4119.563278 2974.936095 \n", "missile_speed 857.000000 857.000000 857.000000 \n", "missile_range 35000.000000 35000.000000 35000.000000 \n", "enemy_generation 4.000000 4.000000 4.000000 \n", "countermeasure_deployed 0.000000 1.000000 0.000000 \n", "evasion_time 23.375118 8.922964 0.453692 \n", "hit 1.000000 0.000000 1.000000 \n", "\n", " 9 ... 990 991 \\\n", "launch_distance 13859.562006 ... 4981.478801 32056.695360 \n", "remaining_distance 13391.098584 ... 1605.088087 4117.674334 \n", "closure_rate 386.272373 ... 590.826598 1312.773778 \n", "azimuth 176.945221 ... 240.738983 191.345225 \n", "elevation -55.574971 ... 73.492841 -85.265763 \n", "missile_phase 0.000000 ... 2.000000 2.000000 \n", "your_speed 833.848608 ... 685.281835 731.899168 \n", "your_altitude 15714.406817 ... 4796.945631 4000.690960 \n", "your_maneuverability 0.000000 ... 0.000000 2.000000 \n", "enemy_altitude 28617.057195 ... 13657.745440 24585.421109 \n", "missile_speed 857.000000 ... 686.000000 1372.000000 \n", "missile_range 35000.000000 ... 8000.000000 160000.000000 \n", "enemy_generation 4.000000 ... 4.000000 5.000000 \n", "countermeasure_deployed 1.000000 ... 1.000000 0.000000 \n", "evasion_time 40.040966 ... 2.667103 2.771440 \n", "hit 0.000000 ... 0.000000 1.000000 \n", "\n", " 992 993 994 \\\n", "launch_distance 53419.689040 19021.028127 128594.277243 \n", "remaining_distance 26058.452754 3767.541060 40310.301403 \n", "closure_rate 1663.712597 438.758129 1394.591033 \n", "azimuth 72.020487 206.765055 69.911001 \n", "elevation -30.731328 27.430184 -76.994103 \n", "missile_phase 1.000000 2.000000 2.000000 \n", "your_speed 451.183218 527.764085 292.249519 \n", "your_altitude 7211.059032 2657.273049 16145.505669 \n", "your_maneuverability 1.000000 0.000000 0.000000 \n", "enemy_altitude 28243.550517 16566.700223 15476.262795 \n", "missile_speed 1544.000000 857.000000 1372.000000 \n", "missile_range 105000.000000 40000.000000 160000.000000 \n", "enemy_generation 4.500000 4.000000 4.000000 \n", "countermeasure_deployed 0.000000 1.000000 0.000000 \n", "evasion_time 17.229116 8.430119 24.569035 \n", "hit 0.000000 0.000000 1.000000 \n", "\n", " 995 996 997 \\\n", "launch_distance 64845.033514 83532.658041 146555.411805 \n", "remaining_distance 60646.537540 13843.586940 94701.450863 \n", "closure_rate 1186.846963 1211.445463 1803.707956 \n", "azimuth 251.992973 243.510094 41.013277 \n", "elevation -14.818047 -43.173902 -54.366817 \n", "missile_phase 0.000000 2.000000 1.000000 \n", "your_speed 619.546047 493.576101 982.046031 \n", "your_altitude 23094.841893 24159.528537 26605.676886 \n", "your_maneuverability 1.000000 2.000000 1.000000 \n", "enemy_altitude 26693.600073 17534.961728 7711.296412 \n", "missile_speed 1372.000000 1372.000000 1372.000000 \n", "missile_range 65000.000000 160000.000000 200000.000000 \n", "enemy_generation 4.500000 4.500000 4.500000 \n", "countermeasure_deployed 1.000000 0.000000 0.000000 \n", "evasion_time 53.653813 10.684553 60.641844 \n", "hit 0.000000 0.000000 1.000000 \n", "\n", " 998 999 \n", "launch_distance 77971.657118 2253.861997 \n", "remaining_distance 17925.445277 1103.757518 \n", "closure_rate 1636.533985 405.627102 \n", "azimuth 305.568549 117.061738 \n", "elevation -32.225887 -20.136454 \n", "missile_phase 2.000000 1.000000 \n", "your_speed 537.593520 656.393231 \n", "your_altitude 22146.398479 1624.780195 \n", "your_maneuverability 1.000000 0.000000 \n", "enemy_altitude 4263.977523 17091.003655 \n", "missile_speed 1372.000000 686.000000 \n", "missile_range 110000.000000 8000.000000 \n", "enemy_generation 4.000000 4.000000 \n", "countermeasure_deployed 0.000000 1.000000 \n", "evasion_time 10.753401 3.142886 \n", "hit 1.000000 0.000000 \n", "\n", "[16 rows x 1000 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# df.T" ] }, { "cell_type": "code", "execution_count": null, "id": "afbdd5d1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " launch_distance remaining_distance closure_rate evasion_time \\\n", "count 1000.000000 1000.000000 1000.000000 1000.000000 \n", "mean 64915.002129 31821.659117 1266.905104 24.195931 \n", "std 74767.756596 45271.208405 482.164719 31.584890 \n", "min 669.396283 2.403273 4.027710 0.006151 \n", "25% 10515.861139 3803.500738 872.679155 4.102251 \n", "50% 39195.914463 14983.450620 1327.613182 11.872938 \n", "75% 93328.236924 40924.330595 1573.072050 31.334417 \n", "max 395478.660029 389130.451998 2858.542394 284.080232 \n", "\n", " your_speed your_altitude \n", "count 1000.000000 1000.000000 \n", "mean 521.111816 14957.021066 \n", "std 263.082784 8549.393126 \n", "min 62.358418 72.422424 \n", "25% 297.653412 7338.047586 \n", "50% 518.151709 15324.311391 \n", "75% 751.001456 22210.948597 \n", "max 982.046031 29963.768605 \n" ] } ], "source": [ "# # Check feature ranges are within expected bounds\n", "# print(df[['launch_distance', 'remaining_distance', 'closure_rate', \n", "# 'evasion_time', 'your_speed', 'your_altitude']].describe())" ] }, { "cell_type": "code", "execution_count": null, "id": "ea4cf1bf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "remaining > launch: 0\n" ] } ], "source": [ "# # Check remaining_distance never exceeds launch_distance\n", "# print(f\"remaining > launch: {(df['remaining_distance'] > df['launch_distance']).sum()}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "d16d1952", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hit\n", "0 602\n", "1 398\n", "Name: count, dtype: int64\n", "hit\n", "0 0.602\n", "1 0.398\n", "Name: proportion, dtype: float64\n" ] } ], "source": [ "# # Check hit label distribution\n", "# print(df['hit'].value_counts())\n", "# print(df['hit'].value_counts(normalize=True)) # It shows the distribution as percentages instead of counts." ] }, { "cell_type": "markdown", "id": "6955deb6", "metadata": {}, "source": [ "- `remaining > launch: 0` - physical constraint holds ✅\n", "- All ranges look sensible - speeds, altitudes, distances all within expected bounds ✅\n", "- evasion_time min is 0.006s (very close missile, terminal phase) - realistic ✅\n", "- **Hit distribution:** 60% miss, 40% hit - reasonable balance, not skewed ✅\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "a56f6f02", "metadata": {}, "source": [ "## **Full Dataset Generation**\n", "\n", "Sanity check passed on **1,000** rows, no negatives, no constraint violations.\n", "\n", "Changing `N_ROWS` to `1_000_000` and running full generation." ] }, { "cell_type": "code", "execution_count": 40, "id": "c8722b7c", "metadata": {}, "outputs": [], "source": [ "import importlib\n", "import physics_generator\n", "\n", "# Reload the module to pick up any changes made to the script\n", "importlib.reload(physics_generator)\n", "from physics_generator import generate_dataset" ] }, { "cell_type": "code", "execution_count": 41, "id": "0ef8538e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Done. 1,000,000 rows saved to /mnt/d/Eakem/Learning ML and DS/Project_ATAS/ATAS_Project/data/synthetic_engagements.csv\n" ] } ], "source": [ "# Generate the data with ~1M rows\n", "df_full = generate_dataset()" ] }, { "cell_type": "markdown", "id": "881b8593", "metadata": {}, "source": [ "**Now from here moving to Hit and ETA classifier notebooks**\n", "\n", "---" ] } ], "metadata": { "kernelspec": { "display_name": "env", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.15" } }, "nbformat": 4, "nbformat_minor": 5 }