Note
Go to the end to download the full example code.
ISI and CV Analysis with Optimized Descending Drive#
This example demonstrates spike train analysis using optimized descending drive parameters from previous optimization studies. It extracts inter-spike interval (ISI) and coefficient of variation (CV) statistics during realistic trapezoidal contraction patterns.
Note
Analysis workflow:
Load optimized DD parameters from baseline or force-specific optimization
Generate trapezoidal drive pattern (ramp-up, plateau, ramp-down)
Simulate motor neuron spike trains with optimized network
Extract ISI/CV statistics during plateau phase
Visualize firing patterns and instantaneous discharge rates
Important
Prerequisites: This example requires results from previous optimizations:
Baseline mode: Run
00_optimize_dd_for_target_firing_rate.pyfirstForce mode: Run
02_optimize_dd_for_target_force.pyfor specific MVC levelLoads network structure and drive parameters from saved results
Trapezoidal Contraction: Simulates realistic voluntary isometric contractions with:
Ramp-up phase: Linear increase from rest to target force (1 second)
Plateau phase: Sustained contraction at target level (2 seconds)
Ramp-down phase: Linear decrease back to rest (1 second)
Rest periods: Baseline activity before and after contraction (1 second each)
ISI/CV Metrics: Quantify firing variability and regularity for motor control studies.
Import Libraries#
import os
os.environ["MPLBACKEND"] = "Agg"
if "DISPLAY" in os.environ:
del os.environ["DISPLAY"]
import itertools
import json
import warnings
from pathlib import Path
import elephant
import joblib
import numpy as np
import quantities as pq
from matplotlib import pyplot as plt
from neo import AnalogSignal, Block, Segment, SpikeTrain
from neuron import h
from tqdm import tqdm
from myogen import set_random_seed
from myogen.simulator import RecruitmentThresholds
from myogen.simulator.neuron import Network
from myogen.simulator.neuron.populations import AlphaMN__Pool, DescendingDrive__Pool
from myogen.utils.helper import calculate_firing_rate_statistics
from myogen.utils.nmodl import load_nmodl_mechanisms
warnings.filterwarnings("ignore")
plt.style.use("fivethirtyeight")
Configuration#
Set analysis parameters and specify which optimization results to load.
# Random seed for reproducibility
set_random_seed(42)
# Study parameters
MUSCLE_TYPE = "TEST" # Muscle identifier
MVC_LEVEL = 30 # MVC percentage (used for file naming)
STUDY_PREFIX = "TEST_" # Prefix for output files
# Optimization mode selection
USE_BASELINE_OPTIMIZATION = True # True = baseline FR optimization, False = force optimization
TARGET_FORCE_PCT = 30 # Force level if using force optimization
# Simulation parameters
TIMESTEP__ms = 0.1
N_MOTOR_UNITS = 100
# Trapezoidal contraction timing
RAMP_UP_DURATION__ms = 1000 # 1 second ramp-up
PLATEAU_DURATION__ms = 2000 # 2 second plateau
RAMP_DOWN_DURATION__ms = 1000 # 1 second ramp-down
REST_BEFORE__ms = 1000 # 1 second rest before
REST_AFTER__ms = 1000 # 1 second rest after
# Directories - use project root to share across examples
# Handle both manual execution and Sphinx Gallery (where __file__ is not defined)
try:
_script_dir = Path(__file__).parent
except NameError:
_script_dir = Path.cwd()
RESULTS_DIR = _script_dir.parent.parent / "results"
RESULTS_DIR.mkdir(exist_ok=True, parents=True)
Random seed set to 42.
Load Optimized DD Parameters#
Load network parameters from previous optimization studies.
print(f"\n{'=' * 80}")
print("LOADING OPTIMIZED DD PARAMETERS")
print(f"{'=' * 80}\n")
if USE_BASELINE_OPTIMIZATION:
# Load from baseline firing rate optimization
OPTIMIZATION_RESULTS_DIR = _script_dir.parent.parent / "results" / "dd_optimization"
PARAMS_FILE = OPTIMIZATION_RESULTS_DIR / "dd_optimized_params.json" # No prefix for baseline
print("Loading from BASELINE firing rate optimization...")
# Fallback to static example data if dynamic results don't exist
STATIC_DATA_DIR = _script_dir.parent / "data" / "dd_optimization"
STATIC_PARAMS_FILE = STATIC_DATA_DIR / "dd_optimized_params.json"
if PARAMS_FILE.exists():
print(f" ✓ Using dynamic results from: {PARAMS_FILE.relative_to(_script_dir.parent.parent)}")
elif STATIC_PARAMS_FILE.exists():
print(f" ✓ Using static example data from: {STATIC_PARAMS_FILE.relative_to(_script_dir.parent.parent)}")
PARAMS_FILE = STATIC_PARAMS_FILE
else:
raise FileNotFoundError(
f"Baseline optimization results not found.\n"
f" Tried: {PARAMS_FILE}\n"
f" Tried: {STATIC_PARAMS_FILE}\n"
"Please run optimize_dd_for_target_firing_rate.py first or check examples/data/"
)
with open(PARAMS_FILE, "r") as f:
optimization_results = json.load(f)
# Extract DD parameters from best firing rate match
dd_params = optimization_results["best_trial"]
source_description = "baseline FR optimization"
else:
# Load from force-specific optimization
OPTIMIZATION_RESULTS_DIR = _script_dir.parent.parent / "results" / "force_optimization"
# List available force optimization files
if OPTIMIZATION_RESULTS_DIR.exists():
available_files = sorted(
OPTIMIZATION_RESULTS_DIR.glob(f"{STUDY_PREFIX}dd_optimized_params_force_*pct.json")
)
if available_files:
print("Available force optimization results:")
for i, file in enumerate(available_files):
# Extract percentage from filename
pct = file.stem.split("_")[-1].replace("pct", "")
print(f" {i + 1}. {pct}% MVC - {file.name}")
print()
PARAMS_FILE = (
OPTIMIZATION_RESULTS_DIR
/ f"{STUDY_PREFIX}dd_optimized_params_force_{int(TARGET_FORCE_PCT)}pct.json"
)
print(f"Loading from FORCE-SPECIFIC optimization ({TARGET_FORCE_PCT}% MVC)...")
if not PARAMS_FILE.exists():
raise FileNotFoundError(
f"Force optimization results not found at {PARAMS_FILE}.\n"
f"Please run: python optimize_dd_for_target_force.py --target-force-pct {TARGET_FORCE_PCT}"
)
with open(PARAMS_FILE, "r") as f:
optimization_results = json.load(f)
# Extract DD parameters from force optimization results
dd_params = optimization_results["dd_parameters"]
source_description = f"{TARGET_FORCE_PCT}% MVC force optimization"
# Extract common DD parameters
N_DD_NEURONS = dd_params["dd_neurons"]
DD_CONNECTION_PROBABILITY = dd_params["conn_probability"]
DD_PEAK__Hz = dd_params["dd_drive__Hz"]
DD_SHAPE_PARAMETER = dd_params["gamma_shape"]
DD_SYNAPTIC_WEIGHT = dd_params.get("synaptic_weight", 0.05)
# Load Gfluctdv settings if present
GFLUCTDV_ENABLED = optimization_results.get("gfluctdv_enabled", False)
GFLUCTDV_NOISE_AMPLITUDE = dd_params.get("gfluctdv_noise_amplitude", None)
print(f"\n(OK) Loaded from: {source_description}")
print(f" Source file: {PARAMS_FILE.name}")
print("\nOptimized DD parameters:")
print(f"\tDD neurons: {N_DD_NEURONS}")
print(f"\tConn probability: {DD_CONNECTION_PROBABILITY:.3f}")
print(f"\tSynaptic weight: {DD_SYNAPTIC_WEIGHT:.4f} uS")
print(f"\tDD drive level: {DD_PEAK__Hz:.2f} Hz")
print(f"\tGamma shape: {DD_SHAPE_PARAMETER:.2f} (CV={1 / DD_SHAPE_PARAMETER**0.5:.3f})")
if GFLUCTDV_ENABLED:
print(f"\tGfluctdv: ENABLED (noise={GFLUCTDV_NOISE_AMPLITUDE:.2e} S/cm²)")
================================================================================
LOADING OPTIMIZED DD PARAMETERS
================================================================================
Loading from BASELINE firing rate optimization...
✓ Using dynamic results from: results/dd_optimization/dd_optimized_params.json
(OK) Loaded from: baseline FR optimization
Source file: dd_optimized_params.json
Optimized DD parameters:
DD neurons: 379
Conn probability: 0.841
Synaptic weight: 0.0500 uS
DD drive level: 19.43 Hz
Gamma shape: 3.00 (CV=0.577)
Initialize NEURON and Create Motor Neuron Pool#
Setup NEURON simulator and create the motor neuron population.
load_nmodl_mechanisms()
h.secondorder = 2 # Crank-Nicolson integration
recruitment_thresholds, _ = RecruitmentThresholds(
N=N_MOTOR_UNITS,
recruitment_range__ratio=100,
deluca__slope=5,
konstantin__max_threshold__ratio=1.0,
mode="combined",
)
motor_neuron_pool = AlphaMN__Pool(
recruitment_thresholds__array=recruitment_thresholds,
config_file="alpha_mn_default.yaml",
)
# Apply Gfluctdv if it was enabled during optimization
if GFLUCTDV_ENABLED and GFLUCTDV_NOISE_AMPLITUDE is not None:
print("\nApplying Gfluctdv to motor neurons (matching DD optimization)...")
print(f"\tNoise amplitude: {GFLUCTDV_NOISE_AMPLITUDE:.2e} S/cm²")
for cell in motor_neuron_pool:
cell.insert_Gfluctdv()
for d in cell.dend:
d.std_e_Gfluctdv = GFLUCTDV_NOISE_AMPLITUDE
d.std_i_Gfluctdv = GFLUCTDV_NOISE_AMPLITUDE
else:
print("\nGfluctdv NOT enabled (following DD optimization settings)")
# Create descending drive pool with optimized parameters
descending_drive_pool = DescendingDrive__Pool(
n=N_DD_NEURONS,
timestep__ms=TIMESTEP__ms * pq.ms,
process_type="gamma",
shape=DD_SHAPE_PARAMETER,
)
Gfluctdv NOT enabled (following DD optimization settings)
Generate Trapezoidal Drive Pattern#
Create a trapezoidal ramp contraction pattern that represents realistic voluntary isometric contractions. This pattern has 4 phases: 1. Ramp-up: Linear increase from baseline to peak 2. Plateau: Sustained peak drive level 3. Ramp-down: Linear decrease from peak to baseline 4. Rest: Baseline activity
This is a common experimental paradigm used in motor control studies.
# Calculate total simulation time
simulation_time = (
REST_BEFORE__ms
+ RAMP_UP_DURATION__ms
+ PLATEAU_DURATION__ms
+ RAMP_DOWN_DURATION__ms
+ REST_AFTER__ms
)
time_points = int(simulation_time / TIMESTEP__ms)
# Drive parameters
dd_baseline__Hz = 0.0 # Baseline drive during rest
dd_peak__Hz = DD_PEAK__Hz # Peak drive from optimization
# Calculate phase boundaries
trapezoid_start = REST_BEFORE__ms
ramp_up_end = trapezoid_start + RAMP_UP_DURATION__ms
plateau_end = ramp_up_end + PLATEAU_DURATION__ms
ramp_down_end = plateau_end + RAMP_DOWN_DURATION__ms
# Create time array
time_array = np.linspace(0, simulation_time, time_points)
# Initialize drive signal (all baseline)
trapezoid_drive = np.ones(time_points) * dd_baseline__Hz
for i, t in enumerate(time_array):
if t < trapezoid_start:
# Phase 0: Rest before
trapezoid_drive[i] = dd_baseline__Hz
elif t < ramp_up_end:
# Phase 1: Ramp up
elapsed = t - trapezoid_start
trapezoid_drive[i] = dd_baseline__Hz + (dd_peak__Hz - dd_baseline__Hz) * (
elapsed / RAMP_UP_DURATION__ms
)
elif t < plateau_end:
# Phase 2: Plateau
trapezoid_drive[i] = dd_peak__Hz
elif t < ramp_down_end:
# Phase 3: Ramp down
elapsed = t - plateau_end
trapezoid_drive[i] = dd_peak__Hz - (dd_peak__Hz - dd_baseline__Hz) * (
elapsed / RAMP_DOWN_DURATION__ms
)
else:
# Phase 4: Rest after
trapezoid_drive[i] = dd_baseline__Hz
# Create AnalogSignal for drive pattern
trapezoid_drive__signal = AnalogSignal(
signal=trapezoid_drive,
units=pq.Hz,
sampling_period=(TIMESTEP__ms * pq.ms).rescale(pq.s),
)
joblib.dump(trapezoid_drive__signal, RESULTS_DIR / f"{STUDY_PREFIX}trapezoid_drive_pattern.pkl")
print(f"\nTrapezoidal drive pattern (using optimized DD drive of {dd_peak__Hz:.2f} Hz):")
print(f"\tRest before: 0 - {trapezoid_start} ms ({dd_baseline__Hz} Hz)")
print(f"\tRamp up: {trapezoid_start} - {ramp_up_end} ms ({dd_baseline__Hz} → {dd_peak__Hz:.2f} Hz)")
print(
f"\tPlateau: {ramp_up_end} - {plateau_end} ms ({dd_peak__Hz:.2f} Hz, center at {(ramp_up_end + plateau_end) / 2:.0f}ms)"
)
print(f"\tRamp down: {plateau_end} - {ramp_down_end} ms ({dd_peak__Hz:.2f} → {dd_baseline__Hz} Hz)")
print(f"\tRest after: {ramp_down_end} - {simulation_time} ms ({dd_baseline__Hz} Hz)")
print("\nUsing optimized DD parameters:")
print(f"\tGamma shape: {DD_SHAPE_PARAMETER:.2f} (CV={1 / DD_SHAPE_PARAMETER**0.5:.3f})")
print(f"\tConnection probability: {DD_CONNECTION_PROBABILITY:.3f}")
Trapezoidal drive pattern (using optimized DD drive of 19.43 Hz):
Rest before: 0 - 1000 ms (0.0 Hz)
Ramp up: 1000 - 2000 ms (0.0 → 19.43 Hz)
Plateau: 2000 - 4000 ms (19.43 Hz, center at 3000ms)
Ramp down: 4000 - 5000 ms (19.43 → 0.0 Hz)
Rest after: 5000 - 6000 ms (0.0 Hz)
Using optimized DD parameters:
Gamma shape: 3.00 (CV=0.577)
Connection probability: 0.841
Build Network and Connect Populations#
Create synaptic connections using optimized parameters.
network = Network({"DD": descending_drive_pool, "aMN": motor_neuron_pool})
# Connect DD neurons to motor neurons with optimized synaptic parameters
network.connect(
source="DD",
target="aMN",
probability=DD_CONNECTION_PROBABILITY,
weight__uS=DD_SYNAPTIC_WEIGHT * pq.uS,
)
# Set up external input to DD population
network.connect_from_external(source="cortical_input", target="DD", weight__uS=1.0 * pq.uS)
# Get NetCons for manual DD stimulation
dd_netcons = network.get_netcons("cortical_input", "DD")
Setup Spike Recording#
To record spikes, we need to manually set up spike detection for the motor neurons and track spike times for the DD neurons.
# Manual spike tracking for DD neurons (they use Poisson processes)
dd_spike_times = [[] for _ in range(len(descending_drive_pool))]
# Record spikes from motor neurons
mn_spike_recorders = []
for cell in motor_neuron_pool:
spike_recorder = h.Vector()
nc = h.NetCon(cell.soma(0.5)._ref_v, None, sec=cell.soma)
nc.threshold = 50 # Standard threshold for motor neurons
nc.record(spike_recorder)
mn_spike_recorders.append(spike_recorder)
Run Simulation#
Execute the NEURON simulation with trapezoidal drive pattern.
h.load_file("stdrun.hoc")
h.dt = TIMESTEP__ms
h.tstop = simulation_time
# Initialize voltages for all pools
for section, voltage in itertools.chain.from_iterable(
zip(*pool.get_initialization_data()) for pool in [motor_neuron_pool, descending_drive_pool]
):
section.v = voltage
h.finitialize()
step_counter = 0
with tqdm(
total=simulation_time,
desc="Running simulation",
unit="ms",
bar_format="{l_bar}{bar}| {n:.2f}/{total:.2f} ms [{elapsed}<{remaining}, {rate_fmt}]",
) as pbar:
while h.t < h.tstop:
current_drive = trapezoid_drive__signal[min(step_counter, len(trapezoid_drive__signal) - 1)]
# Drive DD neurons with current input level
for dd_cell in descending_drive_pool:
if dd_cell.integrate(current_drive):
spike_time = h.t + 1
dd_spike_times[dd_cell.pool__ID].append(spike_time)
if spike_time < h.tstop:
dd_netcons[dd_cell.pool__ID].event(spike_time)
h.fadvance()
step_counter += 1
pbar.update(TIMESTEP__ms)
Running simulation: 0%| | 0.00/6000.00 ms [00:00<?, ?ms/s]
Running simulation: 0%| | 13.10/6000.00 ms [00:00<00:45, 130.67ms/s]
Running simulation: 0%| | 26.20/6000.00 ms [00:00<00:46, 129.41ms/s]
Running simulation: 1%| | 39.20/6000.00 ms [00:00<00:46, 129.34ms/s]
Running simulation: 1%| | 52.20/6000.00 ms [00:00<00:45, 129.56ms/s]
Running simulation: 1%| | 65.30/6000.00 ms [00:00<00:45, 129.89ms/s]
Running simulation: 1%|▏ | 78.30/6000.00 ms [00:00<00:45, 129.87ms/s]
Running simulation: 2%|▏ | 91.30/6000.00 ms [00:00<00:45, 129.80ms/s]
Running simulation: 2%|▏ | 104.30/6000.00 ms [00:00<00:45, 129.75ms/s]
Running simulation: 2%|▏ | 117.40/6000.00 ms [00:00<00:45, 129.85ms/s]
Running simulation: 2%|▏ | 130.40/6000.00 ms [00:01<00:45, 129.70ms/s]
Running simulation: 2%|▏ | 143.40/6000.00 ms [00:01<00:45, 129.65ms/s]
Running simulation: 3%|▎ | 156.40/6000.00 ms [00:01<00:45, 129.63ms/s]
Running simulation: 3%|▎ | 169.40/6000.00 ms [00:01<00:45, 129.46ms/s]
Running simulation: 3%|▎ | 182.40/6000.00 ms [00:01<00:44, 129.57ms/s]
Running simulation: 3%|▎ | 195.40/6000.00 ms [00:01<00:44, 129.56ms/s]
Running simulation: 3%|▎ | 208.40/6000.00 ms [00:01<00:44, 129.54ms/s]
Running simulation: 4%|▎ | 221.40/6000.00 ms [00:01<00:44, 129.56ms/s]
Running simulation: 4%|▍ | 234.50/6000.00 ms [00:01<00:44, 129.76ms/s]
Running simulation: 4%|▍ | 247.50/6000.00 ms [00:01<00:44, 129.72ms/s]
Running simulation: 4%|▍ | 260.60/6000.00 ms [00:02<00:44, 130.00ms/s]
Running simulation: 5%|▍ | 273.70/6000.00 ms [00:02<00:44, 129.98ms/s]
Running simulation: 5%|▍ | 286.70/6000.00 ms [00:02<00:43, 129.93ms/s]
Running simulation: 5%|▍ | 299.80/6000.00 ms [00:02<00:43, 130.05ms/s]
Running simulation: 5%|▌ | 312.90/6000.00 ms [00:02<00:43, 130.24ms/s]
Running simulation: 5%|▌ | 326.00/6000.00 ms [00:02<00:43, 130.41ms/s]
Running simulation: 6%|▌ | 339.10/6000.00 ms [00:02<00:43, 130.20ms/s]
Running simulation: 6%|▌ | 352.20/6000.00 ms [00:02<00:43, 129.92ms/s]
Running simulation: 6%|▌ | 365.20/6000.00 ms [00:02<00:43, 129.77ms/s]
Running simulation: 6%|▋ | 378.20/6000.00 ms [00:02<00:43, 129.84ms/s]
Running simulation: 7%|▋ | 391.30/6000.00 ms [00:03<00:43, 130.08ms/s]
Running simulation: 7%|▋ | 404.40/6000.00 ms [00:03<00:43, 129.92ms/s]
Running simulation: 7%|▋ | 417.40/6000.00 ms [00:03<00:43, 129.67ms/s]
Running simulation: 7%|▋ | 430.40/6000.00 ms [00:03<00:43, 129.42ms/s]
Running simulation: 7%|▋ | 443.50/6000.00 ms [00:03<00:42, 129.61ms/s]
Running simulation: 8%|▊ | 456.50/6000.00 ms [00:03<00:42, 129.53ms/s]
Running simulation: 8%|▊ | 469.50/6000.00 ms [00:03<00:42, 129.58ms/s]
Running simulation: 8%|▊ | 482.60/6000.00 ms [00:03<00:42, 129.90ms/s]
Running simulation: 8%|▊ | 495.60/6000.00 ms [00:03<00:42, 129.85ms/s]
Running simulation: 8%|▊ | 508.60/6000.00 ms [00:03<00:42, 129.83ms/s]
Running simulation: 9%|▊ | 521.60/6000.00 ms [00:04<00:42, 129.83ms/s]
Running simulation: 9%|▉ | 534.60/6000.00 ms [00:04<00:42, 129.62ms/s]
Running simulation: 9%|▉ | 547.60/6000.00 ms [00:04<00:42, 129.35ms/s]
Running simulation: 9%|▉ | 560.60/6000.00 ms [00:04<00:42, 129.39ms/s]
Running simulation: 10%|▉ | 573.60/6000.00 ms [00:04<00:41, 129.27ms/s]
Running simulation: 10%|▉ | 586.60/6000.00 ms [00:04<00:41, 129.42ms/s]
Running simulation: 10%|▉ | 599.60/6000.00 ms [00:04<00:41, 129.54ms/s]
Running simulation: 10%|█ | 612.70/6000.00 ms [00:04<00:41, 129.69ms/s]
Running simulation: 10%|█ | 625.80/6000.00 ms [00:04<00:41, 129.80ms/s]
Running simulation: 11%|█ | 638.80/6000.00 ms [00:04<00:41, 129.83ms/s]
Running simulation: 11%|█ | 651.90/6000.00 ms [00:05<00:41, 130.00ms/s]
Running simulation: 11%|█ | 665.00/6000.00 ms [00:05<00:41, 130.04ms/s]
Running simulation: 11%|█▏ | 678.10/6000.00 ms [00:05<00:40, 129.82ms/s]
Running simulation: 12%|█▏ | 691.10/6000.00 ms [00:05<00:41, 129.23ms/s]
Running simulation: 12%|█▏ | 704.20/6000.00 ms [00:05<00:40, 129.60ms/s]
Running simulation: 12%|█▏ | 717.20/6000.00 ms [00:05<00:40, 129.54ms/s]
Running simulation: 12%|█▏ | 730.20/6000.00 ms [00:05<00:40, 129.38ms/s]
Running simulation: 12%|█▏ | 743.20/6000.00 ms [00:05<00:40, 129.38ms/s]
Running simulation: 13%|█▎ | 756.30/6000.00 ms [00:05<00:40, 129.58ms/s]
Running simulation: 13%|█▎ | 769.30/6000.00 ms [00:05<00:40, 129.59ms/s]
Running simulation: 13%|█▎ | 782.30/6000.00 ms [00:06<00:40, 129.55ms/s]
Running simulation: 13%|█▎ | 795.40/6000.00 ms [00:06<00:40, 129.69ms/s]
Running simulation: 13%|█▎ | 808.40/6000.00 ms [00:06<00:40, 129.45ms/s]
Running simulation: 14%|█▎ | 821.50/6000.00 ms [00:06<00:39, 129.62ms/s]
Running simulation: 14%|█▍ | 834.50/6000.00 ms [00:06<00:39, 129.55ms/s]
Running simulation: 14%|█▍ | 847.50/6000.00 ms [00:06<00:39, 129.57ms/s]
Running simulation: 14%|█▍ | 860.50/6000.00 ms [00:06<00:39, 129.58ms/s]
Running simulation: 15%|█▍ | 873.50/6000.00 ms [00:06<00:39, 129.50ms/s]
Running simulation: 15%|█▍ | 886.50/6000.00 ms [00:06<00:39, 129.40ms/s]
Running simulation: 15%|█▍ | 899.60/6000.00 ms [00:06<00:39, 129.59ms/s]
Running simulation: 15%|█▌ | 912.70/6000.00 ms [00:07<00:39, 129.83ms/s]
Running simulation: 15%|█▌ | 925.70/6000.00 ms [00:07<00:39, 129.79ms/s]
Running simulation: 16%|█▌ | 938.70/6000.00 ms [00:07<00:39, 129.47ms/s]
Running simulation: 16%|█▌ | 951.70/6000.00 ms [00:07<00:38, 129.60ms/s]
Running simulation: 16%|█▌ | 964.80/6000.00 ms [00:07<00:38, 129.80ms/s]
Running simulation: 16%|█▋ | 977.80/6000.00 ms [00:07<00:38, 129.64ms/s]
Running simulation: 17%|█▋ | 990.80/6000.00 ms [00:07<00:38, 129.73ms/s]
Running simulation: 17%|█▋ | 1003.80/6000.00 ms [00:07<00:40, 123.81ms/s]
Running simulation: 17%|█▋ | 1016.30/6000.00 ms [00:07<00:45, 108.87ms/s]
Running simulation: 17%|█▋ | 1027.60/6000.00 ms [00:08<00:49, 100.88ms/s]
Running simulation: 17%|█▋ | 1038.00/6000.00 ms [00:08<00:51, 95.90ms/s]
Running simulation: 17%|█▋ | 1047.90/6000.00 ms [00:08<00:53, 92.48ms/s]
Running simulation: 18%|█▊ | 1057.30/6000.00 ms [00:08<00:54, 90.09ms/s]
Running simulation: 18%|█▊ | 1066.40/6000.00 ms [00:08<00:55, 88.48ms/s]
Running simulation: 18%|█▊ | 1075.30/6000.00 ms [00:08<00:56, 87.22ms/s]
Running simulation: 18%|█▊ | 1084.10/6000.00 ms [00:08<00:56, 86.29ms/s]
Running simulation: 18%|█▊ | 1092.80/6000.00 ms [00:08<00:57, 85.69ms/s]
Running simulation: 18%|█▊ | 1101.40/6000.00 ms [00:08<00:57, 85.39ms/s]
Running simulation: 19%|█▊ | 1110.00/6000.00 ms [00:09<00:57, 85.16ms/s]
Running simulation: 19%|█▊ | 1118.60/6000.00 ms [00:09<00:57, 84.97ms/s]
Running simulation: 19%|█▉ | 1127.10/6000.00 ms [00:09<00:57, 84.72ms/s]
Running simulation: 19%|█▉ | 1135.60/6000.00 ms [00:09<00:57, 84.50ms/s]
Running simulation: 19%|█▉ | 1144.10/6000.00 ms [00:09<00:57, 84.38ms/s]
Running simulation: 19%|█▉ | 1152.60/6000.00 ms [00:09<00:57, 84.46ms/s]
Running simulation: 19%|█▉ | 1161.10/6000.00 ms [00:09<00:57, 84.38ms/s]
Running simulation: 19%|█▉ | 1169.60/6000.00 ms [00:09<00:57, 84.36ms/s]
Running simulation: 20%|█▉ | 1178.10/6000.00 ms [00:09<00:57, 84.39ms/s]
Running simulation: 20%|█▉ | 1186.60/6000.00 ms [00:09<00:57, 84.41ms/s]
Running simulation: 20%|█▉ | 1195.10/6000.00 ms [00:10<00:56, 84.41ms/s]
Running simulation: 20%|██ | 1203.60/6000.00 ms [00:10<00:56, 84.40ms/s]
Running simulation: 20%|██ | 1212.10/6000.00 ms [00:10<00:56, 84.23ms/s]
Running simulation: 20%|██ | 1220.60/6000.00 ms [00:10<00:56, 84.25ms/s]
Running simulation: 20%|██ | 1229.10/6000.00 ms [00:10<00:56, 84.16ms/s]
Running simulation: 21%|██ | 1237.60/6000.00 ms [00:10<00:56, 84.05ms/s]
Running simulation: 21%|██ | 1246.10/6000.00 ms [00:10<00:56, 83.96ms/s]
Running simulation: 21%|██ | 1254.50/6000.00 ms [00:10<00:56, 83.93ms/s]
Running simulation: 21%|██ | 1262.90/6000.00 ms [00:10<00:56, 83.89ms/s]
Running simulation: 21%|██ | 1271.30/6000.00 ms [00:10<00:56, 83.85ms/s]
Running simulation: 21%|██▏ | 1279.70/6000.00 ms [00:11<00:56, 83.87ms/s]
Running simulation: 21%|██▏ | 1288.10/6000.00 ms [00:11<00:56, 83.86ms/s]
Running simulation: 22%|██▏ | 1296.50/6000.00 ms [00:11<00:56, 83.71ms/s]
Running simulation: 22%|██▏ | 1304.90/6000.00 ms [00:11<00:56, 83.67ms/s]
Running simulation: 22%|██▏ | 1313.30/6000.00 ms [00:11<00:56, 83.66ms/s]
Running simulation: 22%|██▏ | 1321.70/6000.00 ms [00:11<00:55, 83.68ms/s]
Running simulation: 22%|██▏ | 1330.10/6000.00 ms [00:11<00:55, 83.61ms/s]
Running simulation: 22%|██▏ | 1338.50/6000.00 ms [00:11<00:55, 83.70ms/s]
Running simulation: 22%|██▏ | 1346.90/6000.00 ms [00:11<00:55, 83.79ms/s]
Running simulation: 23%|██▎ | 1355.40/6000.00 ms [00:11<00:55, 83.86ms/s]
Running simulation: 23%|██▎ | 1363.80/6000.00 ms [00:12<00:55, 83.82ms/s]
Running simulation: 23%|██▎ | 1372.20/6000.00 ms [00:12<00:55, 83.85ms/s]
Running simulation: 23%|██▎ | 1380.60/6000.00 ms [00:12<00:55, 83.63ms/s]
Running simulation: 23%|██▎ | 1389.00/6000.00 ms [00:12<00:55, 83.57ms/s]
Running simulation: 23%|██▎ | 1397.40/6000.00 ms [00:12<00:55, 83.63ms/s]
Running simulation: 23%|██▎ | 1405.80/6000.00 ms [00:12<00:54, 83.59ms/s]
Running simulation: 24%|██▎ | 1414.20/6000.00 ms [00:12<00:54, 83.54ms/s]
Running simulation: 24%|██▎ | 1422.60/6000.00 ms [00:12<00:54, 83.67ms/s]
Running simulation: 24%|██▍ | 1431.00/6000.00 ms [00:12<00:54, 83.66ms/s]
Running simulation: 24%|██▍ | 1439.40/6000.00 ms [00:12<00:54, 83.70ms/s]
Running simulation: 24%|██▍ | 1447.80/6000.00 ms [00:13<00:54, 83.66ms/s]
Running simulation: 24%|██▍ | 1456.20/6000.00 ms [00:13<00:54, 83.66ms/s]
Running simulation: 24%|██▍ | 1464.60/6000.00 ms [00:13<00:54, 83.45ms/s]
Running simulation: 25%|██▍ | 1473.00/6000.00 ms [00:13<00:54, 83.50ms/s]
Running simulation: 25%|██▍ | 1481.40/6000.00 ms [00:13<00:54, 83.44ms/s]
Running simulation: 25%|██▍ | 1489.80/6000.00 ms [00:13<00:54, 83.45ms/s]
Running simulation: 25%|██▍ | 1498.20/6000.00 ms [00:13<00:53, 83.39ms/s]
Running simulation: 25%|██▌ | 1506.60/6000.00 ms [00:13<00:53, 83.43ms/s]
Running simulation: 25%|██▌ | 1515.00/6000.00 ms [00:13<00:53, 83.47ms/s]
Running simulation: 25%|██▌ | 1523.40/6000.00 ms [00:13<00:53, 83.49ms/s]
Running simulation: 26%|██▌ | 1531.80/6000.00 ms [00:14<00:53, 83.48ms/s]
Running simulation: 26%|██▌ | 1540.20/6000.00 ms [00:14<00:53, 83.46ms/s]
Running simulation: 26%|██▌ | 1548.60/6000.00 ms [00:14<00:53, 83.40ms/s]
Running simulation: 26%|██▌ | 1557.00/6000.00 ms [00:14<00:53, 83.47ms/s]
Running simulation: 26%|██▌ | 1565.40/6000.00 ms [00:14<00:53, 83.46ms/s]
Running simulation: 26%|██▌ | 1573.80/6000.00 ms [00:14<00:53, 83.37ms/s]
Running simulation: 26%|██▋ | 1582.20/6000.00 ms [00:14<00:52, 83.41ms/s]
Running simulation: 27%|██▋ | 1590.60/6000.00 ms [00:14<00:52, 83.51ms/s]
Running simulation: 27%|██▋ | 1599.00/6000.00 ms [00:14<00:52, 83.54ms/s]
Running simulation: 27%|██▋ | 1607.40/6000.00 ms [00:14<00:52, 83.58ms/s]
Running simulation: 27%|██▋ | 1615.80/6000.00 ms [00:15<00:52, 83.61ms/s]
Running simulation: 27%|██▋ | 1624.20/6000.00 ms [00:15<00:52, 83.69ms/s]
Running simulation: 27%|██▋ | 1632.60/6000.00 ms [00:15<00:52, 82.90ms/s]
Running simulation: 27%|██▋ | 1641.00/6000.00 ms [00:15<00:52, 83.04ms/s]
Running simulation: 27%|██▋ | 1649.40/6000.00 ms [00:15<00:52, 83.10ms/s]
Running simulation: 28%|██▊ | 1657.80/6000.00 ms [00:15<00:52, 83.16ms/s]
Running simulation: 28%|██▊ | 1666.20/6000.00 ms [00:15<00:52, 83.14ms/s]
Running simulation: 28%|██▊ | 1674.60/6000.00 ms [00:15<00:52, 83.15ms/s]
Running simulation: 28%|██▊ | 1683.00/6000.00 ms [00:15<00:51, 83.06ms/s]
Running simulation: 28%|██▊ | 1691.40/6000.00 ms [00:15<00:51, 83.14ms/s]
Running simulation: 28%|██▊ | 1699.80/6000.00 ms [00:16<00:51, 83.26ms/s]
Running simulation: 28%|██▊ | 1708.20/6000.00 ms [00:16<00:51, 83.24ms/s]
Running simulation: 29%|██▊ | 1716.60/6000.00 ms [00:16<00:51, 83.15ms/s]
Running simulation: 29%|██▊ | 1725.00/6000.00 ms [00:16<00:51, 83.15ms/s]
Running simulation: 29%|██▉ | 1733.40/6000.00 ms [00:16<00:51, 83.10ms/s]
Running simulation: 29%|██▉ | 1741.80/6000.00 ms [00:16<00:51, 83.22ms/s]
Running simulation: 29%|██▉ | 1750.20/6000.00 ms [00:16<00:51, 83.22ms/s]
Running simulation: 29%|██▉ | 1758.60/6000.00 ms [00:16<00:50, 83.37ms/s]
Running simulation: 29%|██▉ | 1767.00/6000.00 ms [00:16<00:50, 83.37ms/s]
Running simulation: 30%|██▉ | 1775.40/6000.00 ms [00:16<00:50, 83.23ms/s]
Running simulation: 30%|██▉ | 1783.80/6000.00 ms [00:17<00:50, 83.14ms/s]
Running simulation: 30%|██▉ | 1792.20/6000.00 ms [00:17<00:50, 83.09ms/s]
Running simulation: 30%|███ | 1800.60/6000.00 ms [00:17<00:50, 82.88ms/s]
Running simulation: 30%|███ | 1809.00/6000.00 ms [00:17<00:50, 82.98ms/s]
Running simulation: 30%|███ | 1817.40/6000.00 ms [00:17<00:50, 83.00ms/s]
Running simulation: 30%|███ | 1825.80/6000.00 ms [00:17<00:50, 82.92ms/s]
Running simulation: 31%|███ | 1834.10/6000.00 ms [00:17<00:50, 82.84ms/s]
Running simulation: 31%|███ | 1842.50/6000.00 ms [00:17<00:50, 82.93ms/s]
Running simulation: 31%|███ | 1850.90/6000.00 ms [00:17<00:49, 83.03ms/s]
Running simulation: 31%|███ | 1859.30/6000.00 ms [00:17<00:49, 83.13ms/s]
Running simulation: 31%|███ | 1867.70/6000.00 ms [00:18<00:49, 83.19ms/s]
Running simulation: 31%|███▏ | 1876.10/6000.00 ms [00:18<00:49, 83.13ms/s]
Running simulation: 31%|███▏ | 1884.50/6000.00 ms [00:18<00:49, 83.03ms/s]
Running simulation: 32%|███▏ | 1892.90/6000.00 ms [00:18<00:49, 83.11ms/s]
Running simulation: 32%|███▏ | 1901.30/6000.00 ms [00:18<00:49, 83.08ms/s]
Running simulation: 32%|███▏ | 1909.70/6000.00 ms [00:18<00:49, 83.07ms/s]
Running simulation: 32%|███▏ | 1918.10/6000.00 ms [00:18<00:49, 83.11ms/s]
Running simulation: 32%|███▏ | 1926.50/6000.00 ms [00:18<00:48, 83.14ms/s]
Running simulation: 32%|███▏ | 1934.90/6000.00 ms [00:18<00:48, 83.17ms/s]
Running simulation: 32%|███▏ | 1943.30/6000.00 ms [00:18<00:48, 83.23ms/s]
Running simulation: 33%|███▎ | 1951.70/6000.00 ms [00:19<00:48, 83.22ms/s]
Running simulation: 33%|███▎ | 1960.10/6000.00 ms [00:19<00:48, 83.24ms/s]
Running simulation: 33%|███▎ | 1968.50/6000.00 ms [00:19<00:48, 83.01ms/s]
Running simulation: 33%|███▎ | 1976.90/6000.00 ms [00:19<00:48, 83.00ms/s]
Running simulation: 33%|███▎ | 1985.30/6000.00 ms [00:19<00:48, 83.12ms/s]
Running simulation: 33%|███▎ | 1993.70/6000.00 ms [00:19<00:48, 83.22ms/s]
Running simulation: 33%|███▎ | 2002.10/6000.00 ms [00:19<00:48, 83.06ms/s]
Running simulation: 34%|███▎ | 2010.50/6000.00 ms [00:19<00:48, 83.00ms/s]
Running simulation: 34%|███▎ | 2018.90/6000.00 ms [00:19<00:48, 82.94ms/s]
Running simulation: 34%|███▍ | 2027.20/6000.00 ms [00:20<00:47, 82.95ms/s]
Running simulation: 34%|███▍ | 2035.60/6000.00 ms [00:20<00:47, 83.00ms/s]
Running simulation: 34%|███▍ | 2044.00/6000.00 ms [00:20<00:47, 83.02ms/s]
Running simulation: 34%|███▍ | 2052.40/6000.00 ms [00:20<00:47, 82.96ms/s]
Running simulation: 34%|███▍ | 2060.70/6000.00 ms [00:20<00:47, 82.90ms/s]
Running simulation: 34%|███▍ | 2069.10/6000.00 ms [00:20<00:47, 83.05ms/s]
Running simulation: 35%|███▍ | 2077.50/6000.00 ms [00:20<00:47, 83.17ms/s]
Running simulation: 35%|███▍ | 2085.90/6000.00 ms [00:20<00:47, 83.20ms/s]
Running simulation: 35%|███▍ | 2094.30/6000.00 ms [00:20<00:46, 83.16ms/s]
Running simulation: 35%|███▌ | 2102.70/6000.00 ms [00:20<00:46, 83.13ms/s]
Running simulation: 35%|███▌ | 2111.10/6000.00 ms [00:21<00:46, 83.18ms/s]
Running simulation: 35%|███▌ | 2119.50/6000.00 ms [00:21<00:46, 83.17ms/s]
Running simulation: 35%|███▌ | 2127.90/6000.00 ms [00:21<00:46, 82.92ms/s]
Running simulation: 36%|███▌ | 2136.20/6000.00 ms [00:21<00:46, 82.88ms/s]
Running simulation: 36%|███▌ | 2144.50/6000.00 ms [00:21<00:46, 82.86ms/s]
Running simulation: 36%|███▌ | 2152.80/6000.00 ms [00:21<00:46, 82.88ms/s]
Running simulation: 36%|███▌ | 2161.20/6000.00 ms [00:21<00:46, 82.93ms/s]
Running simulation: 36%|███▌ | 2169.60/6000.00 ms [00:21<00:46, 83.02ms/s]
Running simulation: 36%|███▋ | 2178.00/6000.00 ms [00:21<00:46, 83.03ms/s]
Running simulation: 36%|███▋ | 2186.40/6000.00 ms [00:21<00:45, 82.98ms/s]
Running simulation: 37%|███▋ | 2194.80/6000.00 ms [00:22<00:45, 83.11ms/s]
Running simulation: 37%|███▋ | 2203.20/6000.00 ms [00:22<00:45, 83.17ms/s]
Running simulation: 37%|███▋ | 2211.60/6000.00 ms [00:22<00:45, 83.12ms/s]
Running simulation: 37%|███▋ | 2220.00/6000.00 ms [00:22<00:45, 83.04ms/s]
Running simulation: 37%|███▋ | 2228.40/6000.00 ms [00:22<00:45, 82.95ms/s]
Running simulation: 37%|███▋ | 2236.80/6000.00 ms [00:22<00:45, 83.03ms/s]
Running simulation: 37%|███▋ | 2245.20/6000.00 ms [00:22<00:45, 83.04ms/s]
Running simulation: 38%|███▊ | 2253.60/6000.00 ms [00:22<00:45, 83.10ms/s]
Running simulation: 38%|███▊ | 2262.00/6000.00 ms [00:22<00:44, 83.10ms/s]
Running simulation: 38%|███▊ | 2270.40/6000.00 ms [00:22<00:44, 83.11ms/s]
Running simulation: 38%|███▊ | 2278.80/6000.00 ms [00:23<00:44, 83.20ms/s]
Running simulation: 38%|███▊ | 2287.20/6000.00 ms [00:23<00:44, 83.27ms/s]
Running simulation: 38%|███▊ | 2295.60/6000.00 ms [00:23<00:44, 83.00ms/s]
Running simulation: 38%|███▊ | 2303.90/6000.00 ms [00:23<00:44, 82.98ms/s]
Running simulation: 39%|███▊ | 2312.30/6000.00 ms [00:23<00:44, 83.00ms/s]
Running simulation: 39%|███▊ | 2320.70/6000.00 ms [00:23<00:44, 83.04ms/s]
Running simulation: 39%|███▉ | 2329.10/6000.00 ms [00:23<00:44, 82.96ms/s]
Running simulation: 39%|███▉ | 2337.50/6000.00 ms [00:23<00:44, 83.03ms/s]
Running simulation: 39%|███▉ | 2345.90/6000.00 ms [00:23<00:44, 82.99ms/s]
Running simulation: 39%|███▉ | 2354.20/6000.00 ms [00:23<00:43, 82.94ms/s]
Running simulation: 39%|███▉ | 2362.50/6000.00 ms [00:24<00:43, 82.89ms/s]
Running simulation: 40%|███▉ | 2370.80/6000.00 ms [00:24<00:43, 82.90ms/s]
Running simulation: 40%|███▉ | 2379.10/6000.00 ms [00:24<00:43, 82.70ms/s]
Running simulation: 40%|███▉ | 2387.50/6000.00 ms [00:24<00:43, 82.88ms/s]
Running simulation: 40%|███▉ | 2395.90/6000.00 ms [00:24<00:43, 82.94ms/s]
Running simulation: 40%|████ | 2404.30/6000.00 ms [00:24<00:43, 83.05ms/s]
Running simulation: 40%|████ | 2412.70/6000.00 ms [00:24<00:43, 83.09ms/s]
Running simulation: 40%|████ | 2421.10/6000.00 ms [00:24<00:43, 82.98ms/s]
Running simulation: 40%|████ | 2429.50/6000.00 ms [00:24<00:42, 83.09ms/s]
Running simulation: 41%|████ | 2437.90/6000.00 ms [00:24<00:42, 83.15ms/s]
Running simulation: 41%|████ | 2446.30/6000.00 ms [00:25<00:42, 83.17ms/s]
Running simulation: 41%|████ | 2454.70/6000.00 ms [00:25<00:42, 83.17ms/s]
Running simulation: 41%|████ | 2463.10/6000.00 ms [00:25<00:42, 82.32ms/s]
Running simulation: 41%|████ | 2471.40/6000.00 ms [00:25<00:42, 82.49ms/s]
Running simulation: 41%|████▏ | 2479.70/6000.00 ms [00:25<00:42, 82.64ms/s]
Running simulation: 41%|████▏ | 2488.00/6000.00 ms [00:25<00:42, 82.71ms/s]
Running simulation: 42%|████▏ | 2496.30/6000.00 ms [00:25<00:42, 82.74ms/s]
Running simulation: 42%|████▏ | 2504.70/6000.00 ms [00:25<00:42, 82.86ms/s]
Running simulation: 42%|████▏ | 2513.10/6000.00 ms [00:25<00:42, 82.91ms/s]
Running simulation: 42%|████▏ | 2521.40/6000.00 ms [00:25<00:41, 82.84ms/s]
Running simulation: 42%|████▏ | 2529.70/6000.00 ms [00:26<00:41, 82.83ms/s]
Running simulation: 42%|████▏ | 2538.10/6000.00 ms [00:26<00:41, 82.97ms/s]
Running simulation: 42%|████▏ | 2546.40/6000.00 ms [00:26<00:41, 82.94ms/s]
Running simulation: 43%|████▎ | 2554.80/6000.00 ms [00:26<00:41, 82.96ms/s]
Running simulation: 43%|████▎ | 2563.20/6000.00 ms [00:26<00:41, 83.06ms/s]
Running simulation: 43%|████▎ | 2571.60/6000.00 ms [00:26<00:41, 82.96ms/s]
Running simulation: 43%|████▎ | 2579.90/6000.00 ms [00:26<00:42, 81.37ms/s]
Running simulation: 43%|████▎ | 2588.30/6000.00 ms [00:26<00:41, 81.86ms/s]
Running simulation: 43%|████▎ | 2596.60/6000.00 ms [00:26<00:41, 82.16ms/s]
Running simulation: 43%|████▎ | 2604.90/6000.00 ms [00:26<00:41, 82.25ms/s]
Running simulation: 44%|████▎ | 2613.20/6000.00 ms [00:27<00:41, 82.39ms/s]
Running simulation: 44%|████▎ | 2621.50/6000.00 ms [00:27<00:40, 82.44ms/s]
Running simulation: 44%|████▍ | 2629.80/6000.00 ms [00:27<00:40, 82.43ms/s]
Running simulation: 44%|████▍ | 2638.10/6000.00 ms [00:27<00:40, 82.49ms/s]
Running simulation: 44%|████▍ | 2646.40/6000.00 ms [00:27<00:40, 82.53ms/s]
Running simulation: 44%|████▍ | 2654.70/6000.00 ms [00:27<00:40, 82.54ms/s]
Running simulation: 44%|████▍ | 2663.00/6000.00 ms [00:27<00:40, 82.58ms/s]
Running simulation: 45%|████▍ | 2671.30/6000.00 ms [00:27<00:40, 82.61ms/s]
Running simulation: 45%|████▍ | 2679.60/6000.00 ms [00:27<00:40, 82.70ms/s]
Running simulation: 45%|████▍ | 2688.00/6000.00 ms [00:27<00:39, 82.87ms/s]
Running simulation: 45%|████▍ | 2696.40/6000.00 ms [00:28<00:39, 82.98ms/s]
Running simulation: 45%|████▌ | 2704.70/6000.00 ms [00:28<00:39, 82.96ms/s]
Running simulation: 45%|████▌ | 2713.00/6000.00 ms [00:28<00:39, 82.95ms/s]
Running simulation: 45%|████▌ | 2721.30/6000.00 ms [00:28<00:39, 82.91ms/s]
Running simulation: 45%|████▌ | 2729.60/6000.00 ms [00:28<00:39, 82.76ms/s]
Running simulation: 46%|████▌ | 2737.90/6000.00 ms [00:28<00:39, 82.83ms/s]
Running simulation: 46%|████▌ | 2746.20/6000.00 ms [00:28<00:39, 82.83ms/s]
Running simulation: 46%|████▌ | 2754.50/6000.00 ms [00:28<00:39, 82.84ms/s]
Running simulation: 46%|████▌ | 2762.80/6000.00 ms [00:28<00:39, 82.74ms/s]
Running simulation: 46%|████▌ | 2771.10/6000.00 ms [00:28<00:39, 82.77ms/s]
Running simulation: 46%|████▋ | 2779.50/6000.00 ms [00:29<00:38, 82.88ms/s]
Running simulation: 46%|████▋ | 2787.80/6000.00 ms [00:29<00:38, 82.89ms/s]
Running simulation: 47%|████▋ | 2796.10/6000.00 ms [00:29<00:38, 82.89ms/s]
Running simulation: 47%|████▋ | 2804.50/6000.00 ms [00:29<00:38, 82.96ms/s]
Running simulation: 47%|████▋ | 2812.80/6000.00 ms [00:29<00:38, 82.94ms/s]
Running simulation: 47%|████▋ | 2821.10/6000.00 ms [00:29<00:38, 82.94ms/s]
Running simulation: 47%|████▋ | 2829.40/6000.00 ms [00:29<00:38, 82.94ms/s]
Running simulation: 47%|████▋ | 2837.80/6000.00 ms [00:29<00:38, 83.05ms/s]
Running simulation: 47%|████▋ | 2846.20/6000.00 ms [00:29<00:37, 83.04ms/s]
Running simulation: 48%|████▊ | 2854.60/6000.00 ms [00:29<00:37, 83.15ms/s]
Running simulation: 48%|████▊ | 2863.00/6000.00 ms [00:30<00:37, 83.06ms/s]
Running simulation: 48%|████▊ | 2871.40/6000.00 ms [00:30<00:37, 83.10ms/s]
Running simulation: 48%|████▊ | 2879.80/6000.00 ms [00:30<00:37, 83.06ms/s]
Running simulation: 48%|████▊ | 2888.20/6000.00 ms [00:30<00:37, 83.05ms/s]
Running simulation: 48%|████▊ | 2896.60/6000.00 ms [00:30<00:37, 83.08ms/s]
Running simulation: 48%|████▊ | 2905.00/6000.00 ms [00:30<00:37, 82.62ms/s]
Running simulation: 49%|████▊ | 2913.30/6000.00 ms [00:30<00:37, 82.67ms/s]
Running simulation: 49%|████▊ | 2921.70/6000.00 ms [00:30<00:37, 82.80ms/s]
Running simulation: 49%|████▉ | 2930.10/6000.00 ms [00:30<00:37, 82.90ms/s]
Running simulation: 49%|████▉ | 2938.40/6000.00 ms [00:31<00:36, 82.87ms/s]
Running simulation: 49%|████▉ | 2946.70/6000.00 ms [00:31<00:36, 82.88ms/s]
Running simulation: 49%|████▉ | 2955.00/6000.00 ms [00:31<00:36, 82.89ms/s]
Running simulation: 49%|████▉ | 2963.30/6000.00 ms [00:31<00:36, 82.67ms/s]
Running simulation: 50%|████▉ | 2971.60/6000.00 ms [00:31<00:36, 82.67ms/s]
Running simulation: 50%|████▉ | 2980.00/6000.00 ms [00:31<00:36, 82.81ms/s]
Running simulation: 50%|████▉ | 2988.30/6000.00 ms [00:31<00:36, 82.86ms/s]
Running simulation: 50%|████▉ | 2996.60/6000.00 ms [00:31<00:36, 82.84ms/s]
Running simulation: 50%|█████ | 3004.90/6000.00 ms [00:31<00:36, 82.88ms/s]
Running simulation: 50%|█████ | 3013.30/6000.00 ms [00:31<00:35, 82.98ms/s]
Running simulation: 50%|█████ | 3021.70/6000.00 ms [00:32<00:35, 83.01ms/s]
Running simulation: 51%|█████ | 3030.10/6000.00 ms [00:32<00:35, 82.98ms/s]
Running simulation: 51%|█████ | 3038.50/6000.00 ms [00:32<00:35, 82.99ms/s]
Running simulation: 51%|█████ | 3046.80/6000.00 ms [00:32<00:35, 82.87ms/s]
Running simulation: 51%|█████ | 3055.20/6000.00 ms [00:32<00:35, 82.97ms/s]
Running simulation: 51%|█████ | 3063.60/6000.00 ms [00:32<00:35, 83.00ms/s]
Running simulation: 51%|█████ | 3072.00/6000.00 ms [00:32<00:35, 83.04ms/s]
Running simulation: 51%|█████▏ | 3080.40/6000.00 ms [00:32<00:35, 82.87ms/s]
Running simulation: 51%|█████▏ | 3088.70/6000.00 ms [00:32<00:35, 82.85ms/s]
Running simulation: 52%|█████▏ | 3097.10/6000.00 ms [00:32<00:35, 82.94ms/s]
Running simulation: 52%|█████▏ | 3105.40/6000.00 ms [00:33<00:34, 82.90ms/s]
Running simulation: 52%|█████▏ | 3113.70/6000.00 ms [00:33<00:34, 82.83ms/s]
Running simulation: 52%|█████▏ | 3122.00/6000.00 ms [00:33<00:34, 82.69ms/s]
Running simulation: 52%|█████▏ | 3130.30/6000.00 ms [00:33<00:34, 82.76ms/s]
Running simulation: 52%|█████▏ | 3138.70/6000.00 ms [00:33<00:34, 82.91ms/s]
Running simulation: 52%|█████▏ | 3147.10/6000.00 ms [00:33<00:34, 82.98ms/s]
Running simulation: 53%|█████▎ | 3155.40/6000.00 ms [00:33<00:34, 82.69ms/s]
Running simulation: 53%|█████▎ | 3163.70/6000.00 ms [00:33<00:34, 82.68ms/s]
Running simulation: 53%|█████▎ | 3172.00/6000.00 ms [00:33<00:34, 82.71ms/s]
Running simulation: 53%|█████▎ | 3180.30/6000.00 ms [00:33<00:34, 82.75ms/s]
Running simulation: 53%|█████▎ | 3188.60/6000.00 ms [00:34<00:33, 82.81ms/s]
Running simulation: 53%|█████▎ | 3196.90/6000.00 ms [00:34<00:33, 82.83ms/s]
Running simulation: 53%|█████▎ | 3205.20/6000.00 ms [00:34<00:33, 82.83ms/s]
Running simulation: 54%|█████▎ | 3213.50/6000.00 ms [00:34<00:33, 82.82ms/s]
Running simulation: 54%|█████▎ | 3221.80/6000.00 ms [00:34<00:33, 82.85ms/s]
Running simulation: 54%|█████▍ | 3230.10/6000.00 ms [00:34<00:33, 82.73ms/s]
Running simulation: 54%|█████▍ | 3238.40/6000.00 ms [00:34<00:33, 82.65ms/s]
Running simulation: 54%|█████▍ | 3246.70/6000.00 ms [00:34<00:33, 82.71ms/s]
Running simulation: 54%|█████▍ | 3255.00/6000.00 ms [00:34<00:33, 82.73ms/s]
Running simulation: 54%|█████▍ | 3263.30/6000.00 ms [00:34<00:33, 82.71ms/s]
Running simulation: 55%|█████▍ | 3271.60/6000.00 ms [00:35<00:32, 82.75ms/s]
Running simulation: 55%|█████▍ | 3280.00/6000.00 ms [00:35<00:32, 82.83ms/s]
Running simulation: 55%|█████▍ | 3288.40/6000.00 ms [00:35<00:32, 82.89ms/s]
Running simulation: 55%|█████▍ | 3296.70/6000.00 ms [00:35<00:32, 82.17ms/s]
Running simulation: 55%|█████▌ | 3305.10/6000.00 ms [00:35<00:32, 82.45ms/s]
Running simulation: 55%|█████▌ | 3313.50/6000.00 ms [00:35<00:32, 82.73ms/s]
Running simulation: 55%|█████▌ | 3321.90/6000.00 ms [00:35<00:32, 82.85ms/s]
Running simulation: 56%|█████▌ | 3330.20/6000.00 ms [00:35<00:32, 82.85ms/s]
Running simulation: 56%|█████▌ | 3338.60/6000.00 ms [00:35<00:32, 83.04ms/s]
Running simulation: 56%|█████▌ | 3347.00/6000.00 ms [00:35<00:31, 82.96ms/s]
Running simulation: 56%|█████▌ | 3355.40/6000.00 ms [00:36<00:31, 83.11ms/s]
Running simulation: 56%|█████▌ | 3363.80/6000.00 ms [00:36<00:31, 83.18ms/s]
Running simulation: 56%|█████▌ | 3372.20/6000.00 ms [00:36<00:31, 83.02ms/s]
Running simulation: 56%|█████▋ | 3380.60/6000.00 ms [00:36<00:31, 83.05ms/s]
Running simulation: 56%|█████▋ | 3389.00/6000.00 ms [00:36<00:31, 82.89ms/s]
Running simulation: 57%|█████▋ | 3397.30/6000.00 ms [00:36<00:31, 82.90ms/s]
Running simulation: 57%|█████▋ | 3405.60/6000.00 ms [00:36<00:31, 82.89ms/s]
Running simulation: 57%|█████▋ | 3414.00/6000.00 ms [00:36<00:31, 82.93ms/s]
Running simulation: 57%|█████▋ | 3422.40/6000.00 ms [00:36<00:31, 83.07ms/s]
Running simulation: 57%|█████▋ | 3430.80/6000.00 ms [00:36<00:30, 83.01ms/s]
Running simulation: 57%|█████▋ | 3439.20/6000.00 ms [00:37<00:30, 82.98ms/s]
Running simulation: 57%|█████▋ | 3447.60/6000.00 ms [00:37<00:30, 83.08ms/s]
Running simulation: 58%|█████▊ | 3456.00/6000.00 ms [00:37<00:30, 82.89ms/s]
Running simulation: 58%|█████▊ | 3464.40/6000.00 ms [00:37<00:30, 82.93ms/s]
Running simulation: 58%|█████▊ | 3472.70/6000.00 ms [00:37<00:30, 82.94ms/s]
Running simulation: 58%|█████▊ | 3481.10/6000.00 ms [00:37<00:30, 83.10ms/s]
Running simulation: 58%|█████▊ | 3489.50/6000.00 ms [00:37<00:30, 83.13ms/s]
Running simulation: 58%|█████▊ | 3497.90/6000.00 ms [00:37<00:30, 83.16ms/s]
Running simulation: 58%|█████▊ | 3506.30/6000.00 ms [00:37<00:30, 83.08ms/s]
Running simulation: 59%|█████▊ | 3514.70/6000.00 ms [00:37<00:29, 83.00ms/s]
Running simulation: 59%|█████▊ | 3523.10/6000.00 ms [00:38<00:29, 83.12ms/s]
Running simulation: 59%|█████▉ | 3531.50/6000.00 ms [00:38<00:29, 83.09ms/s]
Running simulation: 59%|█████▉ | 3539.90/6000.00 ms [00:38<00:29, 82.87ms/s]
Running simulation: 59%|█████▉ | 3548.20/6000.00 ms [00:38<00:29, 82.91ms/s]
Running simulation: 59%|█████▉ | 3556.50/6000.00 ms [00:38<00:29, 82.92ms/s]
Running simulation: 59%|█████▉ | 3564.80/6000.00 ms [00:38<00:29, 82.83ms/s]
Running simulation: 60%|█████▉ | 3573.10/6000.00 ms [00:38<00:29, 82.87ms/s]
Running simulation: 60%|█████▉ | 3581.50/6000.00 ms [00:38<00:29, 82.99ms/s]
Running simulation: 60%|█████▉ | 3589.80/6000.00 ms [00:38<00:29, 82.97ms/s]
Running simulation: 60%|█████▉ | 3598.10/6000.00 ms [00:38<00:28, 82.91ms/s]
Running simulation: 60%|██████ | 3606.50/6000.00 ms [00:39<00:28, 82.95ms/s]
Running simulation: 60%|██████ | 3614.80/6000.00 ms [00:39<00:28, 82.93ms/s]
Running simulation: 60%|██████ | 3623.10/6000.00 ms [00:39<00:28, 82.83ms/s]
Running simulation: 61%|██████ | 3631.40/6000.00 ms [00:39<00:28, 82.81ms/s]
Running simulation: 61%|██████ | 3639.80/6000.00 ms [00:39<00:28, 82.91ms/s]
Running simulation: 61%|██████ | 3648.20/6000.00 ms [00:39<00:28, 83.07ms/s]
Running simulation: 61%|██████ | 3656.60/6000.00 ms [00:39<00:28, 82.98ms/s]
Running simulation: 61%|██████ | 3665.00/6000.00 ms [00:39<00:28, 83.08ms/s]
Running simulation: 61%|██████ | 3673.40/6000.00 ms [00:39<00:27, 83.13ms/s]
Running simulation: 61%|██████▏ | 3681.80/6000.00 ms [00:39<00:27, 83.09ms/s]
Running simulation: 62%|██████▏ | 3690.20/6000.00 ms [00:40<00:27, 83.05ms/s]
Running simulation: 62%|██████▏ | 3698.60/6000.00 ms [00:40<00:27, 83.06ms/s]
Running simulation: 62%|██████▏ | 3707.00/6000.00 ms [00:40<00:27, 82.89ms/s]
Running simulation: 62%|██████▏ | 3715.40/6000.00 ms [00:40<00:27, 82.94ms/s]
Running simulation: 62%|██████▏ | 3723.70/6000.00 ms [00:40<00:27, 82.75ms/s]
Running simulation: 62%|██████▏ | 3732.10/6000.00 ms [00:40<00:27, 82.86ms/s]
Running simulation: 62%|██████▏ | 3740.40/6000.00 ms [00:40<00:27, 82.86ms/s]
Running simulation: 62%|██████▏ | 3748.70/6000.00 ms [00:40<00:27, 82.89ms/s]
Running simulation: 63%|██████▎ | 3757.00/6000.00 ms [00:40<00:27, 82.52ms/s]
Running simulation: 63%|██████▎ | 3765.30/6000.00 ms [00:40<00:27, 82.63ms/s]
Running simulation: 63%|██████▎ | 3773.60/6000.00 ms [00:41<00:26, 82.46ms/s]
Running simulation: 63%|██████▎ | 3782.00/6000.00 ms [00:41<00:26, 82.64ms/s]
Running simulation: 63%|██████▎ | 3790.30/6000.00 ms [00:41<00:26, 82.65ms/s]
Running simulation: 63%|██████▎ | 3798.60/6000.00 ms [00:41<00:26, 82.73ms/s]
Running simulation: 63%|██████▎ | 3807.00/6000.00 ms [00:41<00:26, 82.90ms/s]
Running simulation: 64%|██████▎ | 3815.30/6000.00 ms [00:41<00:26, 82.86ms/s]
Running simulation: 64%|██████▎ | 3823.60/6000.00 ms [00:41<00:26, 82.76ms/s]
Running simulation: 64%|██████▍ | 3831.90/6000.00 ms [00:41<00:26, 82.77ms/s]
Running simulation: 64%|██████▍ | 3840.20/6000.00 ms [00:41<00:26, 82.75ms/s]
Running simulation: 64%|██████▍ | 3848.50/6000.00 ms [00:41<00:26, 82.65ms/s]
Running simulation: 64%|██████▍ | 3856.80/6000.00 ms [00:42<00:25, 82.71ms/s]
Running simulation: 64%|██████▍ | 3865.10/6000.00 ms [00:42<00:25, 82.67ms/s]
Running simulation: 65%|██████▍ | 3873.40/6000.00 ms [00:42<00:25, 82.62ms/s]
Running simulation: 65%|██████▍ | 3881.80/6000.00 ms [00:42<00:25, 82.79ms/s]
Running simulation: 65%|██████▍ | 3890.20/6000.00 ms [00:42<00:25, 82.92ms/s]
Running simulation: 65%|██████▍ | 3898.50/6000.00 ms [00:42<00:25, 82.89ms/s]
Running simulation: 65%|██████▌ | 3906.90/6000.00 ms [00:42<00:25, 83.07ms/s]
Running simulation: 65%|██████▌ | 3915.30/6000.00 ms [00:42<00:25, 83.14ms/s]
Running simulation: 65%|██████▌ | 3923.70/6000.00 ms [00:42<00:24, 83.15ms/s]
Running simulation: 66%|██████▌ | 3932.10/6000.00 ms [00:42<00:24, 83.09ms/s]
Running simulation: 66%|██████▌ | 3940.50/6000.00 ms [00:43<00:24, 83.10ms/s]
Running simulation: 66%|██████▌ | 3948.90/6000.00 ms [00:43<00:24, 82.99ms/s]
Running simulation: 66%|██████▌ | 3957.20/6000.00 ms [00:43<00:24, 82.93ms/s]
Running simulation: 66%|██████▌ | 3965.50/6000.00 ms [00:43<00:24, 82.88ms/s]
Running simulation: 66%|██████▌ | 3973.80/6000.00 ms [00:43<00:24, 82.84ms/s]
Running simulation: 66%|██████▋ | 3982.10/6000.00 ms [00:43<00:24, 82.78ms/s]
Running simulation: 67%|██████▋ | 3990.50/6000.00 ms [00:43<00:24, 82.86ms/s]
Running simulation: 67%|██████▋ | 3998.90/6000.00 ms [00:43<00:24, 82.91ms/s]
Running simulation: 67%|██████▋ | 4007.20/6000.00 ms [00:43<00:24, 82.89ms/s]
Running simulation: 67%|██████▋ | 4015.60/6000.00 ms [00:43<00:23, 82.98ms/s]
Running simulation: 67%|██████▋ | 4023.90/6000.00 ms [00:44<00:23, 82.93ms/s]
Running simulation: 67%|██████▋ | 4032.30/6000.00 ms [00:44<00:23, 83.00ms/s]
Running simulation: 67%|██████▋ | 4040.60/6000.00 ms [00:44<00:23, 82.78ms/s]
Running simulation: 67%|██████▋ | 4049.00/6000.00 ms [00:44<00:23, 82.95ms/s]
Running simulation: 68%|██████▊ | 4057.30/6000.00 ms [00:44<00:23, 82.89ms/s]
Running simulation: 68%|██████▊ | 4065.60/6000.00 ms [00:44<00:23, 82.89ms/s]
Running simulation: 68%|██████▊ | 4073.90/6000.00 ms [00:44<00:23, 82.88ms/s]
Running simulation: 68%|██████▊ | 4082.20/6000.00 ms [00:44<00:23, 82.89ms/s]
Running simulation: 68%|██████▊ | 4090.60/6000.00 ms [00:44<00:23, 82.93ms/s]
Running simulation: 68%|██████▊ | 4099.00/6000.00 ms [00:45<00:22, 83.11ms/s]
Running simulation: 68%|██████▊ | 4107.40/6000.00 ms [00:45<00:22, 83.10ms/s]
Running simulation: 69%|██████▊ | 4115.80/6000.00 ms [00:45<00:22, 83.12ms/s]
Running simulation: 69%|██████▊ | 4124.20/6000.00 ms [00:45<00:22, 82.72ms/s]
Running simulation: 69%|██████▉ | 4132.60/6000.00 ms [00:45<00:22, 82.89ms/s]
Running simulation: 69%|██████▉ | 4141.00/6000.00 ms [00:45<00:22, 83.03ms/s]
Running simulation: 69%|██████▉ | 4149.40/6000.00 ms [00:45<00:22, 83.15ms/s]
Running simulation: 69%|██████▉ | 4157.80/6000.00 ms [00:45<00:22, 83.25ms/s]
Running simulation: 69%|██████▉ | 4166.20/6000.00 ms [00:45<00:22, 83.25ms/s]
Running simulation: 70%|██████▉ | 4174.60/6000.00 ms [00:45<00:21, 83.28ms/s]
Running simulation: 70%|██████▉ | 4183.00/6000.00 ms [00:46<00:21, 83.30ms/s]
Running simulation: 70%|██████▉ | 4191.40/6000.00 ms [00:46<00:21, 83.41ms/s]
Running simulation: 70%|██████▉ | 4199.80/6000.00 ms [00:46<00:21, 83.43ms/s]
Running simulation: 70%|███████ | 4208.20/6000.00 ms [00:46<00:21, 83.29ms/s]
Running simulation: 70%|███████ | 4216.60/6000.00 ms [00:46<00:21, 83.28ms/s]
Running simulation: 70%|███████ | 4225.00/6000.00 ms [00:46<00:21, 83.14ms/s]
Running simulation: 71%|███████ | 4233.40/6000.00 ms [00:46<00:21, 83.24ms/s]
Running simulation: 71%|███████ | 4241.80/6000.00 ms [00:46<00:21, 83.33ms/s]
Running simulation: 71%|███████ | 4250.20/6000.00 ms [00:46<00:20, 83.39ms/s]
Running simulation: 71%|███████ | 4258.60/6000.00 ms [00:46<00:20, 83.43ms/s]
Running simulation: 71%|███████ | 4267.00/6000.00 ms [00:47<00:20, 83.53ms/s]
Running simulation: 71%|███████▏ | 4275.40/6000.00 ms [00:47<00:20, 83.57ms/s]
Running simulation: 71%|███████▏ | 4283.80/6000.00 ms [00:47<00:20, 83.59ms/s]
Running simulation: 72%|███████▏ | 4292.20/6000.00 ms [00:47<00:20, 83.52ms/s]
Running simulation: 72%|███████▏ | 4300.60/6000.00 ms [00:47<00:20, 83.47ms/s]
Running simulation: 72%|███████▏ | 4309.00/6000.00 ms [00:47<00:20, 83.43ms/s]
Running simulation: 72%|███████▏ | 4317.40/6000.00 ms [00:47<00:20, 83.42ms/s]
Running simulation: 72%|███████▏ | 4325.80/6000.00 ms [00:47<00:20, 83.38ms/s]
Running simulation: 72%|███████▏ | 4334.20/6000.00 ms [00:47<00:19, 83.46ms/s]
Running simulation: 72%|███████▏ | 4342.60/6000.00 ms [00:47<00:19, 83.40ms/s]
Running simulation: 73%|███████▎ | 4351.00/6000.00 ms [00:48<00:19, 83.48ms/s]
Running simulation: 73%|███████▎ | 4359.40/6000.00 ms [00:48<00:19, 83.38ms/s]
Running simulation: 73%|███████▎ | 4367.80/6000.00 ms [00:48<00:19, 83.28ms/s]
Running simulation: 73%|███████▎ | 4376.20/6000.00 ms [00:48<00:19, 83.36ms/s]
Running simulation: 73%|███████▎ | 4384.60/6000.00 ms [00:48<00:19, 83.30ms/s]
Running simulation: 73%|███████▎ | 4393.00/6000.00 ms [00:48<00:19, 83.21ms/s]
Running simulation: 73%|███████▎ | 4401.40/6000.00 ms [00:48<00:19, 83.37ms/s]
Running simulation: 73%|███████▎ | 4409.80/6000.00 ms [00:48<00:19, 83.43ms/s]
Running simulation: 74%|███████▎ | 4418.20/6000.00 ms [00:48<00:18, 83.48ms/s]
Running simulation: 74%|███████▍ | 4426.60/6000.00 ms [00:48<00:18, 83.54ms/s]
Running simulation: 74%|███████▍ | 4435.00/6000.00 ms [00:49<00:18, 83.53ms/s]
Running simulation: 74%|███████▍ | 4443.40/6000.00 ms [00:49<00:18, 83.55ms/s]
Running simulation: 74%|███████▍ | 4451.80/6000.00 ms [00:49<00:18, 83.48ms/s]
Running simulation: 74%|███████▍ | 4460.20/6000.00 ms [00:49<00:18, 83.57ms/s]
Running simulation: 74%|███████▍ | 4468.60/6000.00 ms [00:49<00:18, 83.61ms/s]
Running simulation: 75%|███████▍ | 4477.00/6000.00 ms [00:49<00:18, 83.52ms/s]
Running simulation: 75%|███████▍ | 4485.40/6000.00 ms [00:49<00:18, 83.60ms/s]
Running simulation: 75%|███████▍ | 4493.80/6000.00 ms [00:49<00:18, 83.53ms/s]
Running simulation: 75%|███████▌ | 4502.20/6000.00 ms [00:49<00:17, 83.52ms/s]
Running simulation: 75%|███████▌ | 4510.60/6000.00 ms [00:49<00:17, 83.56ms/s]
Running simulation: 75%|███████▌ | 4519.00/6000.00 ms [00:50<00:17, 83.47ms/s]
Running simulation: 75%|███████▌ | 4527.40/6000.00 ms [00:50<00:17, 83.56ms/s]
Running simulation: 76%|███████▌ | 4535.80/6000.00 ms [00:50<00:17, 83.43ms/s]
Running simulation: 76%|███████▌ | 4544.20/6000.00 ms [00:50<00:17, 83.55ms/s]
Running simulation: 76%|███████▌ | 4552.60/6000.00 ms [00:50<00:17, 83.47ms/s]
Running simulation: 76%|███████▌ | 4561.00/6000.00 ms [00:50<00:17, 83.49ms/s]
Running simulation: 76%|███████▌ | 4569.40/6000.00 ms [00:50<00:17, 83.54ms/s]
Running simulation: 76%|███████▋ | 4577.80/6000.00 ms [00:50<00:17, 83.52ms/s]
Running simulation: 76%|███████▋ | 4586.20/6000.00 ms [00:50<00:16, 83.53ms/s]
Running simulation: 77%|███████▋ | 4594.60/6000.00 ms [00:50<00:16, 83.52ms/s]
Running simulation: 77%|███████▋ | 4603.00/6000.00 ms [00:51<00:16, 83.51ms/s]
Running simulation: 77%|███████▋ | 4611.40/6000.00 ms [00:51<00:16, 83.50ms/s]
Running simulation: 77%|███████▋ | 4619.80/6000.00 ms [00:51<00:16, 83.41ms/s]
Running simulation: 77%|███████▋ | 4628.20/6000.00 ms [00:51<00:16, 83.53ms/s]
Running simulation: 77%|███████▋ | 4636.60/6000.00 ms [00:51<00:16, 83.62ms/s]
Running simulation: 77%|███████▋ | 4645.00/6000.00 ms [00:51<00:16, 83.57ms/s]
Running simulation: 78%|███████▊ | 4653.40/6000.00 ms [00:51<00:16, 83.55ms/s]
Running simulation: 78%|███████▊ | 4661.80/6000.00 ms [00:51<00:16, 83.50ms/s]
Running simulation: 78%|███████▊ | 4670.20/6000.00 ms [00:51<00:15, 83.54ms/s]
Running simulation: 78%|███████▊ | 4678.60/6000.00 ms [00:51<00:15, 83.58ms/s]
Running simulation: 78%|███████▊ | 4687.00/6000.00 ms [00:52<00:15, 83.64ms/s]
Running simulation: 78%|███████▊ | 4695.40/6000.00 ms [00:52<00:15, 83.74ms/s]
Running simulation: 78%|███████▊ | 4703.80/6000.00 ms [00:52<00:15, 83.72ms/s]
Running simulation: 79%|███████▊ | 4712.20/6000.00 ms [00:52<00:15, 83.80ms/s]
Running simulation: 79%|███████▊ | 4720.60/6000.00 ms [00:52<00:15, 83.81ms/s]
Running simulation: 79%|███████▉ | 4729.00/6000.00 ms [00:52<00:15, 83.80ms/s]
Running simulation: 79%|███████▉ | 4737.40/6000.00 ms [00:52<00:15, 83.84ms/s]
Running simulation: 79%|███████▉ | 4745.80/6000.00 ms [00:52<00:14, 83.80ms/s]
Running simulation: 79%|███████▉ | 4754.30/6000.00 ms [00:52<00:14, 83.88ms/s]
Running simulation: 79%|███████▉ | 4762.70/6000.00 ms [00:52<00:14, 83.91ms/s]
Running simulation: 80%|███████▉ | 4771.10/6000.00 ms [00:53<00:14, 83.88ms/s]
Running simulation: 80%|███████▉ | 4779.60/6000.00 ms [00:53<00:14, 83.99ms/s]
Running simulation: 80%|███████▉ | 4788.00/6000.00 ms [00:53<00:14, 83.59ms/s]
Running simulation: 80%|███████▉ | 4796.40/6000.00 ms [00:53<00:14, 83.55ms/s]
Running simulation: 80%|████████ | 4804.80/6000.00 ms [00:53<00:14, 83.62ms/s]
Running simulation: 80%|████████ | 4813.20/6000.00 ms [00:53<00:14, 83.69ms/s]
Running simulation: 80%|████████ | 4821.60/6000.00 ms [00:53<00:14, 83.76ms/s]
Running simulation: 81%|████████ | 4830.00/6000.00 ms [00:53<00:13, 83.83ms/s]
Running simulation: 81%|████████ | 4838.50/6000.00 ms [00:53<00:13, 83.90ms/s]
Running simulation: 81%|████████ | 4847.00/6000.00 ms [00:53<00:13, 84.03ms/s]
Running simulation: 81%|████████ | 4855.50/6000.00 ms [00:54<00:13, 84.09ms/s]
Running simulation: 81%|████████ | 4864.00/6000.00 ms [00:54<00:13, 84.06ms/s]
Running simulation: 81%|████████ | 4872.50/6000.00 ms [00:54<00:13, 83.91ms/s]
Running simulation: 81%|████████▏ | 4881.00/6000.00 ms [00:54<00:13, 84.06ms/s]
Running simulation: 81%|████████▏ | 4889.50/6000.00 ms [00:54<00:13, 84.22ms/s]
Running simulation: 82%|████████▏ | 4898.00/6000.00 ms [00:54<00:13, 84.34ms/s]
Running simulation: 82%|████████▏ | 4906.50/6000.00 ms [00:54<00:12, 84.33ms/s]
Running simulation: 82%|████████▏ | 4915.00/6000.00 ms [00:54<00:12, 84.28ms/s]
Running simulation: 82%|████████▏ | 4923.50/6000.00 ms [00:54<00:12, 84.28ms/s]
Running simulation: 82%|████████▏ | 4932.00/6000.00 ms [00:54<00:12, 84.41ms/s]
Running simulation: 82%|████████▏ | 4940.50/6000.00 ms [00:55<00:12, 84.41ms/s]
Running simulation: 82%|████████▏ | 4949.00/6000.00 ms [00:55<00:12, 84.40ms/s]
Running simulation: 83%|████████▎ | 4957.50/6000.00 ms [00:55<00:12, 84.02ms/s]
Running simulation: 83%|████████▎ | 4966.00/6000.00 ms [00:55<00:12, 84.06ms/s]
Running simulation: 83%|████████▎ | 4974.50/6000.00 ms [00:55<00:12, 84.23ms/s]
Running simulation: 83%|████████▎ | 4983.00/6000.00 ms [00:55<00:12, 84.37ms/s]
Running simulation: 83%|████████▎ | 4991.50/6000.00 ms [00:55<00:11, 84.38ms/s]
Running simulation: 83%|████████▎ | 5000.00/6000.00 ms [00:55<00:11, 84.49ms/s]
Running simulation: 84%|████████▎ | 5013.10/6000.00 ms [00:55<00:10, 98.27ms/s]
Running simulation: 84%|████████▍ | 5026.20/6000.00 ms [00:55<00:09, 107.83ms/s]
Running simulation: 84%|████████▍ | 5039.20/6000.00 ms [00:56<00:08, 114.30ms/s]
Running simulation: 84%|████████▍ | 5052.20/6000.00 ms [00:56<00:07, 118.97ms/s]
Running simulation: 84%|████████▍ | 5065.20/6000.00 ms [00:56<00:07, 122.11ms/s]
Running simulation: 85%|████████▍ | 5078.30/6000.00 ms [00:56<00:07, 124.59ms/s]
Running simulation: 85%|████████▍ | 5091.40/6000.00 ms [00:56<00:07, 126.42ms/s]
Running simulation: 85%|████████▌ | 5104.40/6000.00 ms [00:56<00:07, 127.33ms/s]
Running simulation: 85%|████████▌ | 5117.50/6000.00 ms [00:56<00:06, 128.33ms/s]
Running simulation: 86%|████████▌ | 5130.60/6000.00 ms [00:56<00:06, 129.01ms/s]
Running simulation: 86%|████████▌ | 5143.60/6000.00 ms [00:56<00:06, 129.15ms/s]
Running simulation: 86%|████████▌ | 5156.60/6000.00 ms [00:56<00:06, 129.37ms/s]
Running simulation: 86%|████████▌ | 5169.60/6000.00 ms [00:57<00:06, 129.41ms/s]
Running simulation: 86%|████████▋ | 5182.60/6000.00 ms [00:57<00:06, 129.35ms/s]
Running simulation: 87%|████████▋ | 5195.60/6000.00 ms [00:57<00:06, 128.93ms/s]
Running simulation: 87%|████████▋ | 5208.50/6000.00 ms [00:57<00:06, 128.01ms/s]
Running simulation: 87%|████████▋ | 5221.40/6000.00 ms [00:57<00:06, 128.30ms/s]
Running simulation: 87%|████████▋ | 5234.40/6000.00 ms [00:57<00:05, 128.53ms/s]
Running simulation: 87%|████████▋ | 5247.30/6000.00 ms [00:57<00:05, 128.51ms/s]
Running simulation: 88%|████████▊ | 5260.30/6000.00 ms [00:57<00:05, 128.66ms/s]
Running simulation: 88%|████████▊ | 5273.20/6000.00 ms [00:57<00:05, 128.52ms/s]
Running simulation: 88%|████████▊ | 5286.20/6000.00 ms [00:57<00:05, 128.79ms/s]
Running simulation: 88%|████████▊ | 5299.20/6000.00 ms [00:58<00:05, 128.91ms/s]
Running simulation: 89%|████████▊ | 5312.10/6000.00 ms [00:58<00:05, 128.62ms/s]
Running simulation: 89%|████████▉ | 5325.00/6000.00 ms [00:58<00:05, 128.64ms/s]
Running simulation: 89%|████████▉ | 5337.90/6000.00 ms [00:58<00:05, 128.63ms/s]
Running simulation: 89%|████████▉ | 5350.80/6000.00 ms [00:58<00:05, 128.52ms/s]
Running simulation: 89%|████████▉ | 5363.70/6000.00 ms [00:58<00:04, 128.51ms/s]
Running simulation: 90%|████████▉ | 5376.70/6000.00 ms [00:58<00:04, 128.76ms/s]
Running simulation: 90%|████████▉ | 5389.70/6000.00 ms [00:58<00:04, 128.87ms/s]
Running simulation: 90%|█████████ | 5402.70/6000.00 ms [00:58<00:04, 129.03ms/s]
Running simulation: 90%|█████████ | 5415.70/6000.00 ms [00:58<00:04, 129.07ms/s]
Running simulation: 90%|█████████ | 5428.70/6000.00 ms [00:59<00:04, 128.73ms/s]
Running simulation: 91%|█████████ | 5441.60/6000.00 ms [00:59<00:04, 128.74ms/s]
Running simulation: 91%|█████████ | 5454.50/6000.00 ms [00:59<00:04, 128.56ms/s]
Running simulation: 91%|█████████ | 5467.40/6000.00 ms [00:59<00:04, 128.61ms/s]
Running simulation: 91%|█████████▏| 5480.40/6000.00 ms [00:59<00:04, 128.82ms/s]
Running simulation: 92%|█████████▏| 5493.30/6000.00 ms [00:59<00:03, 128.71ms/s]
Running simulation: 92%|█████████▏| 5506.20/6000.00 ms [00:59<00:03, 128.60ms/s]
Running simulation: 92%|█████████▏| 5519.10/6000.00 ms [00:59<00:03, 128.52ms/s]
Running simulation: 92%|█████████▏| 5532.00/6000.00 ms [00:59<00:03, 128.52ms/s]
Running simulation: 92%|█████████▏| 5545.00/6000.00 ms [00:59<00:03, 128.87ms/s]
Running simulation: 93%|█████████▎| 5558.00/6000.00 ms [01:00<00:03, 129.04ms/s]
Running simulation: 93%|█████████▎| 5571.00/6000.00 ms [01:00<00:03, 129.06ms/s]
Running simulation: 93%|█████████▎| 5584.00/6000.00 ms [01:00<00:03, 128.71ms/s]
Running simulation: 93%|█████████▎| 5596.90/6000.00 ms [01:00<00:03, 128.76ms/s]
Running simulation: 93%|█████████▎| 5609.90/6000.00 ms [01:00<00:03, 128.94ms/s]
Running simulation: 94%|█████████▎| 5622.90/6000.00 ms [01:00<00:02, 129.01ms/s]
Running simulation: 94%|█████████▍| 5635.90/6000.00 ms [01:00<00:02, 129.08ms/s]
Running simulation: 94%|█████████▍| 5648.90/6000.00 ms [01:00<00:02, 129.09ms/s]
Running simulation: 94%|█████████▍| 5661.90/6000.00 ms [01:00<00:02, 128.85ms/s]
Running simulation: 95%|█████████▍| 5674.80/6000.00 ms [01:01<00:02, 128.62ms/s]
Running simulation: 95%|█████████▍| 5687.80/6000.00 ms [01:01<00:02, 128.79ms/s]
Running simulation: 95%|█████████▌| 5700.80/6000.00 ms [01:01<00:02, 128.96ms/s]
Running simulation: 95%|█████████▌| 5713.70/6000.00 ms [01:01<00:02, 128.81ms/s]
Running simulation: 95%|█████████▌| 5726.60/6000.00 ms [01:01<00:02, 128.68ms/s]
Running simulation: 96%|█████████▌| 5739.50/6000.00 ms [01:01<00:02, 128.57ms/s]
Running simulation: 96%|█████████▌| 5752.40/6000.00 ms [01:01<00:01, 128.43ms/s]
Running simulation: 96%|█████████▌| 5765.30/6000.00 ms [01:01<00:01, 128.48ms/s]
Running simulation: 96%|█████████▋| 5778.20/6000.00 ms [01:01<00:01, 128.58ms/s]
Running simulation: 97%|█████████▋| 5791.10/6000.00 ms [01:01<00:01, 128.64ms/s]
Running simulation: 97%|█████████▋| 5804.00/6000.00 ms [01:02<00:01, 128.63ms/s]
Running simulation: 97%|█████████▋| 5816.90/6000.00 ms [01:02<00:01, 128.50ms/s]
Running simulation: 97%|█████████▋| 5829.80/6000.00 ms [01:02<00:01, 128.62ms/s]
Running simulation: 97%|█████████▋| 5842.70/6000.00 ms [01:02<00:01, 128.68ms/s]
Running simulation: 98%|█████████▊| 5855.60/6000.00 ms [01:02<00:01, 128.76ms/s]
Running simulation: 98%|█████████▊| 5868.50/6000.00 ms [01:02<00:01, 128.60ms/s]
Running simulation: 98%|█████████▊| 5881.40/6000.00 ms [01:02<00:00, 128.60ms/s]
Running simulation: 98%|█████████▊| 5894.30/6000.00 ms [01:02<00:00, 128.58ms/s]
Running simulation: 98%|█████████▊| 5907.30/6000.00 ms [01:02<00:00, 128.76ms/s]
Running simulation: 99%|█████████▊| 5920.30/6000.00 ms [01:02<00:00, 128.91ms/s]
Running simulation: 99%|█████████▉| 5933.20/6000.00 ms [01:03<00:00, 128.89ms/s]
Running simulation: 99%|█████████▉| 5946.20/6000.00 ms [01:03<00:00, 129.05ms/s]
Running simulation: 99%|█████████▉| 5959.20/6000.00 ms [01:03<00:00, 128.93ms/s]
Running simulation: 100%|█████████▉| 5972.20/6000.00 ms [01:03<00:00, 129.01ms/s]
Running simulation: 100%|█████████▉| 5985.20/6000.00 ms [01:03<00:00, 129.11ms/s]
Running simulation: 100%|█████████▉| 5998.20/6000.00 ms [01:03<00:00, 128.66ms/s]
Running simulation: 100%|██████████| 6000.00/6000.00 ms [01:03<00:00, 94.44ms/s]
Convert Spike Data to Neo Format#
Process recorded spike times into Neo data structures.
spike_train_block = Block(name="Trapezoidal Contraction Spike Trains")
dd_segment = Segment(name="Descending Drive")
dd_segment.spiketrains = [
SpikeTrain(
(spike_times * pq.ms).rescale(pq.s),
t_stop=(simulation_time * pq.ms).rescale(pq.s),
sampling_rate=(1 / (h.dt * pq.ms)).rescale(pq.Hz),
sampling_period=(h.dt * pq.ms).rescale(pq.s),
name=f"DD_{i}",
)
for i, spike_times in enumerate(dd_spike_times)
]
mn_segment = Segment(name="Motor Neurons")
mn_segment.spiketrains = [
SpikeTrain(
(recorder.as_numpy() * pq.ms).rescale(pq.s),
t_stop=(simulation_time * pq.ms).rescale(pq.s),
sampling_rate=(1 / (h.dt * pq.ms)).rescale(pq.Hz),
sampling_period=(h.dt * pq.ms).rescale(pq.s),
name=f"MN_{i}",
)
for i, recorder in enumerate(mn_spike_recorders)
]
# Save motor neuron spike trains
spike_train_block.segments.append(mn_segment)
joblib.dump(spike_train_block, RESULTS_DIR / f"{STUDY_PREFIX}trapezoidal_spike_trains.pkl")
['/home/runner/work/MyoGen/MyoGen/results/TEST_trapezoidal_spike_trains.pkl']
Calculate Firing Rate Statistics#
print("\nFiring rate analysis:")
# Calculate DD firing rates
dd_firing_rates = np.array(
[
elephant.statistics.mean_firing_rate(st__s.time_slice(st__s.min(), st__s.max()))
for st__s in dd_segment.spiketrains
if len(st__s) > 0
]
)
# Calculate MN firing rates
mn_firing_rates = np.array(
[
elephant.statistics.mean_firing_rate(st__s.time_slice(st__s.min(), st__s.max()))
for st__s in mn_segment.spiketrains
if len(st__s) > 0
]
)
print("Descending Drive neurons:")
print(f"\tActive neurons: {len(dd_firing_rates)}/{descending_drive_pool.n}")
if len(dd_firing_rates) > 0:
print(f"\tMean firing rate: {np.mean(dd_firing_rates):.1f} ± {np.std(dd_firing_rates):.1f} Hz")
print(f"\tRate range: {np.min(dd_firing_rates):.1f} - {np.max(dd_firing_rates):.1f} Hz")
print("Motor neurons:")
print(f"\tActive neurons: {len(mn_firing_rates)}/{motor_neuron_pool.n}")
if len(mn_firing_rates) > 0:
print(f"\tMean firing rate: {np.mean(mn_firing_rates):.1f} ± {np.std(mn_firing_rates):.1f} Hz")
print(f"\tRate range: {np.min(mn_firing_rates):.1f} - {np.max(mn_firing_rates):.1f} Hz")
Firing rate analysis:
Descending Drive neurons:
Active neurons: 379/379
Mean firing rate: 16.8 ± 1.3 Hz
Rate range: 12.9 - 20.1 Hz
Motor neurons:
Active neurons: 60/100
Mean firing rate: inf ± nan Hz
Rate range: 1.7 - inf Hz
Calculate and Save ISI/CV Statistics#
Calculate ISI and CV for each motor unit and save to CSV file
# Calculate ISI/CV statistics for motor neurons
print("\nCalculating ISI and CV statistics...")
print(f"\tAnalyzing only plateau phase: {ramp_up_end:.1f} - {plateau_end:.1f} ms")
isi_cv_df = calculate_firing_rate_statistics(
mn_segment.spiketrains,
plateau_start_ms=ramp_up_end,
plateau_end_ms=plateau_end,
return_per_neuron=True,
min_spikes_for_cv=3,
)
# Save ISI/CV statistics to CSV
output_file = RESULTS_DIR / f"{STUDY_PREFIX}isi_cv_data_{MUSCLE_TYPE}_{MVC_LEVEL}.csv"
isi_cv_df.to_csv(output_file, index=False)
print(f"\nSaved ISI/CV data to: {output_file}")
print(f"\tTotal motor units analyzed: {len(isi_cv_df)}")
if len(isi_cv_df) > 0:
print(f"\tMean firing rate: {isi_cv_df['mean_firing_rate_Hz'].mean():.2f} Hz")
print(f"\tMean CV: {isi_cv_df['CV_ISI'].mean():.3f}")
Calculating ISI and CV statistics...
Analyzing only plateau phase: 2000.0 - 4000.0 ms
Saved ISI/CV data to: /home/runner/work/MyoGen/MyoGen/results/TEST_isi_cv_data_TEST_30.csv
Total motor units analyzed: 58
Mean firing rate: 10.46 Hz
Mean CV: 0.157
Visualize Drive Pattern and Spike Trains#
Create verification plots showing drive input and resulting neural activity.
print("\nCreating verification plots...")
colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]
# Create figure with 2 subplots
fig, axes = plt.subplots(2, 1, figsize=(14, 10), sharex=True)
# 1. Drive pattern
time_s = trapezoid_drive__signal.times.rescale(pq.s).magnitude
axes[0].plot(time_s, trapezoid_drive__signal, linewidth=2, label="DD Input")
axes[0].axhline(dd_baseline__Hz, linestyle="--", alpha=0.7, label="Baseline")
axes[0].set_ylabel("Drive (Hz)")
axes[0].set_title(
f"Trapezoidal Drive Pattern (Optimized DD: {DD_PEAK__Hz:.1f} Hz, "
f"Gamma shape: {DD_SHAPE_PARAMETER:.2f})"
)
axes[0].legend(framealpha=1.0, edgecolor="none")
axes[0].grid(True, alpha=0.3)
# 2. Motor neuron raster plot (recruitment ordered)
mn_colors = plt.cm.get_cmap("Reds")(np.linspace(0.3, 0.9, len(mn_segment.spiketrains)))
active_mn_count = 0
for i, (spiketrain, color) in enumerate(zip(mn_segment.spiketrains, mn_colors)):
if len(spiketrain) > 0:
spike_times = spiketrain.rescale(pq.s).magnitude
axes[1].scatter(spike_times, [i] * len(spike_times), c=[color], s=1.0, alpha=0.8)
active_mn_count += 1
axes[1].set_xlabel("Time (s)")
axes[1].set_ylabel("Motor Neuron ID\n(Recruitment Order)")
axes[1].set_title(f"Motor Neuron Activity (n={active_mn_count}/{motor_neuron_pool.n} active)")
axes[1].set_ylim(-1, motor_neuron_pool.n)
axes[1].grid(True, alpha=0.3)
# Format all axes
for ax in axes:
ax.set_xlim(0, simulation_time / 1000.0)
plt.tight_layout()
plt.savefig(
RESULTS_DIR / f"{STUDY_PREFIX}simulation_verification_{MUSCLE_TYPE}_{MVC_LEVEL}.png",
dpi=150,
bbox_inches="tight",
)
plt.show()

Creating verification plots...
Individual Motor Neuron Discharge Rates#
Compute smoothed instantaneous firing rates for each motor neuron using a Hanning window (similar to 01_simulate_spike_trains_descending_drive.py)
print("\nComputing smoothed discharge rates per neuron...")
# Smoothing parameters
window_ms = 400 # 400 ms Hanning window
dt_s = TIMESTEP__ms / 1000.0 # simulation timestep in seconds
window_samples = int(window_ms / 1000.0 / dt_s)
# Hanning window normalized to preserve rate
hanning_window = np.hanning(window_samples)
hanning_window = hanning_window / (hanning_window.sum() * dt_s) # convert to Hz
mn_instantaneous_rates = []
active_neuron_ids = []
for i, spiketrain in enumerate(mn_segment.spiketrains):
if len(spiketrain) > 2:
# Convert spike times to a binary spike train
t = np.arange(0, simulation_time / 1000.0, dt_s)
spikes = np.zeros_like(t)
spike_indices = np.searchsorted(t, spiketrain.rescale(pq.s).magnitude)
spikes[spike_indices[spike_indices < len(t)]] = 1
# Convolve with Hanning window
rate = np.convolve(spikes, hanning_window, mode="same")
mn_instantaneous_rates.append(rate)
active_neuron_ids.append(i)
print(f"\tComputed rates for {len(active_neuron_ids)} active motor neurons")
# Create figure for discharge rate visualizations
fig2, axes2 = plt.subplots(2, 1, figsize=(15, 10), sharex=True)
# 1. Heatmap of instantaneous firing rates
if len(mn_instantaneous_rates) > 0:
# Stack rates into 2D array (neurons x time)
rates_array = np.array(mn_instantaneous_rates)
time_points_arr = np.linspace(0, simulation_time / 1000.0, rates_array.shape[1])
# Plot heatmap
im = axes2[0].imshow(
rates_array,
aspect="auto",
cmap="hot",
interpolation="bilinear",
extent=[0, simulation_time / 1000.0, 0, len(active_neuron_ids)],
origin="lower",
vmin=0,
vmax=np.percentile(rates_array, 95), # Cap at 95th percentile
)
axes2[0].set_ylabel("Motor Neuron ID\n(Recruitment Order)")
axes2[0].set_title(
f"Individual Motor Neuron Discharge Rates - {MUSCLE_TYPE} @ {MVC_LEVEL}% MVC\n"
f"(Smoothed with {window_ms}ms Hanning Window)"
)
# Add colorbar
cbar = plt.colorbar(im, ax=axes2[0])
cbar.set_label("Firing Rate (Hz)")
axes2[0].grid(False)
# 2. Individual traces (show all active neurons)
n_to_plot = len(active_neuron_ids)
# Use colormap for lines (gradient showing recruitment order)
colors = plt.cm.get_cmap("rainbow")(np.linspace(0, 1, n_to_plot))
for neuron_idx in range(n_to_plot):
axes2[1].plot(
time_points_arr,
mn_instantaneous_rates[neuron_idx],
linewidth=0.8,
color=colors[neuron_idx],
label=f"MN {active_neuron_ids[neuron_idx]}" if n_to_plot <= 20 else None,
)
axes2[1].set_xlabel("Time (s)")
axes2[1].set_ylabel("Firing Rate (Hz)")
axes2[1].set_title(f"All Motor Neuron Discharge Rates (n={n_to_plot})")
# Only show legend if there are few neurons
if n_to_plot <= 20:
axes2[1].legend(loc="upper right", ncol=3, framealpha=1.0, edgecolor="none")
axes2[1].grid(True, alpha=0.3)
axes2[1].set_xlim(0, simulation_time / 1000.0)
axes2[1].set_ylim(0, np.max(rates_array) * 1.1)
plt.tight_layout()
discharge_plot_path = RESULTS_DIR / f"{STUDY_PREFIX}discharge_rates_{MUSCLE_TYPE}_{MVC_LEVEL}.png"
plt.savefig(discharge_plot_path, dpi=150, bbox_inches="tight")
plt.show()
print(f"\nSaved discharge rate plot to: {discharge_plot_path}")

Computing smoothed discharge rates per neuron...
Computed rates for 58 active motor neurons
Saved discharge rate plot to: /home/runner/work/MyoGen/MyoGen/results/TEST_discharge_rates_TEST_30.png
Total running time of the script: (1 minutes 14.994 seconds)