Communitygithub.com

SimPy

Construire, inspecter, tester et analyser des simulations à événements discrets orientées processus avec SimPy, incluant les événements, ressources, interruptions, suivi, réplications, échauffement et analyse de sortie reproductible.

Qu'est-ce que SimPy ?

Cette compétence fournit une couverture complète de SimPy 4.1.2, la bibliothèque de simulation à événements discrets pour Python, orientée modélisation par processus. Elle est conçue pour les ingénieurs et chercheurs qui construisent des modèles dans des domaines comme les files d'attente, les systèmes de production, la logistique, les réseaux, les services ou les stocks. La compétence guide pas à pas depuis la définition du problème jusqu'à l'analyse des réplications, en insistant sur une méthodologie scientifique rigoureuse : séparation des générateurs aléatoires, bornes explicites d'exécution, instrumentation non-intrusive et validation. Elle détaille la sémantique centrale de SimPy (Environment, Event, Process, Conditions, Interruptions), ainsi que tous les types de ressources partagées (Resource, PriorityResource, PreemptiveResource, Container, Store, FilterStore, PriorityStore). Elle intègre également des outils en ligne de commande sûrs (scénarios de file d'attente, lanceur de réplications, validation de configuration), des scripts de monitoring et des liens vers des références spécialisées. L'approche est neutre et évite les affirmations causales abusives ; elle rappelle que la validé scientifique du modèle conceptuel relève de l'utilisateur, pas de l'API SimPy.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/simpy

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait SimPy ?

Portée

Utilisez cette compétence pour les modèles à événements discrets orientés processus où des entités actives produisent des événements et entrent en compétition pour des ressources : files d'attente, systèmes de production, logistique, réseaux, services, stocks et autres systèmes pilotés par événements.

SimPy fournit un ordonnanceur d'événements et des primitives de modélisation. Il ne choisit pas de modèle conceptuel scientifiquement valide, de distribution d'entrée, de période d'échauffement, de durée d'exécution, de nombre de réplications, d'estimateur ou d'interprétation causale. Ceux-ci relèvent de la méthodologie d'étude de simulation, et non du comportement de l'API SimPy.

Version actuelle et installation

Vérifié le 2026-07-23 :

  • Dernière version stable : SimPy 4.1.2, publiée sur PyPI le 2026-05-24 ; le tag source 4.1.2 pointe vers le commit f4381649.
  • Les métadonnées du paquet exigent Python >=3.8 et classifient CPython 3.8-3.14 plus PyPy. SimPy n'a aucune dépendance d'exécution.
  • La version 4.1.2 ajoute la prise en charge de Python 3.13/3.14 et des correctifs de tests pour les interprètes modernes.
  • Cette compétence et son amont sont sous licence MIT.

Créez un environnement reproductible :

uv venv --python 3.13
source .venv/bin/activate
uv pip install "simpy==4.1.2"
python -c "import importlib.metadata; print(importlib.metadata.version('simpy'))"

Ne substituez pas silencieusement la version latest de la documentation : elle peut décrire une révision de développement non publiée. Utilisez les liens versionnés 4.1.2 dans references/sources.md.

Workflow de modélisation

  1. Définir l'objectif et les estimateurs. Énoncer la décision/question, les limites du système, les entités, les ressources, l'état, les sorties, l'unité de temps, et l'événement de terminaison ou la cible en régime stationnaire.
  2. Écrire d'abord un modèle conceptuel. Enregistrer les hypothèses, les distributions, le routage, les priorités, les conditions initiales et les mécanismes omis.
  3. Implémenter des générateurs. Un processus SimPy est un générateur Python produisant des événements. Enregistrer l'objet générateur avec env.process(...).
  4. Borner l'exécution. Donner à chaque lancement de production des limites explicites de temps, d'entités, d'événements et de réplications. Ne jamais appeler env.run() sur un modèle contenant un processus infini.
  5. Séparer les flux aléatoires. Utiliser des instances RNG locales pour des sources stochastiques logiquement distinctes ; conserver un manifeste des graines.
  6. Instrumenter délibérément. Observer l'état après la transition d'intérêt, fermer les intervalles pondérés par le temps à l'horizon, et tester que le suivi ne modifie pas l'ordre des événements.
  7. Vérifier et valider. Tester les cas limites déterministes, les identités de conservation, les traces, la discipline de file d'attente et les benchmarks analytiques ; comparer avec les preuves du système ou d'experts pour l'objectif énoncé.
  8. Exécuter des réplications indépendantes. Calculer les intervalles à partir des estimations au niveau des réplications, pas des entités corrélées au sein d'une même exécution.
  9. Rapporter les limites. Inclure l'initialisation, les entités non terminées, la durée d'exécution, les graines/flux, la précision, la sensibilité et les preuves de validation. Ne jamais convertir une association de simulation en affirmation causale.

Consultez references/simulation-methodology.md avant de faire des affirmations inférentielles.

Modèle borné minimal

import random
import simpy

HORIZON = 480.0
arrival_rng = random.Random(101)
service_rng = random.Random(202)
env = simpy.Environment()
server = simpy.Resource(env, capacity=2)
completed = []

def customer(arrival):
    with server.request() as request:
        yield request
        wait = env.now - arrival
        yield env.timeout(service_rng.expovariate(1 / 6.0))
    completed.append((env.now, wait))

def arrivals():
    for _ in range(10_000):  # Limite d'entités.
        delay = arrival_rng.expovariate(1 / 4.0)
        if env.now + delay >= HORIZON:
            return
        yield env.timeout(delay)
        env.process(customer(env.now))

env.process(arrivals())
env.run(until=HORIZON)

L'horizon numérique est semi-ouvert : les événements normaux planifiés exactement à 480.0 ne sont pas traités. Signalez les entités non terminées plutôt que de les traiter silencieusement comme des observations achevées.

Sémantique de base

Environnement et ordre déterministe

Environment est mono-thread. La file d'attente est ordonnée par temps de simulation, priorité de l'événement, puis un identifiant d'événement strictement croissant. Les événements de même temps et même priorité sont donc traités FIFO dans l'ordre de planification. Les processus du modèle peuvent représenter de la concurrence, mais les callbacks s'exécutent séquentiellement et de manière déterministe.

  • env.now : horloge de simulation sans unité ; choisir et documenter une unité.
  • env.peek() : temps du prochain événement ou infini.
  • env.step() : traite un événement ; lève EmptySchedule si la file est vide.
  • env.active_process : processus en cours d'exécution, sinon None.
  • env.run() : vide la file ; dangereux avec des processus récurrents ou infinis.

env.run(until=nombre) et env.run(until=événement) ne sont pas interchangeables aux limites :

  • Une valeur numérique planifie un événement d'arrêt urgent et exclut les événements ordinaires à ce temps exact.
  • Un critère Event retourne la valeur de cet événement lorsque son callback d'arrêt se déclenche. L'ordre des autres événements au même temps dépend de la priorité et de l'ordre de planification.
  • Dans 4.1.2, Environment.step() préserve les callbacks restants après StopSimulation en replanifiant la cible. Par conséquent, après env.run(until=cible), cible.processed peut rester False jusqu'à un appel supplémentaire de step()/run() même si sa valeur a été retournée. N'utilisez pas processed comme seul test d'achèvement après l'exécution.

Voir references/events.md et references/monitoring.md.

Event, Timeout, Process et Condition

  • Un Event passe une fois par les états non déclenché -> déclenché/planifié -> traité. succeed(valeur) ou fail(exception) le déclenche une fois.
  • Un Timeout se déclenche lors de sa création, est planifié pour now + délai et ne peut pas être manuellement succédé à nouveau.
  • env.process(generateur) crée un Process ; le générateur reprend avec la valeur de l'événement qu'il a produit. Le retour du générateur succède au Process avec cette valeur de retour. Les exceptions non capturées le font échouer.
  • AnyOf / a | b et AllOf / a & b produisent une ConditionValue : un mapping ordonné de type dictionnaire depuis des objets événement vers leurs valeurs. Testez l'appartenance en utilisant les objets événement originaux ; ne supposez pas un résultat scalaire.
  • AnyOf n'annule pas les événements perdants. Annulez explicitement les demandes de ressource en attente lorsque vous les abandonnez ; les timeouts ordinaires restent planifiés.

Interruptions

process.interrupt(cause) planifie une interruption urgente qui lève simpy.Interrupt dans le générateur cible. Attrapez-la autour du travail produit qui peut être interrompu, inspectez interrupt.cause, mettez à jour le travail restant, puis reprenez, re-produisez l'événement original, ou terminez.

Interrompre un processus supprime son callback de reprise de sa cible actuelle ; cela n'annule pas cet événement cible. Un processus ne peut pas s'interrompre lui-même ni interrompre un processus terminé. Voir references/process-interaction.md.

Ressources partagées

TypeSémantique
ResourceCréneaux d'utilisation de type sémaphore FIFO
PriorityResourceDemandes en file triées par priorité numérique croissante
PreemptiveResourceFile de priorité plus préemption optionnelle d'un utilisateur courant
ContainerNiveau numérique homogène ; put/get attendent la capacité/le matériau
StoreObjets Python FIFO
FilterStorePremier élément disponible satisfaisant le prédicat de la demande
PriorityStoreÉléments comparables retournés par ordre de priorité

Utilisez un gestionnaire de contexte de demande :

def job(env, resource):
    with resource.request() as request:
        yield request
        yield env.timeout(3)

En sortie, il libère une demande acquise ou annule une demande toujours en attente, y compris lors du déroulement de la pile d'exception. Pour un put/get/request en attente conservé manuellement, appelez cancel() si une interruption ou un timeout fait que le processus l'abandonne.

PreemptiveResource.request(priority=..., preempt=True) utilise les nombres plus petits comme priorité plus élevée. Le processus préempté reçoit une Interrupt dont la cause est un objet Preempted : cause.by est le Processus préempteur, cause.usage_since est le moment où l'utilisation a commencé, et cause.resource est la ressource. La priorité de la file prime sur le drapeau preempt ; mélanger des demandes avec et sans préemption nécessite des tests explicites.

Consultez references/resources.md pour les opérations bloquées, les règles de file et les exemples.

Suivi et progression pas à pas

Préférez les observations explicites du domaine aux transitions d'état. Pour le suivi générique des ressources, des wrappers ou sous-classes peuvent inspecter count, queue, level, items, put_queue et get_queue. Pour le traçage d'événements, schedule() et step() sont les points d'accroche centraux.

Les mesures de file d'attente sont sensibles au temps :

  • L'état pré-appel d'une méthode de demande, l'état post-appel, le callback d'octroi et le callback de libération peuvent tous différer au même horodatage de simulation.
  • Les moyennes d'échantillonnage pondèrent les observations d'événements, pas le temps. Calculez l'aire sous le chemin d'état continu à gauche et divisez par le temps écoulé.
  • Ajoutez des échantillons initiaux et finaux ; fermez le dernier intervalle à l'horizon d'analyse.
  • env._queue, la ressource _env et le monkey-patching sont des détails d'implémentation. Figez SimPy, isolez l'instrumentation et effectuez des tests de régression après les mises à jour.
  • Tracer chaque événement change les performances et l'utilisation mémoire ; limitez les enregistrements de trace.

Utilisez scripts/resource_monitor.py et references/monitoring.md.

Exécution en temps réel

simpy.rt.RealtimeEnvironment(initial_time=0, factor=1.0, strict=True) mappe une unité de simulation à factor secondes de temps réel. En mode strict, step()/run() lève RuntimeError lorsque le calcul prend du retard. strict=False tolère le retard ; il ne rétablit pas la précision temporelle. Développez la logique avec Environment, puis exécutez des tests de synchronisation séparés avec des tolérances généreuses dépendant de la plateforme. Voir references/real-time.md.

CLI sécurisées intégrées

Toutes les CLI utilisent un modèle de file d'attente intégré fixe ou résument des artefacts locaux. Elles rejettent les clés JSON inconnues, les URL, les liens symboliques, les nombres non finis, les entrées surdimensionnées et les limites de temps/événements/entités/réplications non bornées. Elles n'évaluent jamais de texte de configuration, n'exécutent pas de Python utilisateur, n'importent pas de plugins et n'appellent pas de service réseau.

# Inspecter toutes les options.
python skills/simpy/scripts/bounded_queue_scenario.py --help
python skills/simpy/scripts/replication_runner.py --help
python skills/simpy/scripts/event_trace_summary.py --help
python skills/simpy/scripts/validate_simulation_config.py --help

# Scénario intégré déterministe.
python skills/simpy/scripts/bounded_queue_scenario.py

# Réplications indépendantes avec intervalles de Student au niveau réplication.
python skills/simpy/scripts/replication_runner.py

# Validation uniquement ; aucune exécution de simulation.
python skills/simpy/scripts/validate_simulation_config.py config.json

Le lanceur de réplications refuse les intervalles à une seule réplication. Ses intervalles quantifient l'incertitude Monte Carlo sous le modèle configuré ; ils ne valident ni le modèle ni n'identifient d'effets causaux. Voir references/cli-guide.md.

Tests

Utilisez des tests unitaires déterministes pour l'ordre, les temps limites, les conditions, les interruptions, toutes les disciplines de ressources, la conservation, les limites d'événements/entités, la reproductibilité des graines et la non-interférence du suivi. Ajoutez des tests stochastiques uniquement comme vérifications larges de distribution avec des graines fixes ; évitez les estimations d'échantillons exactes fragiles.

Exécutez la suite de la compétence dans l'environnement exact figé sans artefacts bytecode :

PYTHONDONTWRITEBYTECODE=1 uv run --isolated --no-project \
  --python 3.13 --with "simpy==4.1.2" \
  python -m unittest discover -s tests/simpy -v

Références

  • references/events.md — ordonnanceur, cycle de vie, limites d'exécution, conditions
  • references/process-interaction.md — générateurs, événements partagés, interruptions
  • references/resources.md — toutes les variantes Resource, Container et Store
  • references/monitoring.md — pondération temporelle, chronométrage de file d'attente, traçage, progression
  • references/real-time.md — facteur, mode strict, dérive, tests de synchronisation
  • references/simulation-methodology.md — réplications, échauffement, validation, IC
  • references/cli-guide.md — schémas, bornes, sorties et exemples CLI sécurisés
  • references/sources.md — sources officielles datées et de méthode primaire

Citation des compétences d'agent scientifique

Cette compétence fait partie des Scientific Agent Skills par K-Dense. Si elle a contribué de manière substantielle à un manuscrit, rapport, présentation ou publication de code, ajoutez le document aux références ou à la section logicielle et informez l'utilisateur que vous l'avez fait :

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

Citez toujours la version actuelle. Le DOI et https://arxiv.org/abs/2609.00065 pointent vers la dernière version arXiv, n'ajoutez donc jamais de suffixe de version tel que v1. Lorsque l'accès réseau est disponible, récupérez https://arxiv.org/abs/2609.00065 (ou http://export.arxiv.org/api/query?id_list=2609.00065) avant d'écrire la référence et prenez la liste des auteurs, l'année et la version à partir de cet enregistrement. Si l'enregistrement mentionne une référence de journal ou un DOI d'éditeur, citez la version publiée à la place.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

adaptyv

How to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit protein sequences for experimental characterization. Also trigger when code imports `adaptyv`, `adaptyv_sdk`, or `FoundryClient`, or references `foundry-api-public.adaptyvbio.com`.

aeon

This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.

alphagenome

Look up precomputed AlphaGenome Atlas effects for any GRCh38 single-nucleotide variant (AVI score with Phred and 18 SHAP feature attributions, plus raw and quantile scores for RNA-seq, DNase, ATAC, ChIP-TF, ChIP-histone, CAGE, PRO-cap, splicing, polyadenylation and contact-map tracks), score variants or scan windows on demand with the AlphaGenome model for human and mouse (variant scoring, in silico mutagenesis, REF-versus-ALT track prediction), and build Atlas website deep links. Use when the user mentions AlphaGenome, AlphaGenome Atlas, AVI or AlphaGenome Variant Impact, DeepMind variant effect prediction, or wants to prioritise or mechanistically interpret non-coding, regulatory, splicing, enhancer, promoter, or chromatin-accessibility effects of SNVs from a VCF, credible set, or region. Research use only; not a clinical tool.

analytical-method-validation

Plan, execute, and document validation, verification, and transfer of analytical procedures under the governing framework - ICH Q2(R2) and Q14, USP <1220>/<1225>/<1226>, ICH M10 bioanalytical, CLSI EP, or ISO/IEC 17025. Use for HPLC, LC-MS/MS, GC, CE, ICP-MS, dissolution, qNMR, qPCR, NIR, and ligand binding or cell-based assays whenever the question is whether a procedure is fit for its intended purpose. Triggers include

anndata

Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.

arbor

Autonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree Refinement (HTR) from the Arbor paper. Use this whenever someone wants to iteratively optimize something over many experiments without overfitting — e.g.

arboreto

Infer gene regulatory networks (GRNs) from gene expression data using scalable algorithms (GRNBoost2, GENIE3). Use when analyzing transcriptomics data (bulk RNA-seq, single-cell RNA-seq) to identify transcription factor-target gene relationships and regulatory interactions. Supports distributed computation for large-scale datasets.

astropy

Core Python library for astronomy and astrophysics workflows that need Astropy APIs, including units/quantities, coordinates, FITS I/O, tables, time systems, WCS, and cosmology. Use when implementing or debugging astronomical data analysis code with Astropy.

autoskill

Observe the user

benchling-integration

Benchling Python SDK and REST API integration for registry entities, inventory, ELN entries, workflows, Benchling Apps, and Data Warehouse queries. Use when automating lab data with benchling-sdk or the v2 API.

bgpt-paper-search

Search scientific papers and retrieve structured experimental data extracted from full-text studies via the BGPT MCP server. Returns 25+ fields per paper including methods, results, sample sizes, quality scores, and conclusions. Use for literature reviews, evidence synthesis, and finding experimental details not available in abstracts alone.

bids

>

biopython

Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.

bioservices

Unified Python interface to 40+ bioinformatics services. Use when querying multiple databases (UniProt, KEGG, ChEMBL, Reactome) in a single workflow with consistent API. Best for cross-database analysis, ID mapping across services. For quick single-database lookups use gget; for sequence/file manipulation use biopython.

bulk-rnaseq

End-to-end bulk RNA-seq orchestrator — takes raw FASTQ reads through QC and trimming (FastQC, fastp/Trim Galore), alignment and quantification (STAR, Salmon, featureCounts), assembles a gene-level counts matrix, then hands off to differential expression (pydeseq2), pathway/GSEA enrichment (pathway-enrichment), and publication figures (scientific-visualization). Use whenever the user has bulk RNA-seq reads or quant output and wants a complete, reproducible differential-expression workflow — e.g.

cellxgene-census

Query the CZ CELLxGENE Census programmatically for versioned public single-cell and spatial transcriptomics data. Use when you need population-scale cell metadata, gene expression slices, Census summary counts, source H5AD URIs/downloads, embeddings, spatial Census data, or reference atlas comparisons across organisms, tissues, diseases, assays, and cell types. For analyzing your own local single-cell data use scanpy, anndata, or scvi-tools.

cirq

Google quantum computing framework. Use when targeting Google Quantum AI hardware, designing noise-aware circuits, or running quantum characterization experiments. Best for Google hardware, noise modeling, and low-level circuit design. For IBM hardware use qiskit; for quantum ML with autodiff use pennylane; for physics simulations use qutip.

citation-management

Comprehensive citation management for academic research. Search OpenAlex, PubMed, and Google Scholar for papers, extract accurate metadata, validate citations, and generate properly formatted BibTeX entries. This skill should be used when you need to find papers, verify citation information, convert DOIs to BibTeX, or ensure reference accuracy in scientific writing.

clinical-decision-support

Prepare and validate research-only clinical decision-support evaluation, evidence-profile, cohort, survival, biomarker/model, privacy, and governance artifacts. Use for aggregate or synthetic research documentation and traceability—not patient care or live clinical operation.

clinical-reports

Create safety-bounded draft structures and run local deterministic checks for clinical case, diagnostic, trial, safety, and aggregate research reports. Use only with synthetic, de-identified, or aggregate inputs and verified source-fact manifests; every output requires qualified review.

Skills associés