space-ml-sim 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- space_ml_sim-0.3.0/.github/CODEOWNERS +18 -0
- space_ml_sim-0.3.0/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
- space_ml_sim-0.3.0/.github/ISSUE_TEMPLATE/commercial-license.yml +32 -0
- space_ml_sim-0.3.0/.github/ISSUE_TEMPLATE/feature_request.yml +35 -0
- space_ml_sim-0.3.0/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- space_ml_sim-0.3.0/.github/dependabot.yml +23 -0
- space_ml_sim-0.3.0/.github/workflows/ci.yml +208 -0
- space_ml_sim-0.3.0/.github/workflows/publish.yml +89 -0
- space_ml_sim-0.3.0/.gitignore +26 -0
- space_ml_sim-0.3.0/.pre-commit-config.yaml +39 -0
- space_ml_sim-0.3.0/.secrets.baseline +133 -0
- space_ml_sim-0.3.0/CITATION.cff +26 -0
- space_ml_sim-0.3.0/COMMERCIAL_LICENSE.md +74 -0
- space_ml_sim-0.3.0/CONTRIBUTING.md +61 -0
- space_ml_sim-0.3.0/LICENSE +661 -0
- space_ml_sim-0.3.0/PKG-INFO +242 -0
- space_ml_sim-0.3.0/README.md +211 -0
- space_ml_sim-0.3.0/SECURITY.md +54 -0
- space_ml_sim-0.3.0/benchmarks/resnet18_orbital.py +76 -0
- space_ml_sim-0.3.0/examples/01_basic_constellation.py +95 -0
- space_ml_sim-0.3.0/examples/02_radiation_fault_sweep.py +158 -0
- space_ml_sim-0.3.0/examples/03_tmr_comparison.py +144 -0
- space_ml_sim-0.3.0/pyproject.toml +53 -0
- space_ml_sim-0.3.0/src/space_ml_sim/__init__.py +3 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/__init__.py +32 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/checkpoint.py +78 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/fault_injector.py +277 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/inference_node.py +88 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/onnx_adapter.py +246 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/quantization.py +207 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/scheduler.py +81 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/tmr.py +254 -0
- space_ml_sim-0.3.0/src/space_ml_sim/compute/transformer_fault.py +340 -0
- space_ml_sim-0.3.0/src/space_ml_sim/core/__init__.py +30 -0
- space_ml_sim-0.3.0/src/space_ml_sim/core/clock.py +50 -0
- space_ml_sim-0.3.0/src/space_ml_sim/core/constellation.py +252 -0
- space_ml_sim-0.3.0/src/space_ml_sim/core/orbit.py +315 -0
- space_ml_sim-0.3.0/src/space_ml_sim/core/satellite.py +125 -0
- space_ml_sim-0.3.0/src/space_ml_sim/core/tle.py +266 -0
- space_ml_sim-0.3.0/src/space_ml_sim/environment/__init__.py +21 -0
- space_ml_sim-0.3.0/src/space_ml_sim/environment/comms.py +39 -0
- space_ml_sim-0.3.0/src/space_ml_sim/environment/power.py +30 -0
- space_ml_sim-0.3.0/src/space_ml_sim/environment/radiation.py +150 -0
- space_ml_sim-0.3.0/src/space_ml_sim/environment/thermal.py +39 -0
- space_ml_sim-0.3.0/src/space_ml_sim/environment/timeline.py +281 -0
- space_ml_sim-0.3.0/src/space_ml_sim/metrics/__init__.py +6 -0
- space_ml_sim-0.3.0/src/space_ml_sim/metrics/performance.py +43 -0
- space_ml_sim-0.3.0/src/space_ml_sim/metrics/reliability.py +48 -0
- space_ml_sim-0.3.0/src/space_ml_sim/models/__init__.py +27 -0
- space_ml_sim-0.3.0/src/space_ml_sim/models/chip_profiles.py +123 -0
- space_ml_sim-0.3.0/src/space_ml_sim/models/rad_profiles.py +13 -0
- space_ml_sim-0.3.0/src/space_ml_sim/py.typed +0 -0
- space_ml_sim-0.3.0/src/space_ml_sim/viz/__init__.py +11 -0
- space_ml_sim-0.3.0/src/space_ml_sim/viz/heatmap.py +147 -0
- space_ml_sim-0.3.0/src/space_ml_sim/viz/plots.py +166 -0
- space_ml_sim-0.3.0/tests/__init__.py +0 -0
- space_ml_sim-0.3.0/tests/test_checkpoint.py +330 -0
- space_ml_sim-0.3.0/tests/test_clock.py +241 -0
- space_ml_sim-0.3.0/tests/test_comms.py +150 -0
- space_ml_sim-0.3.0/tests/test_constellation.py +139 -0
- space_ml_sim-0.3.0/tests/test_fault_injector.py +149 -0
- space_ml_sim-0.3.0/tests/test_heatmap.py +402 -0
- space_ml_sim-0.3.0/tests/test_inference_node.py +257 -0
- space_ml_sim-0.3.0/tests/test_metrics.py +342 -0
- space_ml_sim-0.3.0/tests/test_onnx_adapter.py +395 -0
- space_ml_sim-0.3.0/tests/test_orbit.py +279 -0
- space_ml_sim-0.3.0/tests/test_power.py +81 -0
- space_ml_sim-0.3.0/tests/test_quantization.py +502 -0
- space_ml_sim-0.3.0/tests/test_radiation.py +75 -0
- space_ml_sim-0.3.0/tests/test_satellite.py +425 -0
- space_ml_sim-0.3.0/tests/test_scheduler.py +310 -0
- space_ml_sim-0.3.0/tests/test_thermal.py +116 -0
- space_ml_sim-0.3.0/tests/test_timeline.py +457 -0
- space_ml_sim-0.3.0/tests/test_tle.py +434 -0
- space_ml_sim-0.3.0/tests/test_tmr.py +205 -0
- space_ml_sim-0.3.0/tests/test_transformer_fault.py +465 -0
- space_ml_sim-0.3.0/tests/test_viz.py +255 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Default owner for everything
|
|
2
|
+
* @yaitsmesj
|
|
3
|
+
|
|
4
|
+
# Critical paths — require explicit review from maintainer
|
|
5
|
+
src/space_ml_sim/compute/fault_injector.py @yaitsmesj
|
|
6
|
+
src/space_ml_sim/compute/tmr.py @yaitsmesj
|
|
7
|
+
src/space_ml_sim/compute/transformer_fault.py @yaitsmesj
|
|
8
|
+
src/space_ml_sim/environment/radiation.py @yaitsmesj
|
|
9
|
+
src/space_ml_sim/core/orbit.py @yaitsmesj
|
|
10
|
+
src/space_ml_sim/models/chip_profiles.py @yaitsmesj
|
|
11
|
+
|
|
12
|
+
# License and legal
|
|
13
|
+
LICENSE @yaitsmesj
|
|
14
|
+
COMMERCIAL_LICENSE.md @yaitsmesj
|
|
15
|
+
|
|
16
|
+
# CI and security
|
|
17
|
+
.github/ @yaitsmesj
|
|
18
|
+
pyproject.toml @yaitsmesj
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug in space-ml-sim
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: description
|
|
7
|
+
attributes:
|
|
8
|
+
label: Description
|
|
9
|
+
description: What happened? What did you expect to happen?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: reproduction
|
|
15
|
+
attributes:
|
|
16
|
+
label: Steps to reproduce
|
|
17
|
+
description: Minimal code or steps to reproduce the issue.
|
|
18
|
+
render: python
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: environment
|
|
24
|
+
attributes:
|
|
25
|
+
label: Environment
|
|
26
|
+
description: |
|
|
27
|
+
- OS:
|
|
28
|
+
- Python version:
|
|
29
|
+
- space-ml-sim version:
|
|
30
|
+
- PyTorch version:
|
|
31
|
+
render: text
|
|
32
|
+
validations:
|
|
33
|
+
required: false
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: Commercial License Inquiry
|
|
2
|
+
description: Inquire about commercial licensing for proprietary use
|
|
3
|
+
labels: ["commercial-license"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: use_case
|
|
7
|
+
attributes:
|
|
8
|
+
label: Use case
|
|
9
|
+
description: Briefly describe how you plan to use space-ml-sim.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
|
|
13
|
+
- type: dropdown
|
|
14
|
+
id: org_type
|
|
15
|
+
attributes:
|
|
16
|
+
label: Organization type
|
|
17
|
+
options:
|
|
18
|
+
- Startup
|
|
19
|
+
- Enterprise
|
|
20
|
+
- Government / Defense
|
|
21
|
+
- Academic (grant-funded)
|
|
22
|
+
- Other
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
|
|
26
|
+
- type: textarea
|
|
27
|
+
id: contact
|
|
28
|
+
attributes:
|
|
29
|
+
label: Contact
|
|
30
|
+
description: Preferred way to reach you (email, LinkedIn, etc.)
|
|
31
|
+
validations:
|
|
32
|
+
required: true
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature or improvement
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: Problem
|
|
9
|
+
description: What problem does this solve? What use case does it enable?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: solution
|
|
15
|
+
attributes:
|
|
16
|
+
label: Proposed solution
|
|
17
|
+
description: How should this work? Include code examples if helpful.
|
|
18
|
+
validations:
|
|
19
|
+
required: false
|
|
20
|
+
|
|
21
|
+
- type: dropdown
|
|
22
|
+
id: area
|
|
23
|
+
attributes:
|
|
24
|
+
label: Area
|
|
25
|
+
options:
|
|
26
|
+
- Orbital mechanics
|
|
27
|
+
- Radiation environment
|
|
28
|
+
- Fault injection
|
|
29
|
+
- Fault tolerance (TMR)
|
|
30
|
+
- Chip profiles
|
|
31
|
+
- Visualization
|
|
32
|
+
- Documentation
|
|
33
|
+
- Other
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this PR do? 1-3 bullet points. -->
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
<!-- List the key changes. -->
|
|
8
|
+
|
|
9
|
+
## Test plan
|
|
10
|
+
|
|
11
|
+
- [ ] New tests added for changed behavior
|
|
12
|
+
- [ ] All existing tests pass (`pytest tests/ -v`)
|
|
13
|
+
- [ ] Linting passes (`ruff check src/ tests/`)
|
|
14
|
+
|
|
15
|
+
## Notes
|
|
16
|
+
|
|
17
|
+
<!-- Anything reviewers should know? Breaking changes? -->
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
day: monday
|
|
8
|
+
open-pull-requests-limit: 5
|
|
9
|
+
labels:
|
|
10
|
+
- dependencies
|
|
11
|
+
commit-message:
|
|
12
|
+
prefix: "chore(deps):"
|
|
13
|
+
|
|
14
|
+
- package-ecosystem: github-actions
|
|
15
|
+
directory: "/"
|
|
16
|
+
schedule:
|
|
17
|
+
interval: weekly
|
|
18
|
+
day: monday
|
|
19
|
+
open-pull-requests-limit: 3
|
|
20
|
+
labels:
|
|
21
|
+
- ci
|
|
22
|
+
commit-message:
|
|
23
|
+
prefix: "ci(deps):"
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: Tests (Python ${{ matrix.python-version }})
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
strategy:
|
|
14
|
+
matrix:
|
|
15
|
+
python-version: ["3.11", "3.12"]
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Setup Python ${{ matrix.python-version }}
|
|
21
|
+
uses: actions/setup-python@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: ${{ matrix.python-version }}
|
|
24
|
+
cache: pip
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: |
|
|
28
|
+
pip install -e ".[dev]"
|
|
29
|
+
pip install torchvision pytest-cov
|
|
30
|
+
|
|
31
|
+
- name: Run tests with coverage
|
|
32
|
+
run: |
|
|
33
|
+
python -m pytest tests/ -v \
|
|
34
|
+
--cov=space_ml_sim \
|
|
35
|
+
--cov-report=term-missing \
|
|
36
|
+
--cov-report=xml:coverage.xml \
|
|
37
|
+
--cov-fail-under=80
|
|
38
|
+
|
|
39
|
+
- name: Upload coverage artifact
|
|
40
|
+
if: matrix.python-version == '3.12'
|
|
41
|
+
uses: actions/upload-artifact@v4
|
|
42
|
+
with:
|
|
43
|
+
name: coverage-report
|
|
44
|
+
path: coverage.xml
|
|
45
|
+
|
|
46
|
+
lint:
|
|
47
|
+
name: Lint & Format
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
|
|
50
|
+
steps:
|
|
51
|
+
- uses: actions/checkout@v4
|
|
52
|
+
|
|
53
|
+
- name: Setup Python
|
|
54
|
+
uses: actions/setup-python@v5
|
|
55
|
+
with:
|
|
56
|
+
python-version: "3.12"
|
|
57
|
+
cache: pip
|
|
58
|
+
|
|
59
|
+
- name: Install ruff
|
|
60
|
+
run: pip install ruff
|
|
61
|
+
|
|
62
|
+
- name: Check linting
|
|
63
|
+
run: ruff check src/ tests/
|
|
64
|
+
|
|
65
|
+
- name: Check formatting
|
|
66
|
+
run: ruff format --check src/ tests/
|
|
67
|
+
|
|
68
|
+
security:
|
|
69
|
+
name: Security Scanning
|
|
70
|
+
runs-on: ubuntu-latest
|
|
71
|
+
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
|
|
75
|
+
- name: Setup Python
|
|
76
|
+
uses: actions/setup-python@v5
|
|
77
|
+
with:
|
|
78
|
+
python-version: "3.12"
|
|
79
|
+
cache: pip
|
|
80
|
+
|
|
81
|
+
- name: Install project and security tools
|
|
82
|
+
run: |
|
|
83
|
+
pip install -e ".[dev]"
|
|
84
|
+
pip install pip-audit bandit
|
|
85
|
+
|
|
86
|
+
- name: Dependency vulnerability scan
|
|
87
|
+
run: |
|
|
88
|
+
pip freeze --exclude-editable > /tmp/requirements.txt
|
|
89
|
+
pip-audit --desc -r /tmp/requirements.txt \
|
|
90
|
+
--ignore-vuln CVE-2026-4539 \
|
|
91
|
+
|| echo "::warning::pip-audit found vulnerabilities — review output above"
|
|
92
|
+
|
|
93
|
+
- name: Code security scan (bandit)
|
|
94
|
+
run: bandit -r src/ -c pyproject.toml -f json -o bandit-report.json || true
|
|
95
|
+
|
|
96
|
+
- name: Check bandit results
|
|
97
|
+
run: |
|
|
98
|
+
pip install bandit
|
|
99
|
+
bandit -r src/ -c pyproject.toml -ll
|
|
100
|
+
|
|
101
|
+
- name: Upload security report
|
|
102
|
+
if: always()
|
|
103
|
+
uses: actions/upload-artifact@v4
|
|
104
|
+
with:
|
|
105
|
+
name: bandit-report
|
|
106
|
+
path: bandit-report.json
|
|
107
|
+
if-no-files-found: ignore
|
|
108
|
+
|
|
109
|
+
license-check:
|
|
110
|
+
name: License Compliance
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
|
|
113
|
+
steps:
|
|
114
|
+
- uses: actions/checkout@v4
|
|
115
|
+
|
|
116
|
+
- name: Setup Python
|
|
117
|
+
uses: actions/setup-python@v5
|
|
118
|
+
with:
|
|
119
|
+
python-version: "3.12"
|
|
120
|
+
cache: pip
|
|
121
|
+
|
|
122
|
+
- name: Install project and license tool
|
|
123
|
+
run: |
|
|
124
|
+
pip install -e .
|
|
125
|
+
pip install pip-licenses
|
|
126
|
+
|
|
127
|
+
- name: Check dependency licenses
|
|
128
|
+
run: |
|
|
129
|
+
pip-licenses --format=table --with-license-file --no-license-path \
|
|
130
|
+
--fail-on="GNU General Public License v2 (GPLv2);GNU General Public License v3 (GPLv3)" \
|
|
131
|
+
--allow-only="MIT;BSD License;BSD-2-Clause;BSD-3-Clause;Apache Software License;ISC License (ISCL);Python Software Foundation License;Mozilla Public License 2.0 (MPL 2.0);The Unlicense (Unlicense);Public Domain;HPND;Historical Permission Notice and Disclaimer (HPND)" \
|
|
132
|
+
|| echo "::warning::Some dependencies have non-standard licenses. Review pip-licenses output above."
|
|
133
|
+
|
|
134
|
+
benchmark:
|
|
135
|
+
name: Performance Benchmark
|
|
136
|
+
runs-on: ubuntu-latest
|
|
137
|
+
|
|
138
|
+
steps:
|
|
139
|
+
- uses: actions/checkout@v4
|
|
140
|
+
|
|
141
|
+
- name: Setup Python
|
|
142
|
+
uses: actions/setup-python@v5
|
|
143
|
+
with:
|
|
144
|
+
python-version: "3.12"
|
|
145
|
+
cache: pip
|
|
146
|
+
|
|
147
|
+
- name: Install dependencies
|
|
148
|
+
run: |
|
|
149
|
+
pip install -e ".[dev]"
|
|
150
|
+
pip install torchvision
|
|
151
|
+
|
|
152
|
+
- name: Run performance benchmarks
|
|
153
|
+
run: |
|
|
154
|
+
python -c "
|
|
155
|
+
import time, json, copy, torch, torch.nn as nn
|
|
156
|
+
from space_ml_sim.compute.fault_injector import FaultInjector
|
|
157
|
+
from space_ml_sim.environment.radiation import RadiationEnvironment
|
|
158
|
+
from space_ml_sim.models.chip_profiles import TERAFAB_D3
|
|
159
|
+
from space_ml_sim.core import Constellation
|
|
160
|
+
|
|
161
|
+
results = {}
|
|
162
|
+
|
|
163
|
+
# Benchmark 1: Fault injection speed (1000 faults into a small model)
|
|
164
|
+
model = nn.Sequential(nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10))
|
|
165
|
+
injector = FaultInjector(RadiationEnvironment.leo_500km(), TERAFAB_D3)
|
|
166
|
+
start = time.perf_counter()
|
|
167
|
+
for _ in range(50):
|
|
168
|
+
m = copy.deepcopy(model)
|
|
169
|
+
injector.inject_weight_faults(m, num_faults=1000)
|
|
170
|
+
fault_time = (time.perf_counter() - start) / 50
|
|
171
|
+
results['fault_injection_1k_ms'] = round(fault_time * 1000, 2)
|
|
172
|
+
|
|
173
|
+
# Benchmark 2: Constellation step (100 sats, 1 step)
|
|
174
|
+
c = Constellation.walker_delta(10, 10, 550, 53, TERAFAB_D3)
|
|
175
|
+
start = time.perf_counter()
|
|
176
|
+
for _ in range(10):
|
|
177
|
+
c.step(dt_seconds=60.0)
|
|
178
|
+
step_time = (time.perf_counter() - start) / 10
|
|
179
|
+
results['constellation_step_100sats_ms'] = round(step_time * 1000, 2)
|
|
180
|
+
|
|
181
|
+
# Benchmark 3: Orbit propagation (1 orbit, 1s steps)
|
|
182
|
+
from space_ml_sim.core.orbit import OrbitConfig, propagate
|
|
183
|
+
config = OrbitConfig(altitude_km=550, inclination_deg=53, raan_deg=0, true_anomaly_deg=0)
|
|
184
|
+
start = time.perf_counter()
|
|
185
|
+
propagate(config, duration_minutes=95, step_seconds=1.0)
|
|
186
|
+
prop_time = time.perf_counter() - start
|
|
187
|
+
results['propagate_1orbit_1s_steps_ms'] = round(prop_time * 1000, 2)
|
|
188
|
+
|
|
189
|
+
print('=== BENCHMARK RESULTS ===')
|
|
190
|
+
for k, v in results.items():
|
|
191
|
+
print(f'{k}: {v} ms')
|
|
192
|
+
|
|
193
|
+
# Write results for comparison
|
|
194
|
+
with open('benchmark-results.json', 'w') as f:
|
|
195
|
+
json.dump(results, f, indent=2)
|
|
196
|
+
|
|
197
|
+
# Fail if any benchmark is unreasonably slow
|
|
198
|
+
assert results['fault_injection_1k_ms'] < 500, f\"Fault injection too slow: {results['fault_injection_1k_ms']}ms\"
|
|
199
|
+
assert results['constellation_step_100sats_ms'] < 1000, f\"Constellation step too slow: {results['constellation_step_100sats_ms']}ms\"
|
|
200
|
+
assert results['propagate_1orbit_1s_steps_ms'] < 2000, f\"Propagation too slow: {results['propagate_1orbit_1s_steps_ms']}ms\"
|
|
201
|
+
print('All benchmarks within limits.')
|
|
202
|
+
"
|
|
203
|
+
|
|
204
|
+
- name: Upload benchmark results
|
|
205
|
+
uses: actions/upload-artifact@v4
|
|
206
|
+
with:
|
|
207
|
+
name: benchmark-results
|
|
208
|
+
path: benchmark-results.json
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
id-token: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
validate:
|
|
13
|
+
name: Validate Release
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- name: Setup Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
cache: pip
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: |
|
|
26
|
+
pip install -e ".[dev]"
|
|
27
|
+
pip install torchvision pytest-cov
|
|
28
|
+
|
|
29
|
+
- name: Verify tag matches pyproject.toml version
|
|
30
|
+
run: |
|
|
31
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
32
|
+
TOML_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
|
|
33
|
+
if [ "$TAG_VERSION" != "$TOML_VERSION" ]; then
|
|
34
|
+
echo "::error::Tag version ($TAG_VERSION) does not match pyproject.toml ($TOML_VERSION)"
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
echo "Version match: $TAG_VERSION"
|
|
38
|
+
|
|
39
|
+
- name: Run full test suite
|
|
40
|
+
run: python -m pytest tests/ -v --cov=space_ml_sim --cov-fail-under=80
|
|
41
|
+
|
|
42
|
+
- name: Run security scan
|
|
43
|
+
run: |
|
|
44
|
+
pip install pip-audit bandit
|
|
45
|
+
pip freeze --exclude-editable > /tmp/requirements.txt
|
|
46
|
+
pip-audit --desc -r /tmp/requirements.txt \
|
|
47
|
+
--ignore-vuln CVE-2026-4539
|
|
48
|
+
bandit -r src/ -c pyproject.toml -ll
|
|
49
|
+
|
|
50
|
+
build:
|
|
51
|
+
name: Build Package
|
|
52
|
+
needs: validate
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v4
|
|
56
|
+
|
|
57
|
+
- name: Setup Python
|
|
58
|
+
uses: actions/setup-python@v5
|
|
59
|
+
with:
|
|
60
|
+
python-version: "3.12"
|
|
61
|
+
|
|
62
|
+
- name: Install build tools
|
|
63
|
+
run: pip install build
|
|
64
|
+
|
|
65
|
+
- name: Build package
|
|
66
|
+
run: python -m build
|
|
67
|
+
|
|
68
|
+
- name: Upload build artifacts
|
|
69
|
+
uses: actions/upload-artifact@v4
|
|
70
|
+
with:
|
|
71
|
+
name: dist
|
|
72
|
+
path: dist/
|
|
73
|
+
|
|
74
|
+
publish:
|
|
75
|
+
name: Publish to PyPI
|
|
76
|
+
needs: build
|
|
77
|
+
runs-on: ubuntu-latest
|
|
78
|
+
environment: pypi
|
|
79
|
+
permissions:
|
|
80
|
+
id-token: write
|
|
81
|
+
steps:
|
|
82
|
+
- name: Download build artifacts
|
|
83
|
+
uses: actions/download-artifact@v4
|
|
84
|
+
with:
|
|
85
|
+
name: dist
|
|
86
|
+
path: dist/
|
|
87
|
+
|
|
88
|
+
- name: Publish to PyPI
|
|
89
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*$py.class
|
|
4
|
+
*.so
|
|
5
|
+
*.egg-info/
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
.eggs/
|
|
9
|
+
*.egg
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
env/
|
|
13
|
+
.env
|
|
14
|
+
*.pth
|
|
15
|
+
*.pt
|
|
16
|
+
*.onnx
|
|
17
|
+
data/
|
|
18
|
+
*.png
|
|
19
|
+
*.jpg
|
|
20
|
+
*.html
|
|
21
|
+
.ruff_cache/
|
|
22
|
+
.pytest_cache/
|
|
23
|
+
.mypy_cache/
|
|
24
|
+
.coverage
|
|
25
|
+
htmlcov/
|
|
26
|
+
.DS_Store
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.4.8
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
|
|
9
|
+
- repo: https://github.com/PyCQA/bandit
|
|
10
|
+
rev: 1.7.9
|
|
11
|
+
hooks:
|
|
12
|
+
- id: bandit
|
|
13
|
+
args: [-c, pyproject.toml, -r, src/]
|
|
14
|
+
additional_dependencies: ["bandit[toml]"]
|
|
15
|
+
|
|
16
|
+
- repo: https://github.com/Yelp/detect-secrets
|
|
17
|
+
rev: v1.5.0
|
|
18
|
+
hooks:
|
|
19
|
+
- id: detect-secrets
|
|
20
|
+
args: [--baseline, .secrets.baseline]
|
|
21
|
+
exclude: LICENSE
|
|
22
|
+
|
|
23
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
24
|
+
rev: v4.6.0
|
|
25
|
+
hooks:
|
|
26
|
+
- id: trailing-whitespace
|
|
27
|
+
- id: end-of-file-fixer
|
|
28
|
+
- id: check-yaml
|
|
29
|
+
- id: check-added-large-files
|
|
30
|
+
args: [--maxkb=500]
|
|
31
|
+
- id: check-merge-conflict
|
|
32
|
+
- id: debug-statements
|
|
33
|
+
|
|
34
|
+
- repo: https://github.com/compilerla/conventional-pre-commit
|
|
35
|
+
rev: v3.3.0
|
|
36
|
+
hooks:
|
|
37
|
+
- id: conventional-pre-commit
|
|
38
|
+
stages: [commit-msg]
|
|
39
|
+
args: [feat, fix, refactor, docs, test, chore, perf, ci, style]
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.5.0",
|
|
3
|
+
"plugins_used": [
|
|
4
|
+
{
|
|
5
|
+
"name": "ArtifactoryDetector"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "AWSKeyDetector"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "AzureStorageKeyDetector"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"name": "Base64HighEntropyString",
|
|
15
|
+
"limit": 4.5
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "BasicAuthDetector"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "CloudantDetector"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "DiscordBotTokenDetector"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "GitHubTokenDetector"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "GitLabTokenDetector"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "HexHighEntropyString",
|
|
34
|
+
"limit": 3.0
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "IbmCloudIamDetector"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "IbmCosHmacDetector"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "IPPublicDetector"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "JwtTokenDetector"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "KeywordDetector",
|
|
50
|
+
"keyword_exclude": ""
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "MailchimpDetector"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "NpmDetector"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "OpenAIDetector"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "PrivateKeyDetector"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "PypiTokenDetector"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"name": "SendGridDetector"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "SlackDetector"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "SoftlayerDetector"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "SquareOAuthDetector"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "StripeDetector"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"name": "TelegramBotTokenDetector"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "TwilioKeyDetector"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"filters_used": [
|
|
90
|
+
{
|
|
91
|
+
"path": "detect_secrets.filters.allowlist.is_line_allowlisted"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
|
|
95
|
+
"min_level": 2
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"path": "detect_secrets.filters.heuristic.is_indirect_reference"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"path": "detect_secrets.filters.heuristic.is_likely_id_string"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"path": "detect_secrets.filters.heuristic.is_lock_file"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"path": "detect_secrets.filters.heuristic.is_potential_uuid"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"path": "detect_secrets.filters.heuristic.is_sequential_string"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"path": "detect_secrets.filters.heuristic.is_swagger_file"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"path": "detect_secrets.filters.heuristic.is_templated_secret"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"path": "detect_secrets.filters.regex.should_exclude_file",
|
|
126
|
+
"pattern": [
|
|
127
|
+
"LICENSE"
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
"results": {},
|
|
132
|
+
"generated_at": "2026-03-26T15:53:05Z"
|
|
133
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
title: "space-ml-sim: Simulation Framework for AI Inference on Orbital Satellite Constellations"
|
|
3
|
+
message: "If you use this software in your research, please cite it using the metadata from this file."
|
|
4
|
+
type: software
|
|
5
|
+
authors:
|
|
6
|
+
- name: "space-ml-sim contributors"
|
|
7
|
+
repository-code: "https://github.com/yaitsmesj/space-ml-sim"
|
|
8
|
+
url: "https://github.com/yaitsmesj/space-ml-sim"
|
|
9
|
+
license: AGPL-3.0-or-later
|
|
10
|
+
version: 0.3.0
|
|
11
|
+
date-released: "2026-04-04"
|
|
12
|
+
keywords:
|
|
13
|
+
- satellite
|
|
14
|
+
- space radiation
|
|
15
|
+
- fault injection
|
|
16
|
+
- neural network reliability
|
|
17
|
+
- triple modular redundancy
|
|
18
|
+
- orbital computing
|
|
19
|
+
- LEO
|
|
20
|
+
abstract: >-
|
|
21
|
+
space-ml-sim is a simulation framework for studying the effects of
|
|
22
|
+
space radiation on AI inference running aboard orbital satellite
|
|
23
|
+
constellations. It provides parametric radiation environment models,
|
|
24
|
+
ML-aware fault injection into PyTorch models, fault tolerance
|
|
25
|
+
strategies (TMR, selective TMR, checkpoint rollback), and orbital
|
|
26
|
+
mechanics for LEO constellation simulation.
|