Release History#
All notable changes to BAM Engine are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Note
Pre-1.0 releases (0.x.x) may introduce breaking changes between minor versions.
[0.9.1] - 2026-03-19#
This patch adds a convenience log_level parameter to Simulation.init()
for simpler logging configuration.
Added#
log_levelkeyword argument onSimulation.init(): shorthand forlogging={"default_level": "..."}(e.g.,Simulation.init(seed=42, log_level="WARNING")).
[0.9.0] - 2026-03-19#
This release redesigns the results collection API with intuitive access patterns, automatic economy collection, and unaggregated data by default.
Added#
Results API
String-key access:
results["Producer.production"],results["Economy.inflation"].Attribute access:
results.Producer.production,results.Economy.inflation.results.get("Producer", "production", aggregate="mean")for on-demand aggregation, replacing the deprecatedget_array()method.results.available()lists all collected data fields.sim.collectables()lists what data can be collected before callingrun().
Changed#
Results Collection Defaults
sim.run()now returns results by default (collect=True).collect=Trueand list-formcollectnow produce unaggregated 2D arrays with shape(n_periods, n_agents)instead of mean-aggregated 1D arrays. Useresults.get(..., aggregate="mean")for the previous behavior.Economy metrics (average price, inflation, etc.) are always collected automatically when collection is active.
Deprecated#
SimulationResults.get_array()is deprecated in favor ofSimulationResults.get().
Removed#
Dead
unemp_rate_historyfield fromEconomy(was never updated after theCalcUnemploymentRateevent was removed in v0.5.0).
[0.8.0] - 2026-03-17#
This release extends the calibration toolkit with four new composable tools, recalibrates all validation targets from extracted book figure data, and redesigns buffer-stock validation around aggregate improvement over Growth+.
Added#
Calibration Tools
Four new composable CLI tools for multi-scenario calibration workflows: rescreen (second-pass Morris screening with locked parameters), cost (budget-aware cost classification), cross-eval (cross-scenario ranking with harmonic/geometric/min strategies), and sweep (multi-stage parameter sweep with carry-forward winners).
Changed#
Validation Targets
All three scenarios recalibrated from pixel-level extraction of book figures (see Validation Targets).
Buffer-Stock Validation
Replaced the duplicated 30-metric system with a focused two-layer approach: 8 unique buffer-stock metrics (wealth fits, Gini, MPC, dissaving) for per-seed validation, plus aggregate improvement over Growth+ assessed at stability level.
Calibrated Defaults
new_firm_price_markup: 1.15 → 1.20.
Fixed#
Division-by-zero in
score_outlier_penaltywhenmax_outlier_pct=0.Collapsed buffer-stock result incorrectly reporting
passed=True.
[0.7.0] - 2026-03-13#
This release replaces the v0.6.0 batch-sequential goods market with a pure sequential implementation.
Changed#
Sequential Goods Market
goods_market_roundnow processes consumers one at a time using a sequential Python-list loop, replacing the batch-sequential approach (~10 randomized consumer batches) from v0.6.0. Each consumer completes all shopping visits before the next consumer starts, eliminating many “phantom goods” overselling events per period caused by within-batch inventory collisions. See Goods Market: Sequential Shopping for design rationale.
Validation Metrics
price_ratio_floor(Growth+): changed from global minimum to 1st percentile, which filters transient demand surges at full employment while still catching genuine deflationary spirals; weight also lowered from 3.0 to 2.0.
Performance#
Sequential goods market is 6.5% faster than batch-sequential for full simulations.
goods_market_rounditself dropped 35%.
Removed#
n_batchesconfig parameter (only needed for batch-sequential goods market).
Development#
Seed-Stability Testing Overhaul
Seed stability tests upgraded from 20 to 100 seeds per scenario, with parallel execution via new
n_workersparameter.New
benchmarks/bench_seed_stability.py, a parallelized 1000-seed benchmark runner with JSON output, git-worktree support for historical commits, and CLI (--scenario,--seeds,--tags,--commits). Results committed tobenchmarks/results/.New
.github/workflows/validation-status.ymlreplacesvalidation.ymlandgrowth-plus-stability.yml; reads pre-computed JSON inbenchmarks/results/with zero simulation in CI.
[0.6.1] - 2026-03-10#
This patch eliminates the last Python loops in grouped random selection
(resolve_conflicts, firms_fire_excess_workers, firms_fire_workers)
by replacing per-group rng.choice/rng.permutation calls with a
vectorized random-priority + lexsort pattern.
Performance#
Vectorized
resolve_conflicts: replaced per-target Python loop +rng.choicewithrng.random()+np.lexsort+ grouped rank comparison. 3.4x faster (0.100s → 0.029s, 7.5% → 2.3% of runtime).Vectorized
firms_fire_excess_workers: replaced per-firmrng.permutationloop with_flatten_and_shuffle_groupshelper + rank threshold.Vectorized
firms_fire_workers: replaced per-firm cumsum loop with_flatten_and_shuffle_groups+grouped_cumsum+np.minimum.reduceat.New shared helper
_flatten_and_shuffle_groupsextracts items from ragged group boundaries into a flat shuffled array using random-priority lexsort.
[0.6.0] - 2026-03-09#
This release consolidates two parallel market matching implementations (sequential Python loops vs. vectorized NumPy batches) into a single vectorized implementation. Simulation behavior is preserved.
Changed#
Vectorized Market Matching
Labor market:
labor_market_roundreplacesworkers_send_one_round+firms_hire_workers. Batch conflict resolution viaresolve_conflicts()utility. Pipeline calls itmax_Mtimes (one round per call).Credit market:
credit_market_roundreplacesfirms_send_one_loan_app+banks_provide_loans. Firms sorted byprojected_fragility(ascending leverage) within each target bank;grouped_cumsum()tracks per-bank supply exhaustion. Pipeline calls itmax_Htimes.Goods market:
goods_market_roundreplacesconsumers_shop_sequential. Uses batch-sequential processing (~10 randomized consumer batches, each completing all Z visits before the next starts). Pipeline calls it once (handles visits internally). See Goods Market: Sequential Shopping for design rationale.
Performance#
Vectorized batch matching yields ~30% faster full simulation runs across all economy sizes. See ASV benchmarks.
Removed#
Sequential event classes:
WorkersSendOneRound,FirmsHireWorkers,FirmsSendOneLoanApp,BanksProvideLoans,ConsumersShopSequential.Interleave syntax (``<->``) from pipeline YAML. Only
event x Nrepetition remains.
[0.5.1] - 2026-03-04#
Performance#
Vectorized
workers_decide_firms_to_apply: replaced three Python for-loops (per-workerrng.choice(), per-loyal-worker move-to-front, per-worker buffer write) with batch NumPy operations (random priorities +argpartition, vectorized loyalty shift, slice assignment). ~3.5x faster event execution.
[0.5.0] - 2026-03-04#
Added#
Extension Bundles
Extensiondataclass: bundles roles, events, relationships, and config into a single object.use(): one-call extension activation (replaces the manualuse_role/use_events/use_configpattern).Pre-built bundles:
RND,BUFFER_STOCK,TAXATIONin their respectiveextensions.*packages.Collect-config dicts:
BASELINE_COLLECT,RND_COLLECT,BUFFER_STOCK_COLLECT, suggested data-collection configs forsim.run(collect=...).
Documentation
Extended User Guide to guide user through simulations, configuration, custom data collection, custom roles/events/relationships, pipelines, operations, extensions, validation, calibration, and best practices.
New pages: Related Projects, Roadmap, Glossary, About.
Removed#
Deprecated config parameters:
price_cut_allow_increase,inflation_method,labor_matching,credit_matching,min_wage_ratchet,pricing_phase,matching_method. Behavior is now hardcoded to the previously active defaults.Deprecated event classes:
WorkersApplyToFirms,WorkersApplyToBestFirm,FirmsApplyForLoans,CalcUnemploymentRate,ConsumersShopOneRound,FirmsCalcBreakevenPrice,FirmsAdjustPrice.Deprecated internal functions: cascade matching (labor and credit), simultaneous matching, annualized inflation, ratchet minimum wage, production-phase pricing, round-robin shopping.
Fixed#
Calibration modules now fall back to serial execution when
n_workers=1, fixing aProcessPoolExecutorspawn crash on macOS.
[0.4.0] - 2026-02-25#
This release adds the robustness analysis package (Section 3.10 of Delli Gatti et al., 2011), overhauls the calibration package, re-calibrates defaults, and fixes several issues in internal event logic.
Added#
Robustness Analysis
validation/robustness/package implementing Sections 3.10.1–3.10.2:Exploration of the parameter space (Section 3.10.1)
Internal validity: 20-seed stability of co-movements, AR structure, firm size distributions, and empirical curves (HP filter, cross-correlations, AR fitting, impulse-response).
Sensitivity analysis: univariate sweeps across credit (H), goods (Z), labor (M), contract length (theta), and economy size.
Preferential attachment in consumption and the entry mechanism (Section 3.10.2)
Preferential attachment: New experiment (
run_pa_experiment) that removes PA by setting new config parameterconsumer_matching:loyalty→random.Entry mechanism: New experiment (
run_entry_experiment) that uses the new taxation extension (extensions/taxation/).
CLI:
python -m validation.robustness --helpExample:
examples/extensions/example_robustness.py
Packaging
extensions/,validation/,calibration/are now pip-installable sibling packages (pip install bamengine[validation], etc.).
Fixed#
New
FirmsPlanBreakevenPrice/FirmsPlanPriceevents (mutually exclusive with production-phase pair). Source relocation:events/planning.py→events/production.py(pipeline keys unchanged).Loan records retained through planning/labor phases (purged at credit market opening) for previous-period interest access.
projected_fragilitypre-filled withmax_leveragefor NW ≤ 0 firms.Loan rate now uses per-bank
opex_shock(φ_k) instead of constanth_phiupper bound, restoring bank heterogeneity (book eq. 3.7).Multi-lender: firms accumulate loans from multiple banks across credit rounds.
LoanBook.principal_per_borrower()new method for efficient per-firm principal aggregation.Removed spurious
wage_billrecalculation inworkers_update_contracts(overstated gross profit).Bad debt:
clip(frac × NW, 0, principal)computes recovery, was subtracted as loss. Nowloss = principal - recovery.R&D deduction moved before dividends (book Section 3.8); operates on
net_profitso dividends = δ(1−σ)π.net_worth_ratioformula:prod × ratio→prod × price × ratio(dimensional fix).Bankruptcy counters persist through end-of-period data capture.
Spawned firms set
production = production_prev(prevents re-bankruptcy).
Changed#
Validation
Unemployment metrics restructured:
unemployment_pct_in_bounds→ separate floor/ceiling checks;unemployment_hard_ceiling→unemployment_absolute_ceiling(30% → 20%, BOOLEAN in baseline). Removedunemployment_autocorrelation.
Calibration
Rebuilt into focused modules (
analysis,grid,screening,stability,io,reporting), replacing monolithicoptimizer.py.Morris Method screening (default): multi-trajectory OAT (Morris 1991) with dual-threshold classification (mu* and sigma). OAT via
--method oat.Tiered stability: incremental tournament (100×10 → 50×20 → 10×100 seeds).
Pairwise interaction analysis for synergy/conflict detection.
Phase-based CLI (
--phase,--resume,--rank-by,--grid,--fixed), markdown reports, config export, before/after comparison.
Breaking Changes
Calibrated defaults: n_firms 300→100, n_households 3000→500, New-firm entry: size 0.8→0.5, production 0.9→0.5, wage 0.9→0.5, markup 1.0→1.5,
job_search_method:"vacancies_only"→"all_firms",matching_method:"simultaneous"→"sequential"(also removed from config)Config removed:
contract_poisson_mean,loan_priority_method,firing_method,matching_methodConfig deprecated:
price_cut_allow_increase,inflation_methodNet worth:
net_worth_ratiosemantics → “multiple of initial revenue”; default 3.0 → 6.0Renamed:
destroyed→collapsedonSimulationCalibration CLI:
--phasereplaces--sensitivity-only; new--resume,--rank-by,--k-factor,--output-dir
[0.3.0] - 2026-02-11#
This release adds the buffer-stock consumption extension (Section 3.9.4 of
Delli Gatti et al., 2011), completing all three BAM scenarios from the book,
and introduces a composable extension API (use_events, use_config,
use_role with n_agents) that replaces the global hook registry.
Added#
Consumption & Buffer-stock Extension
Consumption & buffer-stock extension (Chapter 3.9.4 of Delli Gatti et al., 2011):
extensions/buffer_stock/package withBufferStockrole and replacement eventsIndividual adaptive MPC based on buffer-stock saving theory (Eq. 3.20)
Validation scenario with ~30 metrics: wealth CCDF fitting (Singh-Maddala, Dagum, GB2), Gini coefficient, MPC distribution, baseline macro dynamics
8-panel visualization with CCDF plot (Figure 3.8 replica)
Example:
examples/extensions/example_buffer_stock.py
Shareholderrole: built-in household role tracking per-period dividends, used to adjust buffer-stock MPC metrics for the dividend artifact
Composable Extension API
Simulation.use_config(config): apply extension default configuration with “don’t overwrite” semantics (user kwargs and earlieruse_config()calls take precedence)Simulation.use_events(*event_classes): explicitly apply pipeline hooks from event classesSimulation.use_role(cls, n_agents=N):n_agentsparameter for non-firm rolesPipeline.apply_hooks(*event_classes): read hook metadata from classes and apply to pipeline
Changed#
Breaking
@event(after=..., before=..., replace=...)now stores hook metadata as class attributes instead of writing to a global dict. Hooks are applied explicitly viasim.use_events(). Removed_EVENT_HOOKSglobal dict,register_event_hook(),get_event_hooks(), and theapply_hooksparameter fromPipeline.from_yaml()/Pipeline.from_event_list().Default
aggregatefor dict-formcollectchanged from"mean"toNone. Callers usingcollect={...}without an"aggregate"key now get full per-agent data. Add"aggregate": "mean"explicitly for the previous behavior.collect=Trueand list-formcollectare unchanged (still aggregate with mean).
Scenario Validation
Weight-based fail escalation for validation status checks: high-weight metrics fail more easily, low-weight metrics are more lenient. New
escalationparameter on status check functions. This also resolves the growth+ seed stability test failures in v0.2.2 by widening the WARN zone for lower-weight metrics.Validation scenarios restructured into self-contained directory packages (
validation/scenarios/{baseline,growth_plus,buffer_stock}/), each co-locating code, visualization, targets, and output.Scenario.targets_filerenamed toScenario.targets_path: Path; newSCENARIO_REGISTRYdict andget_scenario()lookup function.Widened some validation targets to reduce false negatives from seed sensitivity
[0.2.2] - 2026-02-09#
This release completes the Growth+ scenario (Section 3.9.2 of Delli Gatti et al., 2011), bringing its validation metrics, financial dynamics analysis, and visualizations in line with the book, and re-calibrates model defaults accordingly.
Added#
Growth+ financial dynamics metrics: Minsky classification, recession detection, GDP cyclicality correlations, Laplace tent-shape R², CV-based dispersion checks
max_leverageandinflation_methodconfiguration parametersRelationship data collection in
SimulationResults; newn_firm_bankruptcies,n_bank_bankruptcieseconomy metricsextensions/rnd/standalone package (R&D extension extracted from validation)
Changed#
Breaking
Re-calibrated defaults:
new_firm_size_factor0.9→0.8,max_loan_to_net_worth100→2,max_leverageuncapped→10,matching_method“sequential”→”simultaneous”; removedcap_factorandfragility_cap_methodRestructured validation package:
validation.core/runners/metrics→validation.types/scoring/engineCalcAnnualInflationRate→CalcInflationRate(pipeline key:calc_inflation_rate)R&D import path:
from extensions.rnd import RnD(was in validation package)
Events Pipeline
firms_calc_breakeven_priceandfirms_adjust_priceevents moved to production phase (beforefirms_run_production)
Known Issues#
Growth+ seed stability test failures are a calibration issue and will be addressed in a future release. The baseline scenario passes the stability test at 100%.
[0.2.1] - 2026-01-21#
This patch release simplifies examples and reorganizes the validation package for better maintainability.
Changed#
Validation Package
Restructured validation package into subpackages:
validation/metrics/- metric computation from simulation results (baseline.py,growth_plus.py)validation/scenarios/- detailed visualizations with target boundsvalidation/targets/- YAML target definitions (unchanged)
Moved RnD role and events to
validation/scenarios/growth_plus_extension.py
Examples Simplification
Simplified
example_baseline_scenario.pyandexample_growth_plus.pyto be self-containedExamples focus on teaching core BAM Engine concepts; users are directed to validation package for detailed analysis with bounds
Fixed#
Fixed Sphinx Gallery compatibility by handling missing
__file__in exec() environment
[0.2.0] - 2026-01-20#
This is a major release introducing validation and calibration frameworks, significant performance improvements, and API enhancements for model extensibility.
Added#
Validation Package (validation/)
Complete acceptance testing framework against empirical targets from Delli Gatti et al. (2011)
Two validation scenarios: Baseline (Section 3.9.1) and Growth+ (Section 3.8)
Core API:
run_validation(),run_stability_test(),run_growth_plus_validation()Scoring system with
ValidationScore,StabilityResult,MetricResulttypesYAML target definitions (
validation/targets/) with inline documentationMulti-seed stability testing for calibration workflows
Reporting functions:
print_validation_report(),print_stability_report()
Calibration Package (calibration/)
Parameter optimization framework with four-phase calibration process:
One-at-a-time (OAT) sensitivity analysis to identify impactful parameters
Focused grid building with HIGH/MEDIUM/LOW sensitivity categorization
Grid search screening using single seed
Multi-seed stability testing for top candidates
CLI interface:
python -m calibration --scenario baseline --workers 10Programmatic API:
run_sensitivity_analysis(),build_focused_grid(),run_focused_calibration()Parallel execution with
ProcessPoolExecutorfor speedSupports both baseline and growth_plus scenarios
Event Pipeline Hooks
New
@eventdecorator parameters for automatic pipeline positioning:after="event_name"- insert after specified eventbefore="event_name"- insert before specified eventreplace="event_name"- replace specified event
Enables clean model extensions without manual
insert_after()callsExample usage:
@event(after="firms_pay_dividends") class MyCustomEvent: def execute(self, sim): ... # Automatically positioned in pipeline
Data Collection Enhancements
Timed capture system: capture data after specific events via
capture_after="event_name"Pipeline callback registration:
pipeline.register_after_event(event_name, callback)New
SimulationResults.get_array()method for convenient data access:results.get_array("Producer", "price", aggregate="mean")
New
SimulationResults.dataproperty for unified role + economy accessSupport for Economy as pseudo-role in data access
Configuration Parameters
New ratio-based initialization parameters:
min_wage_ratio- minimum wage relative to mean wagenet_worth_ratio- net worth relative to production levellabor_productivity- goods produced per worker
New firm entry parameters:
new_firm_size_factor,new_firm_production_factor,new_firm_wage_factor,new_firm_price_markupNew implementation variant parameters:
loan_priority_method- bank ranking: “by_leverage” | “by_net_worth” | “by_appearance”firing_method- worker selection: “random” | “expensive”matching_method- labor market: “sequential” | “simultaneous”job_search_method- sampling: “vacancies_only” | “all_firms”
New credit constraint parameters:
max_loan_to_net_worth,max_leverage
Operations Module
ops.exp()- exponential function for growth modelsops.array()- create array copies (vsasarray()which doesn’t copy)
Benchmarking
Seven comprehensive ASV benchmark suites: SimulationSuite, PipelineSuite, MemorySuite, CriticalEventSuite, InitSuite, LoanBookSuite, ScalingSuite
Quick pytest-benchmark suite for fast local feedback
Baseline comparison functionality for performance regression detection
CI/CD
Dedicated validation workflow (
.github/workflows/validation.yml)New pytest marker
@pytest.mark.validationfor acceptance tests
Examples
Growth+ extension example (850+ lines) demonstrating R&D-driven productivity growth, pipeline hooks, and extension parameters
Enhanced baseline example (600+ lines) with full validation integration and 8-panel visualization
Changed#
Breaking: Configuration System
Replaced absolute initialization values with ratio-based parameters:
min_wage→min_wage_rationet_worth_init→net_worth_ratioproduction_initremoved (calculated fromlabor_productivity)wage_offer_initremoved (calculated from balance sheets)
Default agent counts changed:
n_firms: 100 → 300,n_households: 500 → 3000Default dividend rate changed:
delta: 0.40 → 0.10Default bank capital ratio changed:
v: 0.06 → 0.10
Breaking: Results API
results.economyrenamed toresults.economy_dataData collection now requires explicit
collect=Trueparameter inrun()
Event System
Renamed
FirmsCalcCreditMetrics→FirmsCalcFinancialFragilityfor clarityReordered price events: breakeven calculation → price adjustment → production → average price update
Performance
Optimized logging with per-event enabled/disabled flags (~75-80% faster event execution)
Vectorized firm selection in labor and goods markets
Optimized hot loops in goods and labor market events
Overall throughput improved 50-80% compared to v0.1.2
Small (100 firms): ~500 periods/s
Medium (200 firms): ~240 periods/s
Large (500 firms): ~77 periods/s
Testing
Achieved ~100% test coverage with targeted tests and pragma markers
Added comprehensive tests for edge cases, error paths, and event hooks
Documentation
New
validation/README.mdandcalibration/README.mdpackage documentationExpanded
docs/development.rstwith validation and calibration workflowsUpdated
docs/user_guide/data_collection.rstwith timed capture examplesUpdated
docs/user_guide/pipelines.rstwith pipeline hooks documentation
Dependencies
Added
scipy>=1.11for validation metrics (skewness, percentiles)Added
pandas-stubs>=2.0for mypy type checking
Fixed#
Labor Market
Fixed worker wages not updating when minimum wage increases
Fixed excess labor firing event placement in pipeline
Fixed labor market worker shuffling for proper sequential matching
Goods Market
Fixed loyalty and preferential attachment behavior in consumer firm selection
Fixed price event ordering to use projected output for breakeven price calculation
Fixed average market price update to account for current period’s actual production
Core
Fixed bank equity test for total market collapse scenarios
[0.1.2] - 2025-12-05#
Added#
Documentation: New section for API reference, Examples, Performance & Profiling, available on Read the Docs
Examples: Basic and advanced examples using Sphinx Gallery format
Benchmarking: ASV benchmarking workflow with GitHub Pages deployment
CI/CD: sp-repo-review compliance for Scientific Python standards
CI/CD: pre-commit.ci and Dependabot integration
Changed#
Replaced black formatter with ruff-format
Refactored all examples to use
bam.opsinstead of raw NumPy operationsImproved docstrings throughout codebase for Sphinx compatibility
[0.1.1] - 2024-11-14#
Added#
CI/CD: GitHub Actions workflows for automated testing and PyPI publishing
Cross-platform testing on Ubuntu, macOS, and Windows
Multi-version testing for Python 3.11, 3.12, 3.13
Automated PyPI publishing on GitHub releases
Changed#
Breaking: Dropped Python 3.10 support. Minimum required Python version is now 3.11+
Python 3.10 had complex metaclass compatibility issues in decorators that are not worth maintaining
Supported versions: Python 3.11, 3.12, 3.13
Fixed#
Windows compatibility in test suite (file handle management, path separators)
[0.1.0] - 2025-11-13#
This release is feature-complete for the core BAM model but APIs may change in future releases. Designed for academic research and policy analysis experiments.
Added#
Core ECS Architecture
Role (Component): Dataclasses with NumPy arrays for agent state, auto-registration via
__init_subclass__Event (System): Pure functions wrapped in Event classes, YAML-configurable pipeline execution
Relationship: Many-to-many connections with COO sparse format (e.g., LoanBook for loans)
Registry: Global auto-registration for roles, events, and relationships
Pipeline: YAML-based event ordering with special syntax (repeat, interleave, parameter substitution)
Simulation engine:
Simulationclass managing agents, roles, relationships, and event execution
User-Facing API
Simplified definitions:
@role,@event,@relationshipdecorators for easy creation of componentsType aliases:
Float,Int,Bool,AgentIdfor bam-engine type hintsOperations module: 30+ operations (
ops.add,ops.divide, etc.) that wrap NumPy operations with safe handlingRead methods:
sim.get_role(),sim.get_event(),sim.get_relationship()with case-insensitive lookup
BAM Model Implementation
3 agent populations: Firms, Households, Banks
6 agent roles: Producer, Employer, Borrower, Worker, Consumer, Lender
8 event modules: Planning, labor/credit/goods markets, production, revenue, bankruptcy, economy stats (43 total events)
Configuration & Validation
Three-tier configuration: Package defaults → User YAML → Keyword arguments
Centralized validation: Type checking, range validation, relationship constraints
Custom pipeline support: Load custom event sequences via
pipeline_pathparameterLogging configuration: Global and per-event log levels (DEBUG, INFO, WARNING, ERROR, TRACE)
Performance & Testing
Vectorized Operations: NumPy-based computations for efficient large-scale simulations
Sparse Relationships: COO sparse matrix format for memory-efficient relationship storage
Benchmarking: 172 periods/s (small), 96 periods/s (medium), 40 periods/s (large) - 4-9x faster than targets
Testing: Unit tests, integration tests, property-based tests, performance regression tests, covering >99% of codebase
Deterministic RNG: Reproducible simulations with seed control
See the GitHub Releases for complete release history.