Skip to content

Update app-cytoland with latest changes in app-dynaclr - #381

Merged
alxndrkalinin merged 103 commits into
app-cytolandfrom
app-dynaclr
Mar 17, 2026
Merged

alxndrkalinin merged 103 commits into
app-cytolandfrom
app-dynaclr

Conversation

@alxndrkalinin

Copy link
Copy Markdown
Collaborator

No description provided.

edyoshikun and others added 30 commits February 21, 2026 20:40
…istry

- 19 test cases covering config creation, defaults, channel maps,
  validation errors, YAML loading, tau-range conversion, and lookups
- All tests fail with ModuleNotFoundError (module not yet implemented)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ExperimentConfig dataclass with all fields and defaults
- ExperimentRegistry with fail-fast validation at __post_init__:
  empty check, duplicate names, source_channel membership,
  channel count consistency, interval_minutes positivity,
  condition_wells non-empty, data_path existence, zarr channel match
- channel_maps: per-experiment source position -> zarr index mapping
- from_yaml classmethod for YAML config loading
- tau_range_frames for hours-to-frames conversion with warning
- get_experiment lookup by name with KeyError
- All 19 tests pass

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… member

- Fix ruff I001 (import sorting) and F401 (unused import) in test file
- Exclude applications/dynacrl (typo) from uv workspace to unblock builds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SUMMARY.md with TDD execution results, self-check passed
- STATE.md updated with position, decisions, session continuity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add iohub>=0.3a2 and pyyaml as explicit dependencies in dynaclr pyproject.toml
- Re-export ExperimentConfig and ExperimentRegistry from dynaclr __init__.py
- Both classes now importable via `from dynaclr import ExperimentConfig, ExperimentRegistry`

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Demonstrate positional channel alignment across 2 experiments
- SEC61 (30min interval, ER) and TOMM20 (15min interval, mito)
- Show condition_wells with infected/uninfected/mock conditions
- Include comments explaining channel alignment and tau_range conversion

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SUMMARY.md with execution results and self-check
- STATE.md updated: Phase 20 complete, 20/25 phases (80%)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 20 Experiment Configuration verified (11/11 must-haves).
ExperimentConfig + ExperimentRegistry with TDD, package wiring, example YAML.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 17 test cases covering CELL-01 (unified tracks), CELL-02 (lineage), CELL-03 (border clamping)
- All fail with ModuleNotFoundError (dynaclr.index not yet implemented)
- Test fixtures create mini OME-Zarr stores with tracking CSVs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lamping

- Unified tracks DataFrame from all experiments with enriched columns
- Lineage reconstruction linking daughters to root ancestor via parent_track_id
- Border clamping: retains border cells with shifted patch origins instead of exclusion
- All 23 tests pass

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove unused variable (F841) in test_global_track_id_unique_across_experiments
- Use .to_numpy() instead of .values (PD011) in test_exclude_fovs_filter
- Export MultiExperimentIndex from dynaclr __init__.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 21-01-SUMMARY.md with full execution documentation
- STATE.md updated for 21-01 completion, decisions, session continuity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…mary

- 8 tests for valid_anchors: basic validity, subset check, end-of-track exclusion,
  lineage continuity, different tau ranges, empty tracks, gap handling, self-exclusion
- 9 tests for properties/summary: experiment_groups, condition_groups, summary()
- All 17 new tests fail with TypeError (tau_range_hours not yet accepted)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…oups, summary

- Add tau_range_hours parameter to MultiExperimentIndex.__init__
- _compute_valid_anchors: per-experiment tau conversion, lineage-based lookup
- experiment_groups/condition_groups properties returning index arrays
- summary() with experiment counts, observation counts, per-experiment breakdowns
- All 40 tests pass (23 existing + 17 new)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SUMMARY.md with self-check passed
- STATE.md updated: Phase 21 complete, ready for Phase 22

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Experiment-aware batching: single-experiment restriction, all experiments appear
- Condition balancing: 2-condition and 3-condition proportional tests
- Leaky mixing: zero leak, 20% leak injection, no-effect when not experiment-aware
- Small group fallback: no crash, warning emission
- Determinism: same seed/epoch reproduces, set_epoch changes sequence
- Sampler protocol: yields list[int], correct __len__
- DDP partitioning: disjoint interleaved batches across ranks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ndition-balanced, leaky mixing

- FlexibleBatchSampler(Sampler[list[int]]) with cascade batch construction
- experiment_aware=True restricts each batch to a single experiment
- condition_balanced=True balances condition representation per batch
- leaky > 0.0 injects cross-experiment samples into restricted batches
- Deterministic via np.random.default_rng(seed + epoch)
- DDP support via interleaved batch partitioning across ranks
- Small group fallback to replacement sampling with logged warning
- Pre-computed group indices at __init__ for O(1) lookup
- Fix lint issues in test file (import sorting, .values -> .to_numpy(), nunique -> len(unique))

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add FlexibleBatchSampler to viscy_data.__init__.py public API
- Place import in alphabetically correct position for ruff isort compliance
- Add to __all__ exports under Utilities section

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Create 22-01-SUMMARY.md with TDD execution results
- Update STATE.md: plan 01/02 complete, decisions, session continuity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… validation

- 6 temporal enrichment tests (focal concentration, global_fraction edge cases, validation)
- 5 DDP disjoint coverage tests (interleaving, coverage, epoch reproducibility)
- 3 validation guard tests (missing experiment/condition/hpi columns)
- 2 package import tests (import, __all__)
- All 9 new feature tests fail as expected (RED)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…verage

- Add temporal_enrichment, temporal_window_hours, temporal_global_fraction params
- Implement _enrich_temporal: focal/global sampling from experiment pool
- Add column validation guards for experiment/condition/hpi columns
- Conditional precomputation: only groupby columns when feature enabled
- Fix stale smoke test __all__ count (45 -> 46) from Plan 01
- All 35 sampler tests pass, 107 total viscy-data tests pass

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 22-02-SUMMARY.md with all metrics, decisions, deviations
- STATE.md advanced to Phase 23, progress 22/25 (88%)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 22 verified: FlexibleBatchSampler with all 5 SAMP requirements.
5/5 must-haves passed. 35 tests, 107 full suite pass. No regressions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 12 test cases covering subclass, beta=0 equivalence, hard negatives,
  gradients, temperature effect, edge cases, defaults, and CUDA
- All fail with ModuleNotFoundError (dynaclr.loss not yet created)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
edyoshikun and others added 22 commits March 7, 2026 16:21
Adds test_multi_experiment_fast_dev_run_with_parquet which verifies the
full Lightning training loop works when loading from a pre-built cell
index parquet via MultiExperimentDataModule.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
  - Add `collection.py` for ML training collection definitions
  - Rename `hours_post_infection` → `hours_post_perturbation` in `_typing.py`
  - Update `cell_index.py` to use `collection_path` and renamed field
  - Add corresponding tests for new modules and updated cell index
…calls deg2rad internally)

  - Fix docstrings to reflect ZYX input order, facet naming, and unit conventions
  - Remove stale timepoint_statistics lookup in _normalize.py
…/norm maps

  - MultiExperimentIndex with parallel FOV loading and lineage-aware anchors
  - MultiExperimentDataModule with stratify_by, num_workers_index, FOV-level split
  - Dataset updates for new pipeline; remove ExperimentConfig from __init__
  - Consolidate shared test helpers and constants into conftest.py
  - Update build-cell-index, train-multi-experiment, troubleshooting recipes
  - Add sampling-strategies.md documenting FlexibleBatchSampler axes
  - Update README table
  - Add CLAUDE.md with data pipeline design principles
@alxndrkalinin
alxndrkalinin requested a review from Copilot March 17, 2026 00:08

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot reviewed 119 out of 223 changed files in this pull request and generated no comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

@alxndrkalinin

alxndrkalinin commented Mar 17, 2026 •

Copy link
Copy Markdown
Collaborator Author

Code review

conv_block_3d.py and conv_block_2d.py model() method indexes self.norm (a string) instead of self.norm_list (an nn.ModuleList). self.norm is set to the string parameter (e.g. "batch"). if self.norm[i]: indexes into the string, returning individual characters which are always truthy, and crashes with IndexError when i >= len(string). The correct code is if self.norm_list[i]:, which is already used correctly in forward().

https://github.com/mehta-lab/VisCy/blob/0a3d2e688485c811b43d98fc20f4ba86a21799b1/packages/viscy-models/src/viscy_models/components/conv_block_3d.py#L321-L323

https://github.com/mehta-lab/VisCy/blob/0a3d2e688485c811b43d98fc20f4ba86a21799b1/packages/viscy-models/src/viscy_models/components/conv_block_2d.py#L365-L367

Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

@alxndrkalinin
alxndrkalinin marked this pull request as ready for review March 17, 2026 18:02
@alxndrkalinin
alxndrkalinin merged commit fa03ecd into app-cytoland Mar 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants