Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
520 commits
Select commit Hold shift + click to select a range
963dbc6
test: cover NFsim t4 parser syntax
akutuva21 Sep 1, 2026
11054cb
test: govern historical NFsim t4 parser gap
akutuva21 Sep 1, 2026
7333810
test: pin native NFsim IfTest trajectory
akutuva21 Sep 1, 2026
300724b
fix: align NFsim mapping RNG stream
akutuva21 Sep 1, 2026
0262aa7
docs: record exact IfTest parity checkpoint
akutuva21 Sep 1, 2026
b916805
test: require BNG2-canonical seed XML
akutuva21 Sep 1, 2026
41604e4
test: pin BNG2 seed molecule ordering
akutuva21 Sep 1, 2026
c4bbe68
fix: canonicalize BNG2 seed species ordering
akutuva21 Sep 1, 2026
0a21c69
test: pin repeated seed allocation order
akutuva21 Sep 1, 2026
bdddbd4
fix: match legacy seed allocation order
akutuva21 Sep 1, 2026
8cdf5e2
test: pin inferred integer state semantics
akutuva21 Sep 1, 2026
460624d
test: cover XML inferred integer states
akutuva21 Sep 1, 2026
3be1b40
fix: preserve inferred integer state semantics
akutuva21 Sep 1, 2026
5ec23e9
test: pin canonical inferred type ordering
akutuva21 Sep 1, 2026
552916b
test: cover canonical type ordering in BNGL writer
akutuva21 Sep 1, 2026
41b12f2
fix: match BNG2 inferred type ordering
akutuva21 Sep 1, 2026
8ca7bb6
docs: record AN2 parity checkpoint
akutuva21 Sep 1, 2026
af7081f
test: cover exact IfTest direct rates
akutuva21 Sep 1, 2026
e92b2c9
fix: map direct NFsim reactant-count rates
akutuva21 Sep 1, 2026
59d2c17
docs: record current IfTest parity
akutuva21 Sep 1, 2026
2051d8f
docs: pin NFsim energy source cutoff
akutuva21 Sep 1, 2026
b13fe23
test: require independent NFsim oracle paths
akutuva21 Sep 1, 2026
9257bae
docs: audit direct NFsim parity gaps
akutuva21 Sep 1, 2026
729b4d2
fix: match NFsim accumulated sample checkpoints
akutuva21 Sep 1, 2026
2d1fad2
fix: match native NFsim final endpoint
akutuva21 Sep 1, 2026
dedffe2
docs: record direct NFsim endpoint parity
akutuva21 Sep 1, 2026
852793f
fix: refresh species-observable propensities
akutuva21 Sep 1, 2026
aae5ffc
docs: record Issue86 convergence checkpoint
akutuva21 Sep 1, 2026
7186b65
feat: honor absolute NF simulation start times
akutuva21 Sep 1, 2026
ad7c38e
docs: record absolute NF start checkpoint
akutuva21 Sep 1, 2026
9378000
test: cover NFsim EnergyFunction expansion contract
akutuva21 Sep 1, 2026
ed3f295
docs: record EnergyFunction coverage checkpoint
akutuva21 Sep 1, 2026
c754544
fix: keep NFsim XML local-function rates compatible
akutuva21 Sep 1, 2026
2979bb5
docs: record local NFsim XML parity checkpoint
akutuva21 Sep 1, 2026
381303f
docs: pin checklist public head
akutuva21 Sep 1, 2026
9a2475a
ci: preserve exact PR head evidence
akutuva21 Sep 1, 2026
0105acc
docs: refresh convergence checklist and CI rules
akutuva21 Sep 1, 2026
144b5e3
fix: align modern Species extension semantics
akutuva21 Sep 1, 2026
3eee53e
docs: refresh convergence checklist for Atomizer checkpoint
akutuva21 Sep 1, 2026
9c60ca4
fix: complete modern Species extension parity
akutuva21 Sep 1, 2026
b610992
fix: define empty pattern graph canonicalization
akutuva21 Sep 1, 2026
2c498af
perf: reduce node serialization allocations
akutuva21 Sep 1, 2026
d3b1476
docs: refresh checklist for fork branch audit
akutuva21 Sep 1, 2026
3b284a5
perf: compact large ODE reaction updates
akutuva21 Sep 1, 2026
1576bbd
docs: record compact ODE checkpoint
akutuva21 Sep 1, 2026
084090e
perf: defer species canonical labels after exact lookup
akutuva21 Sep 1, 2026
1a80c82
docs: record exact-dedup checkpoint
akutuva21 Sep 1, 2026
d52f18a
perf: skip canonicalization for exact products
akutuva21 Sep 1, 2026
1fd68d6
docs: record exact-probe checkpoint
akutuva21 Sep 1, 2026
7100f5e
perf: reuse exact keys for product insertion
akutuva21 Sep 1, 2026
8b54751
docs: record exact-key reuse checkpoint
akutuva21 Sep 1, 2026
73757ea
perf: cache reaction pattern metadata
akutuva21 Sep 1, 2026
888d96b
docs: record pattern cache checkpoint
akutuva21 Sep 1, 2026
2d69b99
perf: avoid boolean parser lowercasing
akutuva21 Sep 1, 2026
d502e47
perf: cache ODE function match strings
akutuva21 Sep 1, 2026
8b2cde3
docs: record ODE matcher checkpoint
akutuva21 Sep 1, 2026
e2c3c96
docs: record full ODE matcher test gate
akutuva21 Sep 1, 2026
4ea7157
perf: preparse observable patterns
akutuva21 Sep 1, 2026
bde6429
docs: record observable preparse checkpoint
akutuva21 Sep 1, 2026
cabff8e
docs: record observable preparse test gate
akutuva21 Sep 1, 2026
1c03bc1
fix: report action execution failures from CLI
akutuva21 Sep 1, 2026
2d63664
docs: refresh BNG3 convergence checklist
akutuva21 Sep 1, 2026
5b5badf
test: pin legacy Macro open-mode contract
akutuva21 Sep 1, 2026
44d8655
fix: harden legacy Macro file opens
akutuva21 Sep 1, 2026
f4ae73d
docs: record legacy security checkpoint
akutuva21 Sep 1, 2026
b8dfd02
docs: record diagnostic BNG2 parity evidence
akutuva21 Sep 1, 2026
8f24f7c
docs: record current hosted check readback
akutuva21 Sep 1, 2026
d7fd0dc
test: cover zero-argument function rates
akutuva21 Sep 1, 2026
d7536f5
fix: evaluate nested model functions in output
akutuva21 Sep 1, 2026
7b53663
docs: refresh convergence done checklist
akutuva21 Sep 1, 2026
7ac237b
docs: record latest checklist head
akutuva21 Sep 1, 2026
418db22
fix: preserve natural log in net parity
akutuva21 Sep 1, 2026
7705c48
fix: preserve reverse rates for model functions
akutuva21 Sep 1, 2026
ead6b8e
fix: deduplicate compartmented isomorphic species
akutuva21 Sep 1, 2026
0a12e43
docs: refresh convergence checklist after cBNGL parity
akutuva21 Sep 1, 2026
4edf4df
fix: complete MacroBNGModel species transform
akutuva21 Sep 1, 2026
50e4cf0
docs: refresh convergence checklist after Macro port
akutuva21 Sep 1, 2026
88f4e54
perf: reuse cached sparse selector propensities
akutuva21 Sep 1, 2026
8dd3653
docs: refresh convergence checklist after selector port
akutuva21 Sep 1, 2026
3c3432d
docs: record independent parity checkpoint
akutuva21 Sep 2, 2026
7241746
build: guard release LTO for embedded NFsim
akutuva21 Sep 2, 2026
502bb81
docs: refresh convergence checkpoint and agent rules
akutuva21 Sep 2, 2026
e7cd59b
ci: fail closed on weekly cross-validation errors
akutuva21 Sep 2, 2026
413083f
docs: record fail-closed CI checkpoint
akutuva21 Sep 2, 2026
4135236
feat: expose parameterized atomizer functions
akutuva21 Sep 2, 2026
8ebedb2
docs: record parameterized-function checkpoint
akutuva21 Sep 2, 2026
0e2642a
ci: fail closed on missing reference oracles
akutuva21 Sep 2, 2026
3b5ee87
docs: record strict-reference CI checkpoint
akutuva21 Sep 2, 2026
4745492
docs: record Playground writer audit
akutuva21 Sep 2, 2026
a8b7ea6
docs: refresh convergence checklist evidence
akutuva21 Sep 2, 2026
4ed849f
ci: centralize reference validation exclusions
akutuva21 Sep 2, 2026
838dc5d
docs: record validation governance checkpoint
akutuva21 Sep 2, 2026
1ff6d7b
fix: bound legacy function dependency cycles
akutuva21 Sep 2, 2026
d5eef78
docs: record legacy cycle checkpoint
akutuva21 Sep 2, 2026
772adf5
fix: translate legacy CVODE operators
akutuva21 Sep 2, 2026
bdcc478
docs: refresh convergence checklist
akutuva21 Sep 2, 2026
d1602ba
fix: preserve legacy pattern XML modifiers
akutuva21 Sep 2, 2026
0dfdb9a
docs: record pattern XML checkpoint
akutuva21 Sep 2, 2026
7b6feae
fix: preserve legacy symmetry boundaries
akutuva21 Sep 2, 2026
5e5ab48
docs: record symmetry checkpoint
akutuva21 Sep 2, 2026
4d403ec
fix: route legacy console errors
akutuva21 Sep 2, 2026
ce42511
docs: record console checkpoint
akutuva21 Sep 2, 2026
99e9950
fix: preserve legacy graph labels
akutuva21 Sep 2, 2026
ec4368a
docs: record graph label checkpoint
akutuva21 Sep 2, 2026
bf2900b
fix: harden legacy output diagnostics
akutuva21 Sep 2, 2026
a393e26
docs: refresh convergence checklist
akutuva21 Sep 2, 2026
7977966
fix: use numeric Macro site comparisons
akutuva21 Sep 2, 2026
98ad416
docs: record Macro parity checkpoint
akutuva21 Sep 2, 2026
b82e08c
docs: record source reconciliation audit
akutuva21 Sep 2, 2026
85f2aff
docs: record independent NFsim oracle evidence
akutuva21 Sep 2, 2026
f99ca3a
docs: refresh exact workflow checkpoint
akutuva21 Sep 2, 2026
9397837
test: require actual net read/write roundtrip
akutuva21 Sep 2, 2026
845bc8c
test: run validation CLI from explicit source paths
akutuva21 Sep 2, 2026
3bee78b
docs: record actual net roundtrip validation
akutuva21 Sep 2, 2026
462bf87
test: require atomizer compartment function mapping
akutuva21 Sep 2, 2026
5760be1
fix: map atomizer compartment function references
akutuva21 Sep 2, 2026
bc609e8
test: require atomizer assignment rule ordering
akutuva21 Sep 2, 2026
5adb545
fix: order atomizer assignment rule functions
akutuva21 Sep 2, 2026
4298e1a
docs: record atomizer writer parity ports
akutuva21 Sep 2, 2026
2c9d3be
style: format atomizer writer
akutuva21 Sep 2, 2026
f1eeebf
feat: keep atomizer time rates live
akutuva21 Sep 2, 2026
3fc1ea5
docs: record atomizer time-rate parity
akutuva21 Sep 2, 2026
dedf9e8
docs: record local ASan checkpoint
akutuva21 Sep 2, 2026
19a90ed
fix: strip atomizer compartment rate factors
akutuva21 Sep 2, 2026
944a0ad
docs: record compartment rate parity
akutuva21 Sep 2, 2026
bbca4f0
docs: record validation smoke checkpoint
akutuva21 Sep 2, 2026
924fb36
fix: strip internal atomizer compartment factors
akutuva21 Sep 2, 2026
07d51de
docs: record internal compartment parity
akutuva21 Sep 2, 2026
c542914
fix: normalize atomizer compartment rate factors
akutuva21 Sep 2, 2026
c67235c
docs: record compartment normalization parity
akutuva21 Sep 2, 2026
6e439bd
docs: record latest hosted checkpoint
akutuva21 Sep 2, 2026
6b71ecc
fix: match atomizer event step rounding
akutuva21 Sep 2, 2026
74c0d6b
docs: record event rounding parity
akutuva21 Sep 2, 2026
7323ae8
fix: report atomizer dependency cycles
akutuva21 Sep 2, 2026
a51a827
docs: record atomizer cycle diagnostics
akutuva21 Sep 2, 2026
c00c9ba
feat: expose atomizer qualifier resources
akutuva21 Sep 2, 2026
1864629
docs: record atomizer qualifier parity
akutuva21 Sep 2, 2026
50da22f
fix: align atomizer annotation parsing
akutuva21 Sep 2, 2026
7892290
docs: record atomizer identifier parity
akutuva21 Sep 2, 2026
71e2511
fix: report atomizer naming analysis
akutuva21 Sep 2, 2026
3ac1c87
docs: record atomizer naming diagnostics
akutuva21 Sep 2, 2026
277e0b6
fix: report atomizer reaction analysis
akutuva21 Sep 2, 2026
ed23d9a
docs: record atomizer reaction diagnostics
akutuva21 Sep 2, 2026
07b8f38
docs: record historical asan validation
akutuva21 Sep 2, 2026
189d943
docs: record strict validation checkpoint
akutuva21 Sep 2, 2026
90c3684
fix: report atomizer sct analysis
akutuva21 Sep 2, 2026
4fdbb8d
docs: record sct and asan evidence
akutuva21 Sep 2, 2026
16fee36
fix: align atomizer lifecycle diagnostics
akutuva21 Sep 2, 2026
1596df7
docs: record atomizer lifecycle parity
akutuva21 Sep 2, 2026
6b4e961
fix: report atomizer parser summary
akutuva21 Sep 2, 2026
6476e42
fix: expose atomizer parser warnings
akutuva21 Sep 2, 2026
7843099
fix: report missing atomizer kinetic laws
akutuva21 Sep 2, 2026
7166ef8
fix: report synthetic rate-rule species
akutuva21 Sep 2, 2026
a19d1cc
fix: report nonadjacent atomizer transport
akutuva21 Sep 2, 2026
a288a23
feat: add atomizer large-model fast path
akutuva21 Sep 2, 2026
78be945
docs: record atomizer convergence checkpoint
akutuva21 Sep 2, 2026
d288387
fix: expose BNG-XML conversion diagnostics
akutuva21 Sep 2, 2026
b681112
docs: record BNG-XML convergence checkpoint
akutuva21 Sep 2, 2026
29b7687
fix: preserve unsplittable reversible SBML rates
akutuva21 Sep 2, 2026
71f4fec
docs: record reversible-rate convergence checkpoint
akutuva21 Sep 2, 2026
e847eaa
Port Atomizer constant function ordering workaround
akutuva21 Sep 2, 2026
d52980f
Refresh convergence evidence for function ordering port
akutuva21 Sep 2, 2026
6f7573f
Align Atomizer saturation reaction classification
akutuva21 Sep 2, 2026
6cfae9a
Refresh convergence evidence for saturation classifier
akutuva21 Sep 2, 2026
5ad7524
Align Atomizer log10 conversion
akutuva21 Sep 2, 2026
328b658
Refresh convergence evidence for Atomizer ports
akutuva21 Sep 2, 2026
167d6b8
Align Atomizer component bond deletion
akutuva21 Sep 2, 2026
4186e6d
Refresh convergence evidence for structure helper
akutuva21 Sep 2, 2026
27ae8d6
Align Atomizer seed presence flags
akutuva21 Sep 2, 2026
82e14c3
Refresh convergence evidence for seed semantics
akutuva21 Sep 2, 2026
5933584
Repair deletion parity and action-aware ODE validation
akutuva21 Sep 2, 2026
cd3914e
Refresh deletion parity convergence evidence
akutuva21 Sep 2, 2026
93f60a6
Record fresh independent validation evidence
akutuva21 Sep 2, 2026
1de39f4
Cache OdeIntegrator function scan state
akutuva21 Sep 2, 2026
d278e98
Record OdeIntegrator optimization evidence
akutuva21 Sep 2, 2026
567b391
Preserve energy patterns in NFsim XML
akutuva21 Sep 2, 2026
5a1594f
Preserve Arrhenius direction in XML bridge
akutuva21 Sep 2, 2026
7c10bec
Refresh convergence checklist for XML energy bridge
akutuva21 Sep 2, 2026
18e8d8f
Disambiguate duplicate SBML parameters
akutuva21 Sep 2, 2026
1a31687
Refresh convergence checklist for duplicate parameters
akutuva21 Sep 2, 2026
871d261
Normalize SBML parameter aliases in math
akutuva21 Sep 3, 2026
1cccd2d
Refresh convergence checklist for parameter aliases
akutuva21 Sep 3, 2026
e95fe02
Record accepted-cutoff Tier-NF validation
akutuva21 Sep 3, 2026
eb19992
Record provenance spine audit
akutuva21 Sep 3, 2026
83ca824
Record external parity validation
akutuva21 Sep 3, 2026
6b8a08a
Refresh hosted validation checkpoint
akutuva21 Sep 3, 2026
0810dc6
Standardize SBML parameter identifiers
akutuva21 Sep 3, 2026
e1fb24e
Record canonical parameter ID parity
akutuva21 Sep 3, 2026
6871518
Disambiguate duplicate local SBML parameters
akutuva21 Sep 3, 2026
4dda3ae
Record duplicate local parameter parity
akutuva21 Sep 3, 2026
bb3c116
Group duplicate atomizer seed patterns
akutuva21 Sep 3, 2026
7431ad7
Record duplicate seed pattern parity
akutuva21 Sep 3, 2026
cd8d6fa
Port Playground duplicate-component extension semantics
akutuva21 Sep 3, 2026
2ee8770
Refresh convergence evidence for duplicate component extension
akutuva21 Sep 3, 2026
33cbd13
Expose named modification inference results
akutuva21 Sep 3, 2026
d5bb4b0
Refresh BNG3 convergence evidence
akutuva21 Sep 3, 2026
7afeb80
Restore Atomizer core facade exports
akutuva21 Sep 3, 2026
f00acfc
Record Atomizer facade parity evidence
akutuva21 Sep 3, 2026
503541c
Restore Atomizer writer facade exports
akutuva21 Sep 3, 2026
7af9950
Record Atomizer writer facade evidence
akutuva21 Sep 3, 2026
0663b2e
Restore Atomizer structure method names
akutuva21 Sep 3, 2026
220b1e2
Remove redundant structure compatibility aliases
akutuva21 Sep 3, 2026
38d9964
Record Atomizer structure method evidence
akutuva21 Sep 3, 2026
d58c2a6
Expose Atomizer facade compatibility names
akutuva21 Sep 3, 2026
256d75b
Record Atomizer facade evidence
akutuva21 Sep 3, 2026
5afc84e
Return named BNGL generation results
akutuva21 Sep 3, 2026
4012d51
Record named BNGL result evidence
akutuva21 Sep 3, 2026
a2a3511
Expose source-compatible Atomizer data fields
akutuva21 Sep 3, 2026
d85ae06
Record Atomizer data contract evidence
akutuva21 Sep 3, 2026
667935b
Add missing Atomizer SBML record types
akutuva21 Sep 3, 2026
99a3a36
Record SBML record contract evidence
akutuva21 Sep 3, 2026
b9df8db
Normalize Atomizer modifier records
akutuva21 Sep 3, 2026
aee4cf6
Record modifier normalization evidence
akutuva21 Sep 3, 2026
43afe69
Expose source-compatible event action contracts
akutuva21 Sep 3, 2026
bbb9ad9
Record eventActions contract evidence
akutuva21 Sep 3, 2026
99e12f5
Expose Component toString compatibility
akutuva21 Sep 3, 2026
112a12a
Record structure alias evidence
akutuva21 Sep 3, 2026
4c84b37
Expose source-compatible readFromString
akutuva21 Sep 3, 2026
483aa0d
Record readFromString evidence
akutuva21 Sep 3, 2026
e25766e
Preserve SBML compartment type references
akutuva21 Sep 3, 2026
753e57b
Preserve SBML modifier records
akutuva21 Sep 3, 2026
7508052
Record SBML parser record evidence
akutuva21 Sep 3, 2026
be9d6a2
Expose structured Atomizer import warnings
akutuva21 Sep 3, 2026
37b5e5d
Record structured warning convergence evidence
akutuva21 Sep 3, 2026
eefdf3b
Expose structured Atomizer event assignments
akutuva21 Sep 3, 2026
fc07b3b
Record event assignment convergence evidence
akutuva21 Sep 3, 2026
4be16b1
Return structured Atomizer log records
akutuva21 Sep 3, 2026
fb5a3b0
Record structured result log evidence
akutuva21 Sep 3, 2026
fc65e25
Return Atomizer Databases container
akutuva21 Sep 3, 2026
f6fbf70
Record Atomizer Databases evidence
akutuva21 Sep 3, 2026
c52cc97
Return structured Multi warnings
akutuva21 Sep 3, 2026
855dada
Record structured Multi warning evidence
akutuva21 Sep 3, 2026
0b611ec
Expose structured Multi result patterns
akutuva21 Sep 3, 2026
12be6f9
Record Multi result-shape evidence
akutuva21 Sep 3, 2026
6ff6911
Report lossy MathML import diagnostics
akutuva21 Sep 3, 2026
dddc78f
Record lossy MathML diagnostic evidence
akutuva21 Sep 3, 2026
dd7c0de
Expose reconcileSCT core facade
akutuva21 Sep 3, 2026
2ea8267
Record reconcileSCT facade evidence
akutuva21 Sep 3, 2026
7d729a0
Preserve rational SBML stoichiometry
akutuva21 Sep 3, 2026
eb775f6
Record rational stoichiometry evidence
akutuva21 Sep 3, 2026
beb0cee
Honor source Atomizer option spellings
akutuva21 Sep 3, 2026
8e59d58
Record Atomizer option compatibility evidence
akutuva21 Sep 3, 2026
f64f467
Port Atomizer naming convention patterns
akutuva21 Sep 3, 2026
dfa3c1c
Record naming pattern parity evidence
akutuva21 Sep 3, 2026
655810d
Match Atomizer naming analysis key format
akutuva21 Sep 3, 2026
bccd619
Record naming analysis compatibility evidence
akutuva21 Sep 3, 2026
eecbdce
Match Playground pmemoize cache sharing
akutuva21 Sep 3, 2026
6c88045
Refresh convergence checklist for pmemoize parity
akutuva21 Sep 3, 2026
094f7ac
Port Playground naming convention configuration
akutuva21 Sep 3, 2026
3bc7b4f
Refresh convergence checklist for naming config
akutuva21 Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 78 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ on:
branches: [main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# Keep hosted evidence attached to the exact PR head being evaluated. A
# checklist/documentation push must not cancel the preceding semantic run.
group: ${{ github.workflow }}-${{ github.event.pull_request.head.sha || github.sha }}
cancel-in-progress: false

env:
CMAKE_BUILD_TYPE: Release
Expand All @@ -31,7 +33,7 @@ jobs:
python-version: "3.12"

- name: Install linters and policy dependencies
run: pip install black ruff pytest
run: pip install black ruff pytest numpy

- name: Check Python formatting (Black)
run: black --check --diff --target-version py312 python/ tests/python/ scripts/
Expand Down Expand Up @@ -64,6 +66,9 @@ jobs:
- name: Enforce validation exception budget
run: python -m tests.validation.exception_ledger --max-exceptions 1

- name: Run CI contract tests
run: python -m pytest tests/test_ci_contract.py -q

# ═══════════════════════════════════════════════════════════════════════════
# C++ Build & Test (BNG engine with embedded NFsim library)
# ═══════════════════════════════════════════════════════════════════════════
Expand Down Expand Up @@ -188,7 +193,7 @@ jobs:
# ═══════════════════════════════════════════════════════════════════════════

validation:
name: Validation (${{ matrix.os }})
name: Validation (supported reference subset, ${{ matrix.os }})
needs: cpp-build
runs-on: ${{ matrix.os }}
strategy:
Expand Down Expand Up @@ -222,12 +227,13 @@ jobs:
if: "!startsWith(matrix.os, 'windows')"
run: chmod +x build/cpp/bng_cpp*

- name: Run validation against reference .net files
- name: Run supported validation against reference .net files
shell: bash
run: |
BNG=build/cpp/bng_cpp${{ startsWith(matrix.os, 'windows') && '.exe' || '' }}
SKIP="--skip michment_cont,test_sbml_flat,test_sbml_structured,Repressilator,SHP2_base_model"
python scripts/validate.py --bng-cpp "$BNG" $SKIP --verbose
python scripts/validate.py --bng-cpp "$BNG" --strict-references \
--skip-file tests/validation/reference_exclusions.json \
--skip-profile pull_request --verbose

# ═══════════════════════════════════════════════════════════════════════════
# BNGL corpus parse inventory (not an NFsim simulation check)
Expand Down Expand Up @@ -297,7 +303,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-22.04, macos-14, windows-2022]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]

steps:
- uses: actions/checkout@v4
Expand All @@ -319,7 +325,7 @@ jobs:
uses: ilammy/msvc-dev-cmd@v1

- name: Install Python build dependencies
run: pip install scikit-build-core pybind11 numpy pytest pytest-cov cement colorlog pyparsing pylru pandas matplotlib python-libsbml pyyaml lxml networkx sympy seaborn xmltodict
run: pip install scikit-build-core pybind11 numpy click pytest pytest-cov cement colorlog pyparsing pylru pandas matplotlib python-libsbml pyyaml lxml networkx sympy seaborn xmltodict

- name: Build and install package (Windows)
if: startsWith(matrix.os, 'windows')
Expand All @@ -336,10 +342,26 @@ jobs:
env:
CMAKE_ARGS: "-DBUILD_TESTS=OFF -DBUILD_CLI=OFF"

- name: Seed isolated Matplotlib font cache (Unix)
if: matrix.os == 'ubuntu-22.04' && (matrix.python-version == '3.9' || matrix.python-version == '3.10')
run: python scripts/prepare_matplotlib_cache.py
env:
MPLBACKEND: Agg
MPLCONFIGDIR: ${{ runner.temp }}/matplotlib

- name: Run Python tests
run: pytest tests/python/ -v --tb=short --cov=bionetgen --cov-report=xml
run: pytest tests/python/test_sbml_import.py -v --tb=short
env:
SYMPY_USE_GMPY: "0"
MPLBACKEND: Agg
MPLCONFIGDIR: ${{ runner.temp }}/matplotlib

- name: Run Python tests
run: pytest tests/python/ -v --tb=short --cov=bionetgen --cov-report=xml --ignore=tests/python/test_sbml_import.py
env:
SYMPY_USE_GMPY: "0"
MPLBACKEND: Agg
MPLCONFIGDIR: ${{ runner.temp }}/matplotlib

- name: Upload coverage
if: matrix.os == 'ubuntu-22.04' && matrix.python-version == '3.12'
Expand Down Expand Up @@ -406,6 +428,50 @@ jobs:
env:
SYMPY_USE_GMPY: "0"

# ═══════════════════════════════════════════════════════════════════════════
# Source Distribution Installation Smoke Test
# ═══════════════════════════════════════════════════════════════════════════

package-smoke:
name: Package Smoke (sdist)
needs: [python-test]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install packaging and native build dependencies
run: |
sudo apt-get update
sudo apt-get install -y cmake ninja-build
python -m pip install build

- name: Build source distribution
run: python -m build --sdist

- name: Install source distribution in clean environment
shell: bash
run: |
set -eu
python -m venv "$RUNNER_TEMP/bng3-package-smoke"
"$RUNNER_TEMP/bng3-package-smoke/bin/python" -m pip install --upgrade pip
"$RUNNER_TEMP/bng3-package-smoke/bin/python" -m pip install numpy click
"$RUNNER_TEMP/bng3-package-smoke/bin/python" -m pip install --no-deps dist/*.tar.gz
env:
CMAKE_ARGS: "-DBUILD_TESTS=OFF -DBUILD_CLI=OFF"

- name: Smoke installed package
shell: bash
run: |
set -eu
"$RUNNER_TEMP/bng3-package-smoke/bin/python" -c \
"import bionetgen; import bionetgen._bionetgen_cpp"
"$RUNNER_TEMP/bng3-package-smoke/bin/bionetgen" --version
"$RUNNER_TEMP/bng3-package-smoke/bin/bionetgen" --help

# ═══════════════════════════════════════════════════════════════════════════
# Wheel Building (binary distribution)
# ═══════════════════════════════════════════════════════════════════════════
Expand Down Expand Up @@ -437,10 +503,10 @@ jobs:
- name: Build wheels
run: cibuildwheel --output-dir wheelhouse
env:
CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-* cp313-*"
CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-* cp313-* cp314-*"
CIBW_SKIP: "*-musllinux_* *-manylinux_i686 *-win32"
CIBW_BUILD_VERBOSITY: 1
CIBW_TEST_REQUIRES: pytest numpy
CIBW_TEST_REQUIRES: pytest numpy click
CIBW_TEST_COMMAND: pytest {project}/tests/python/test_cpp_backend.py -v --tb=short
CIBW_ENVIRONMENT: CMAKE_ARGS="-DBUILD_TESTS=OFF -DBUILD_CLI=OFF"
# macOS: build universal2 wheels
Expand Down
64 changes: 64 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: CodeQL

on:
push:
branches: [main, develop]
pull_request:
branches: [main]
schedule:
- cron: "17 3 * * 1"
workflow_dispatch:

permissions:
actions: read
contents: read
security-events: write

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
include:
- language: cpp
build-mode: manual
- language: python
build-mode: none

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}

- name: Install C++ build dependencies
if: matrix.language == 'cpp'
run: sudo apt-get update && sudo apt-get install -y cmake ninja-build

- name: Configure C++ project
if: matrix.language == 'cpp'
run: >-
cmake -B build -G Ninja
-DCMAKE_BUILD_TYPE=Release
-DBUILD_PYTHON_BINDINGS=OFF
-DBUILD_CLI=OFF
-DBUILD_NFSIM_CLI=OFF
-DBUILD_TESTS=OFF

- name: Build C++ project
if: matrix.language == 'cpp'
run: cmake --build build --parallel 2

- name: Analyze
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@ jobs:
- name: Build wheels
run: cibuildwheel --output-dir wheelhouse
env:
CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-* cp313-*"
CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-* cp313-* cp314-*"
CIBW_SKIP: "*-musllinux_* *-manylinux_i686 *-win32"
CIBW_TEST_REQUIRES: pytest numpy
CIBW_TEST_REQUIRES: pytest numpy click
CIBW_TEST_COMMAND: pytest {project}/tests/python/test_cpp_backend.py -v --tb=short
CIBW_ENVIRONMENT: CMAKE_ARGS="-DBUILD_TESTS=OFF -DBUILD_CLI=OFF"
CIBW_ARCHS_MACOS: "arm64 x86_64"
Expand Down
31 changes: 18 additions & 13 deletions .github/workflows/weekly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ env:

jobs:
# ═══════════════════════════════════════════════════════════════════════════
# Full BNG Network Generation Validation
# Supported BNG Network Generation Validation
# ═══════════════════════════════════════════════════════════════════════════

bng-validation:
name: BNG Validation (${{ matrix.os }})
name: BNG Validation (supported reference subset, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
Expand Down Expand Up @@ -50,16 +50,17 @@ jobs:
-DBUILD_TESTS=OFF
cmake --build build --config Release

- name: Run full validation
- name: Run supported validation
shell: bash
run: |
SKIP="--skip michment_cont,test_sbml_flat,test_sbml_structured,Repressilator,SHP2_base_model,Motivating_example_cBNGL,blbr"
if [[ "${{ matrix.os }}" == *windows* ]]; then
BNG=build/cpp/bng_cpp.exe
else
BNG=build/cpp/bng_cpp
fi
python scripts/validate.py --bng-cpp "$BNG" $SKIP --verbose
python scripts/validate.py --bng-cpp "$BNG" --strict-references \
--skip-file tests/validation/reference_exclusions.json \
--skip-profile weekly --verbose

# ═══════════════════════════════════════════════════════════════════════════
# NFsim execution smoke test (not a statistical parity check)
Expand Down Expand Up @@ -211,7 +212,7 @@ jobs:

- name: Run cross-validation
run: |
set -e
set -euo pipefail
BNG_CPP=build/cpp/bng_cpp
BNG_PERL=legacy/perl/BNG2.pl
MODELS_DIR=tests/validation/Validate
Expand All @@ -223,16 +224,18 @@ jobs:

PASS=0
FAIL=0
SKIP=0
TOTAL=0

for bngl in "$MODELS_DIR"/*.bngl; do
model=$(basename "$bngl" .bngl)
TOTAL=$((TOTAL + 1))
tmpdir=$(mktemp -d)

# Run C++ engine
cp "$bngl" "$tmpdir/"
if ! timeout 30 "$BNG_CPP" "$tmpdir/$model.bngl" > /dev/null 2>&1; then
SKIP=$((SKIP + 1))
echo "FAIL $model: C++ execution failed"
FAIL=$((FAIL + 1))
rm -rf "$tmpdir"
continue
fi
Expand All @@ -242,7 +245,8 @@ jobs:
perl_tmpdir=$(mktemp -d)
cp "$bngl" "$perl_tmpdir/"
if ! timeout 60 perl "$BNG_PERL" "$perl_tmpdir/$model.bngl" > /dev/null 2>&1; then
SKIP=$((SKIP + 1))
echo "FAIL $model: Perl execution failed"
FAIL=$((FAIL + 1))
rm -rf "$tmpdir" "$perl_tmpdir"
continue
fi
Expand All @@ -260,7 +264,8 @@ jobs:
FAIL=$((FAIL + 1))
fi
else
SKIP=$((SKIP + 1))
echo "FAIL $model: one or both .net outputs are missing"
FAIL=$((FAIL + 1))
fi

rm -rf "$tmpdir" "$perl_tmpdir"
Expand All @@ -269,11 +274,11 @@ jobs:
{
echo "### C++ vs Perl Cross-Validation"
echo ""
echo "| Passed | Failed | Skipped |"
echo "| Total | Passed | Failed |"
echo "| ---: | ---: | ---: |"
echo "| $PASS | $FAIL | $SKIP |"
echo "| $TOTAL | $PASS | $FAIL |"
} | tee -a "$GITHUB_STEP_SUMMARY"

if [ "$PASS" -eq 0 ] || [ "$FAIL" -gt 0 ]; then
if [ "$TOTAL" -eq 0 ] || [ "$FAIL" -gt 0 ]; then
exit 1
fi
Loading
Loading