Changelog¶
All notable changes to tissue_simulator are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.1.17 - 2026-09-13¶
Fixed¶
- Replicate scaffolds no longer erase tissue density heterogeneity. The uniform random-sequential-addition scaffold spread cells evenly, so replicates of real regions lost dense tumor nests, sparse stroma and immune margins (mean degree of the 20 µm graph about 0.79 of the region's, and cross-type L diverging beyond the graph radius). Replicates built from a source region can now use a density-aware scaffold (below). The uniform scaffold is unchanged and remains the default when no source coordinates are available.
Added¶
tissue_simulator.density.DensityModelfits per-type kernel intensity maps; compartments (k-means on per-type intensities, with each compartment's density and composition taken from the cells inside it and profiled by distance to the compartment edge); patch structure (latent Gaussian fields calibrated by simulation to the region's same-compartment probability by distance); density-conditioned radius marks; and a hard core from nearest-neighbor spacing. A Monte Carlo test against uniform packings marks homogeneous regions, and trends or window-sized patches are flagged.sample_layout(layout="resample")draws a new arrangement of compartments per replicate, andlayout="copy"reuses the region's maps. Models round-trip throughto_dict/from_dict;pooled_patch_priorpools patch structure across a cohort.InhomogeneousPackerandPackingReport(packing.py). Fills a layout with its exact cell count by per-bin random sequential addition, best-clearance insertion, and bounded soft-sphere relaxation where addition saturates.TissueSection.generate_cells(layout=...)routes to it.- Density-aware replicates.
ReplicateGeneratoracceptsdensity_model,layout,composition_weight(default 4.0) andcomposition_bin(default 40 µm) withmethod="graph_coloring", andReplicateGenerator.from_coordinates()fits targets and the density model from a coordinate CSV.GraphColorizertakes an optionaltarget_statistics["spatial_composition"]term with O(1) incremental updates, andcost_terms()reports per-term residuals.ReplicateStatisticsgainspacking_report,composition_errorandlayout_flags.fit_density_model_from_coordinates()complementsload_target_statistics_from_coordinates(). overlap_report()inphysicell_export;export_tissuewarns when more than 5% of cells overlap by more than half their summed radii.- MCP.
setup_replicate_generatoracceptsdensity_layout(none,resampleorcopy). examples/density_aware_replicates.pybenchmark anddocs/notes/density-aware-packing.mddesign notes.
Changed¶
SpherePackerchecks collisions through a spatial hash grid (about 16x faster at 850 cells). Seeded packings are bit-identical to before.
0.1.16 - 2026-07-23¶
No library code changed in this release — it is packaging, citation, and release-process metadata only.
Added¶
CITATION.cffso the repository is citable. GitHub renders a "Cite this repository" button from it and generates APA/BibTeX on demand. Metadata is drawn from existing sources rather than restated: author and keywords frompyproject.toml, the concept DOI (10.5281/zenodo.17465675) already declared under[project.urls], and the release date from this file.- Citation section in
README.mdwith a BibTeX block, plus a note that the concept DOI always resolves to the latest release while Zenodo also mints a version-specific DOI per release. scripts/release.py— the version string lives in five files, four of which nothing imports, so they drift silently. The script treats the topmost## [X.Y.Z] - YYYY-MM-DDheading in this file as the source of truth and syncspyproject.toml,tissue_simulator/__init__.py,CITATION.cff(version+date-released), and the README BibTeX (version+year) to it.checkverifies and exits non-zero on drift;bump X.Y.Zsets. Each pattern must match exactly once, so an upstream reformat fails loudly rather than silently skipping a file, andbumprefuses to run on a dirty tree so the bump lands as its own reviewable commit.docs/notes/releasing.md— maintainer release checklist covering the version-sync criterion, the PR-then-tag flow, and Zenodo DOI handling. Records that this package is not published to PyPI, so there is no build/upload step.- Version-sync rules for AI agents in
CLAUDE.mdand.github/copilot-instructions.md: never hand-edit a version string, runrelease.py checkafter touching packaging or citation metadata, and never bump as a side effect of a feature change.
Fixed¶
- License holder.
LICENSEclaimed "Copyright (c) 2024 Tissue Simulator Contributors", which matched neither the author declared inpyproject.tomlnor the project's actual start year —0.1.0was released 2025-10-28. Now "Copyright (c) 2025 Eric Cramer". - Changelog compare links. Link references had not been maintained since
0.1.4, leaving versions0.1.5–0.1.15rendering as literal[0.1.x]text. Backfilled for every tagged release.v0.1.7was never tagged, so it has no link and0.1.8spansv0.1.6...v0.1.8;release.py checkreports the gap rather than hiding it.
0.1.15 - 2026-06-19¶
Added¶
method="graph_coloring"mode forReplicateGenerator(tissue_simulator/replicate_generator.py). Matching interaction statistics is fundamentally a labeling problem on a fixed neighbor graph, not a geometry problem. The new mode packs geometry once per replicate (fresh seed → geometric diversity), builds the neighbor graph, then assigns cell types via the simulated-annealingGraphColorizerto match the target interaction statistics — far more consistent and faster-converging than the defaultradius_tuningpath. Cell-type proportions are locked exactly (SA swap-moves preserve node counts). Benchmark: ~2.4× lower mean divergence and bounded (no high-divergence outliers) versus radius-tuning on a structured target. Theradius_tuningdefault is unchanged for backward compatibility.InteractionStatistics→ GraphColorizer target bridge (ReplicateGenerator._build_colorizer_targets/_round_proportions_to_counts): de-normalizes target interaction fractions against the packed graph's actual node count using the samemax_possibleconvention ascompute_interaction_statistics, so a perfect coloring reproduces the target by construction (verified by a round-trip test).color_graph_to_targetsshared helper (tissue_simulator/graph_coloring.py, exported from the package) used by both the colored replicate mode andTissueNetworkWorkflow.generate_colored_replicates.- Adaptive stopping on
GraphColorizer.colorize(patienceto stop on a cost plateau,return_historyto return the per-iterationbest_costseries forconvergence.find_convergence_time) and apatienceplateau break on the radius-tuning loop. Defaults leave existing behavior and return type unchanged. n_restartsfor the colored mode (keep the lowest-cost of several independent SA runs per replicate) andparallel=Trueongenerate_replicates(ProcessPoolExecutor; deterministic per-replicate seeds make parallel results identical to serial).ReplicateGenerator.consistency_reportquantifies run-to-run variability and compares methods viapower_analysis.compare_initialization_variance.radius_optimizer="differential_evolution"opt-in for the radius-tuning path: a gradient-free SciPy optimizer over per-type radius multipliers against a fixed-seed (deterministic) proportion objective.- MCP:
setup_replicate_generatorgainsmethod,n_restarts, andradius_optimizerparameters. - New tests in
tests/test_replicate_graph_coloring.py(bridge round-trip, colored-mode validity/reproducibility, lower divergence than radius-tuning, multi-restart, parallel==serial, consistency report, adaptive stopping / cost history, DE optimizer, and the MCP wiring).
Changed¶
docs/api/replicate-generation.md,docs/api/graph-coloring.md, anddocs/api/mcp.mddocument the new generation methods and supporting features, including a short survey of related algorithm families (Potts/MRF labeling, Gibbs/Markov point processes, SA reconstruction, cluster processes).
Notes¶
- Gradient-based SciPy optimizers (e.g.
least_squares) are deliberately not offered for radius tuning: the radius→cell-count map is integer-valued and stochastic, so finite-difference gradients are mostly zero. The gradient-freedifferential_evolutionis used instead, and for interaction targets thegraph_coloringmethod is preferred over any radius tuning.
0.1.14 - 2026-06-17¶
Added¶
- Warm-start support in
GraphColorizer.colorize()(tissue_simulator/graph_coloring.py). Newinitial_coloringparameter accepts a caller-supplied{node: color}dict to use as the starting coloring instead of the random node-counts shuffle. Values are validated againstself.colors, nodes missing from the dict are filled with the most-frequent target color, and foreign keys are ignored. WhenNone(default) behavior is byte-for-byte identical to v0.1.13 for seeded runs. Warm-starting from a previously converged coloring sharply reduces the iterations needed to re-converge on the same graph — in a 500-node benchmark a warm-started run at a 4k-iteration budget reached a lower cost than a cold run at 40k. This is a tool for refining or resuming a single coloring; see the note below on why it is not used for independent replicate generation. initial_coloringis threaded throughTissueNetworkWorkflow.assign_cell_types()(tissue_simulator/tissue_workflow.py).warm_startparameter on theassign_cell_typesMCP tool (tissue_simulator/mcp/server.py). Whentrue, reuses the server's previously stored cell-type assignment as the initial coloring, but only when a prior assignment exists and its node-id set exactly matches the new graph's nodes; otherwise it is safely ignored. The result reportswarm_start_applied.TissueNetworkWorkflow.generate_colored_replicates(num_replicates, ...)(tissue_simulator/tissue_workflow.py) — generate multiple independent cell-type colorings of one tissue slice that all match the same target statistics. Each replicate cold-starts from its own deterministic per-replicate seed (derived vianumpy.random.SeedSequence, matchingReplicateGenerator), so the set is reproducible yet diverse.warm_startis an opt-in (defaultFalse) for refinement.generate_colored_replicatesMCP tool (tissue_simulator/mcp/server.py) exposing the above, returning per-replicate color counts and amean_pairwise_diversityscore.- New tests in
tests/test_graph_coloring_integration.pyandtests/test_mcp_server.pycovering the warm-start round-trip, missing/ foreign-key handling, invalid-color validation, the MCPwarm_startapplied / ignored / node-set-mismatch branches, and the colored-replicate shape, reproducibility, cold-diversity and warm-collapse behavior.
Changed¶
docs/api/graph-coloring.md,docs/api/mcp.md, anddocs/api/replicate-generation.mddocument the new warm-start parameters and the colored-replicate workflow (including the geometric-vs-colored replicate distinction).
Fixed¶
GraphColorizer.colorize()no longer raisesNameErrorwhenmax_iterations=0(the post-loop progress print referenced an undefined loop variable). This also makes a zero-iteration warm-start a clean no-op that returns the supplied coloring unchanged.
Notes¶
- Locality-biased move proposals were prototyped and benchmarked for this release but dropped: on the package's typical homophily/clustering targets they consistently slowed convergence (2–4× higher cost at equal budget), because progress comes from swapping mismatched, distant nodes rather than adjacent ones.
- Warm-start was likewise evaluated as a default for replicate generation
and deliberately left opt-in: chaining each replicate from the previous
one collapses diversity to ~0% (every replicate becomes a near-identical
copy of the first). Cold-start replicates, by contrast, converge at a small
iteration budget on realistic (loose) targets and stay ~65% diverse — so
generate_colored_replicatescold-starts by default. Warm-start remains the right tool for refining/resuming a single coloring.
0.1.13 - 2026-06-04¶
Added¶
geometry: "2D" | "3D"parameter onPhysiCellExporter.export_slice()(tissue_simulator/physicell_export.py). Default"2D"preserves existing behavior byte-for-byte (slice-plane projection, suppliedz, disk-area volumes)."3D"writes each cell's original 3D position fromcenter_3dand sphere-volume on the cell's original radius — suited to PhysiCell 3D simulations where the slice was used as a spatial filter. Thezargument is ignored whengeometry="3D".- Two new MCP tools (
tissue_simulator/mcp/server.py): export_tissue_to_physicell— exports the current 3D tissue as a PhysiCell IC CSV. Always 3D.export_slice_to_physicell— exports the current slice as a PhysiCell IC CSV, with the newgeometryparameter. Closes the prior gap where MCP exposed no PhysiCell bridge at all.- Four new tests in
tests/test_physicell_export.py(backward-compat byte-identity for the default, 3D-semantics, validation, z-ignored).
Changed¶
docs/api/physicell.mddocuments the newgeometryparameter, adds a worked example showing both modes, and cross-links to the new MCP tools.docs/api/mcp.mddocuments the two new tools under a new "PhysiCell Export" category.
0.1.12 - 2026-05-29¶
Fixed¶
- Deterministic matplotlib color assignment in
visualize_*functions.TissueSection.visualize,TissueSlicer.visualize_slice_2d/visualize_slice_in_3d,SpatialNetworkAnalyzer.visualize_network,visualize_colored_graph, andvisualize_graph_comparisonpreviously built their{cell_type: color}map by iterating an unsortedset(...), whose order leaks CPython's per-interpreterPYTHONHASHSEED. Two independent Python processes (e.g. two CI runs) could therefore assign different colors to the same cell type, producing pixel-different figures despite every randomseed=being pinned. The new internal helpertissue_simulator._viz_utils.make_color_mapsorts cell types alphabetically before assignment, so the same input always yields the same mapping. Cross-function consistency too: "cancer" now always gets the same color invisualize,visualize_slice_2d, andvisualize_network.
Added¶
tissue_simulator/_viz_utils.py(internal) — single source of truth for the cell-type → color map used across the package's visualizations.tests/test_viz_utils.py— covers determinism (same input in different orders yields the same map; same acrossPYTHONHASHSEED), palette passthrough, and empty/duplicate inputs.- Code-driven slide deck on the docs site at
https://emcramer.github.io/tissue_simulator/latest/slides/. Source: a single
Jupyter notebook (
docs/slides/tour.ipynb) walking through the package end-to-end with code AND rendered matplotlib output side by side — tissue generation, slicing, spatial-network analysis, replicate generation, simulated-annealing cell-type assignment, and seed reproducibility. Rendered to reveal.js viajupyter nbconvert --to slides --executeand deployed as part of the docs site (runs on every push tomainand every release tag). Now that the package-level color-assignment is deterministic (above), the slide-deck build helper no longer needs aPYTHONHASHSEED=0workaround. docs/slides/build_slides.py— small build helper that wrapsnbconvert; both CI and devs invoke the same entry point.docs/slides/index.md— landing page in the docs site nav linking to the renderedtour.slides.html.tests/test_slides_notebook.py— validates the notebook withnbformat(schema + slide_type metadata) so a malformed deck fails the test suite even before CI executes it.- Notebook tooling (
jupyter,nbconvert>=7,ipykernel,matplotlib,networkx) added to thedocsoptional-dependency group. - CI render step in
.github/workflows/docs.ymlruns the build helper beforemike deploy.
Changed¶
mkdocs.ymladds aSlidesnav entry betweenAPI ReferenceandChangelog; the renderedtour.slides.htmlis listed innot_in_navso--strictdoesn't flag it.docs/index.md"Where to next" section adds a pointer to the slide deck.- Per-symbol notes on the deterministic color guarantee added to
docs/api/core.md(TissueSection.visualize),docs/api/slicing.md(both slice visualizers),docs/api/spatial-analysis.md(visualize_network), anddocs/api/graph-coloring.md(the twovisualize_*helpers, with the user-palette caveat). - Wiki FAQ entry "Why do my visualizations have different colors each run?" pushed to the companion wiki.
0.1.11 - 2026-05-29¶
Added¶
typecolumn alias inload_tissue_from_csv— the loader now acceptstypeas a column alias forcell_type, enabling direct ingestion of PhysiCellcells.csvexports (written by the PhysiCell MCP'sexport_cells_csv) without a bespoke schema adapter. Precedence:cell_type(canonical, preferred) →type(alias) →"default"(fallback, unchanged).load_target_statistics_from_coordinatesinherits the fix automatically because it composesload_tissue_from_csv. Three new tests cover the alias, the precedence rule, and the unchanged fallback.
0.1.10 - 2026-05-28¶
Added¶
- MkDocs Material documentation site at https://emcramer.github.io/tissue_simulator/ (config:
mkdocs.yml). Reuses the existingdocs/api/*.mdhand-written guides and adds: docs/index.mdsite landing page,docs/changelog.md(embedsCHANGELOG.mdvia include-markdown),docs/reference/*.md(13 mkdocstrings stubs — per-symbol API reference auto-generated from the package's docstrings).- Versioned docs via
mikewith a navbar version switcher;latestalias tracksmain, tagged releases (v*.*.*) replacelatest. - First GitHub Actions workflow
.github/workflows/docs.yml— auto-deploys on push tomainand on release tags. docsoptional-dependency group inpyproject.toml:mkdocs-material,mkdocstrings[python],mkdocs-include-markdown-plugin,mike. Install withpip install -e ".[docs]".DocumentationURL inpyproject.toml's[project.urls].- GitHub repo wiki seeded with Home / FAQ / Troubleshooting / Roadmap pages (community-editable, separate from the canonical Pages site).
tests/test_docs_build.py— runsmkdocs build --strictin CI so broken-link / missing-page regressions fail tests.
Changed¶
README.mdadds a Docs badge and links to the site + wiki at the top of the Documentation section.docs/quickstart.mdoutbound../README.md/../CHANGELOG.md/../examples//../tissue_simulator/links rewritten to in-site pages or absolute GitHub blob URLs so the built site has no broken links.
0.1.9 - 2026-05-28¶
Added¶
seed: Optional[int] = NoneonGraphColorizer.__init__(graph_coloring.py) — when provided, the colorizer routes every stochastic decision (initial coloring shuffle, per-step pair sampling, metropolis acceptance draw) through an instance-boundrandom.Random(seed), makingcolorize(...)bit-reproducible across Python processes independent ofPYTHONHASHSEED. Whenseed=None(default) behavior is unchanged.seed=plumbed through the workflow entry points (tissue_workflow.py):TissueNetworkWorkflow.assign_cell_types,TissueNetworkWorkflow.run_complete_workflow, and the top-levelquick_workflowall forward aseedto the underlyingGraphColorizer. Matches the v0.1.2 reproducibility plumbing already inTissueSection,SpherePacker, andReplicateGenerator.assign_cell_types(MCP tool,mcp/server.py) — slice the current tissue atz_position, build a radius-mode spatial network, load target statistics from a graph-coloring-format CSV (node_counts,edge_counts,neighbor_dist), and runGraphColorizer.colorize()with the givenseed. The per-node coloring is stored on the server. Exposes the two-stagegenerate_cells->assign_cell_typesworkflow through MCP so an LLM can drive structured multi-type cell-type assignment end-to-end.- New reproducibility tests for graph coloring (same seed +
same inputs => identical assignment dict; different seeds =>
different assignments;
seed=Nonepreserves legacy behavior).
Changed¶
docs/api/graph-coloring.mddocuments the newseedparameter with a short reproducibility example, and adds a "When to use what" section clarifying the design intent:GraphColorizeris for label-only assignment on a fixed graph;ReplicateGeneratoris for unstructured replicate generation by repacking and does NOT composeGraphColorizertoday; for structured multi-type targets, use the two-stageTissueWorkflow(generate_cells->assign_cell_types).docs/api/replicate-generation.mdgains a cross-link callout pointing readers with structured multi-type targets at the "When to use what" section ofgraph-coloring.md.docs/guides/complete-workflow.mdaddsseed=42to thequick_workflow(...)andTissueNetworkWorkflow.run_complete_workflow(...)examples, with a brief note that the colorize step is then bit-reproducible.docs/api/mcp.mddocuments the newassign_cell_typesMCP tool (a new "Cell Type Assignment" category and a per-tool reference entry matching the v0.1.8 format).
0.1.8 - 2026-05-27¶
Added¶
load_tissue_from_csv(MCP tool,mcp/server.py) — load aTissueSectionfrom a coordinate CSV (x, y, z, radius, cell_type, is_boundary) and set it as the current tissue, so slicing, analysis, and statistics tools can run on externally sourced tissue. Dimensions are inferred from the coordinate bounds when omitted. The inverse ofexport_tissue_csv.load_target_statistics_from_coordinates(MCP tool,mcp/server.py) — compute full target statistics (interactions pluscell_type_proportionsandtarget_density) straight from a coordinate CSV. Distinct fromload_target_statistics'scsv_filepath, which reads a precomputed interaction table and leaves proportions/density unset.- Together these expose the v0.1.7 external-cell ingest functions
(
load_tissue_from_csv,load_target_statistics_from_coordinates) through the MCP server, so an LLM can turn an externally measured or generated (e.g. PhysiCell) tissue into aTargetStatisticsforReplicateGeneratorwithout going through the random packer. tests/test_mcp_server.pycovering the two new MCP tools.
Changed¶
docs/api/mcp.mddocuments the two new tools (a new "Data Loading" category, per-tool reference entries, and an external-tissue workflow example).
[0.1.7] - 2026-05-26¶
Added¶
TissueSection.from_cells(...)(classmethod,tissue.py) — build a tissue from already-positionedCellobjects instead of the random packer. Infers any omitted dimension from the cell-center bounding box (with a largest-diameter fallback for constant-axis 2D inputs) and derives per-type(min, max)radii when not given. The inverse ofexport_to_csv.load_tissue_from_csv(...)(module-level,tissue.py) — load aTissueSectionfrom a coordinate CSV (x, y, z, radius, cell_type, is_boundary) written byexport_to_csv;radiusandis_boundaryare optional. Round-trips a packed tissue's cells exactly.load_target_statistics_from_coordinates(...)(module-level,replicate_generator.py) — fullTargetStatistics(interactions pluscell_type_proportionsandtarget_density) straight from a coordinate CSV. Distinct fromload_target_statistics_from_csv, which reads a precomputed interaction table and leaves proportions/density unset.- Together these unblock turning an externally measured or externally
generated (e.g. PhysiCell) tissue into a
TargetStatisticsforReplicateGeneratorwithout going through the random packer. - Tests for round-trip fidelity, derived radii, 2D dimension inference, full
target-stats validation, and the new public exports
(
tests/test_tissue_simulator.py,tests/test_replicate_generator.py).
Changed¶
tissue_simulator/__init__.pynow exportsload_tissue_from_csvandload_target_statistics_from_coordinates.docs/api/core.mddocumentsTissueSection.from_cellsandload_tissue_from_csv.docs/api/replicate-generation.mddocumentsload_target_statistics_from_coordinatesand clarifies the two CSV shapes (coordinate CSV vs. precomputed interaction table).
0.1.6 - 2026-05-15¶
Added¶
docs/api/convergence.md— full per-symbol reference foradf_test,mann_kendall_test,rolling_cv,find_convergence_time, andMultiMetricConvergence. Worked example verified end-to-end (synthetic transient + AR(1) trajectory, converges at t=99 / 280).docs/api/power-analysis.md— per-symbol reference forcohens_d,coefficient_of_variation,required_replicates,power_curve,compare_initialization_variance, andsummarize_power_analysis. Worked example produces a three-method variance / effect-size report.docs/api/physicell.md— dedicated PhysiCell bridge page coveringPhysiCellExporter,export_to_physicell,PhysiCellReader,read_physicell_output, andstats_to_target_statistics, plus the round-trip from tissue -> CSV -> reader ->ReplicateGenerator. Includes pyMCDS attribution.
Changed¶
docs/api/core.mdtrimmed and retitled from a top-level user guide (491 lines) to a focused per-module API reference (296 lines) forTissueSection,Cell, andSpherePacker. Installation / quickstart prose now lives indocs/quickstart.mdonly.- Decorative checkmark / cross emoji removed from
docs/api/slicing.md,docs/api/spatial-analysis.md,docs/api/replicate-generation.md, anddocs/guides/mcp.md. Markdown style now matches the plain convention set inCLAUDE.md.
Fixed¶
- The non-runnable return-type pseudo-code block in
docs/api/power-analysis.mdis now fenced astext, notpython, so automated snippet extraction picks up only the runnable example.
Removed¶
PAPER_PLAN_REPORT.mdis no longer tracked onmain. (The v0.1.5 attempt didn't make it into the commit; this release actually drops it.) The file remains as a local working-copy artifact and is listed in.gitignore.
Historical note: the file is still present in tag history v0.1.1
through v0.1.5. Purging it from history requires a force-rewrite
(git filter-repo) plus re-pushing tags and recreating releases —
see the project notes for that one-off operation.
Tests¶
- 120 / 120 tests pass.
0.1.5 - 2026-05-14¶
Changed¶
docs/quickstart.mdfully rewritten for the v0.1.x feature surface. Adds a runnable five-minute tour covering tissue generation, slicing, spatial-network construction, and CSV export; a "Headline workflows" section pointing at replicate generation, graph coloring, the PhysiCell bridge, convergence and power analysis, MCP, and the GUI; and a reproducibility note covering theseed=plumbing and thenandivergence semantics from v0.1.2. Snippet verified end-to-end on the real package: 495 cells, 2424 edges, runs in ~5 s.mcp_config_claude_desktop.example.jsonnow uses the placeholder path/ABSOLUTE/PATH/TO/...rather than a hard-coded developer path.
Removed¶
PAPER_PLAN_REPORT.mdis no longer tracked. It remains as a local internal-only doc (now properly listed in.gitignore).
0.1.4 - 2026-05-13¶
Changed¶
- Repository cleanup: removed obsolete root-level helper scripts
(
fix_graphml_export.py,quick_test.sh,quick_fix_mcp.sh), historical "feature complete" narrative docs (GRAPH_COLORING_INTEGRATION.md,REPLICATE_FEATURE_SUMMARY.md,docs/SLICING_SUMMARY.md,docs/STRUCTURE.md,docs/feature_tracking/*_COMPLETE.md), and the now-emptydocs/feature_tracking/directory. The historical signal these files carried is preserved in thisCHANGELOG.md. - Docs reorganization: split
docs/intodocs/api/(per-module reference),docs/guides/(tutorials),docs/design/(research / paper-track artifacts), anddocs/notes/(maintainer notes such as theplot_surfaceregression incident). File renames are git-tracked sogit log --followstill works. mcp_config_claude_desktop.json→mcp_config_claude_desktop.example.jsonto make its template nature explicit; the file contains a hard-coded absolute path users must adapt.configure_mcp.sh→scripts/configure_mcp.sh(plus a briefscripts/README.md).mcpdependency moved to an optional extra:pip install -r requirements.txtno longer pulls inmcp. Install withpip install tissue_simulator[mcp]orpip install mcpdirectly. This is a minor breaking change for users who relied on the implicit install.
Added¶
pyproject.tomlwith PEP 621 metadata as the authoritative source for package metadata;setup.pyis now a thin shim.CHANGELOG.md(this file).requirements-dev.txtwith pytest, build, twine, and the optionalmcpextra for contributors.
Fixed¶
MANIFEST.inpreviously referencedGUIDE.mdandQUICKSTART.mdat the repo root, where they never lived; sdists silently shipped without those docs. The MANIFEST now usesrecursive-include docs *.md.setup.pyauthor placeholders replaced with the real maintainer. Project classified asDevelopment Status :: 4 - Beta..gitignoreextended to cover.claude/,.cursor/,.continue/,.aider*,.mypy_cache/,.ruff_cache/, andexamples/output/;.gemini/*glob hardened to.gemini/.
Tests¶
- 120 / 120 tests pass.
0.1.3 - 2026-05-13¶
Changed¶
- Removed dead RNG code from
TissueSection.SpherePackeris now the single source of randomness;seedkeyword arguments are preserved on the public API. - PhysiCell
.matcells-matrix selection is now shape-aware: prefers elongated candidates with plausible signal-count axes, warns when the heuristic fires, and raises on close-call ambiguity.
Tests¶
- 120 / 120 tests pass.
0.1.2 - 2026-05-13¶
Added¶
- Explicit RNG seeding through
SpherePacker,TissueSection, andReplicateGenerator; the Result-1 demo is now bit-reproducible acrossPYTHONHASHSEEDvalues. - Real PhysiCell
.matparsing via pyMCDS-or-direct-scipy fallback, with attribution. Non-standard matrix shapes now raise instead of silently mis-decoding.
Changed¶
_compute_interaction_divergencereturnsnan(not0) when both target and measured are zero for a given pair. The aggregate usesnp.nanmean, so empty-signal pairs no longer masquerade as perfect matches.
Tests¶
- 116 / 116 tests pass.
0.1.1 - 2026-05-13¶
Added¶
- PhysiCell bridge:
PhysiCellExporterandPhysiCellReadermodules with astats_to_target_statisticsadapter that lets ABM snapshots driveReplicateGeneratordirectly. - Convergence diagnostics: ADF, Mann-Kendall (tie-corrected), rolling
CV,
find_convergence_time, andMultiMetricConvergence. - Power analysis: Cohen's d, required replicates, power curves, and variance comparison across initialization strategies.
- New Result-1 demo:
examples/result1_replicate_demonstration.py.
Changed¶
statsmodelsadded as a required dependency (used by convergence and power-analysis modules).
Tests¶
- 105 / 105 tests pass.
0.1.0 - 2025-10-28¶
Added¶
- Initial public release.
- Core 3D tissue generation:
TissueSection,Cell,SpherePacker(random sequential addition). - 2D slicing:
TissueSlicer,SliceCell,create_standard_slicesfor arbitrary-angle planar sections. - Spatial network analysis:
SpatialNetworkAnalyzerwith contact and radius edge modes; global, per-cell-type, and pairwise interaction statistics. - Graph-based cell-type assignment:
GraphColorizerusing simulated annealing to match target node, edge, and neighbor-distribution statistics. - Replicate generation:
ReplicateGeneratorfor batch tissues matching target spatial statistics. - Unified workflow:
TissueNetworkWorkflowandquick_workflow. - Evaluation metrics: Jensen-Shannon divergence, cosine similarity,
evaluate_graph_coloring. - PyQt5 GUI:
tissue-simulatorconsole entry point. - MCP server (
tissue_simulator.mcp.server) exposing 11 tools for LLM integration via Model Context Protocol. - Examples, tests, MIT license, and documentation.