Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
85877b8
checkpoint: track multivariate elastic model block/orthogonal basis h…
fil-monti Apr 12, 2026
1611094
Fix block matrix restore by persisting R and Rinv cache state
fil-monti Apr 12, 2026
6932904
Fix computed-matrix restore cache invalidation and add regression test
fil-monti Apr 12, 2026
bc020b1
Fix OU mean-gradient drift path for external branches
fil-monti Apr 12, 2026
1fb23cd
Fix canonical OU variance pullback Omega orientation
fil-monti Apr 12, 2026
c7a6263
Add core OU time-series/tree integration and baseline tests
fil-monti Apr 12, 2026
58f1e7e
Refine HMC gradient plumbing, diagnostics, and utility hooks
fil-monti Apr 12, 2026
f75fcc5
Fix OU canonical root variance gradient path
fil-monti Apr 12, 2026
3ec00b6
Harden and speed up canonical SPD inversion path
fil-monti Apr 13, 2026
9180ea8
Wire orthogonal exact variance gradient path in canonical branch bridge
fil-monti Apr 13, 2026
8227b35
Make OU diffusion gradient quadrature substeps configurable
fil-monti Apr 13, 2026
062d15c
Checkpoint: parent-above path and orthogonal selection debug updates
fil-monti Apr 14, 2026
53e5db5
Fix OU root-mean backprop and missing-dimension masking
fil-monti Apr 15, 2026
46884ad
Add parent-above debug instrumentation for OU canonical gradients
fil-monti Apr 15, 2026
0fc93a4
Add experimental global remainder gradient path and keep it opt-in
fil-monti Apr 15, 2026
5258f9c
Add canonical OU XML pathway and HMC gradients
fil-monti Apr 17, 2026
a13de37
Default OU XMLs to orthogonal-block adjoints
fil-monti Apr 17, 2026
bf9b4af
Add missing MatrixUtils utility
fil-monti Apr 17, 2026
52b10fd
Optimize canonical OU backprop and document architecture
fil-monti Apr 17, 2026
12e2ff7
flattening arrays and preventing dynamic allocations
fil-monti Apr 18, 2026
2957e8d
adding CPU parallelization
fil-monti Apr 18, 2026
6f377d0
improving CPU parallelization
fil-monti Apr 18, 2026
834254e
Improve canonical OU message pass parallelization
fil-monti Apr 29, 2026
2dd8c38
Treat computed compound matrices as immutable
fil-monti Apr 29, 2026
7ec948b
Gate canonical OU gradient behavior
fil-monti Apr 29, 2026
1dd1da8
Allow zero-length observed branches in remainder adjoints
fil-monti Apr 29, 2026
3c3510c
Test canonical OU root mean gradient with missing tips
fil-monti Apr 29, 2026
dac0e48
Restore HMC checks and add canonical OU benchmark
fil-monti Apr 29, 2026
09d4287
Restore compound parameter event behavior
fil-monti Apr 29, 2026
896076f
Restore simplex and tree likelihood tests
fil-monti Apr 29, 2026
8b69b76
Update OU gradient regression tests
fil-monti Apr 29, 2026
15b3aca
Refresh diffusion gradient OU baselines
fil-monti Apr 29, 2026
8984cad
Select OU variance gradient path automatically
fil-monti Apr 29, 2026
a862516
Restore canonical OU stationary mean accessor
fil-monti Apr 29, 2026
9ea8fd5
Move canonical OU Gaussian code into tree packages
fil-monti Apr 30, 2026
5844559
Move canonical branch transition API to tree Gaussian package
fil-monti Apr 30, 2026
dddc663
Move selection matrix parameterization to OU package
fil-monti Apr 30, 2026
9134a57
Gate canonical OU drift gradients
fil-monti Apr 30, 2026
e821146
Center canonical OU gradients on integrator adapter
fil-monti Apr 30, 2026
7bc4d5a
Modularize canonical OU branch wiring
fil-monti Apr 30, 2026
a8470bf
more modularization
fil-monti Apr 30, 2026
ef5d76c
Refactor canonical OU machinery
fil-monti Apr 30, 2026
fd84801
Modularize canonical OU branch machinery
fil-monti Apr 30, 2026
d0e07a9
Centralize canonical numerical policy
fil-monti Apr 30, 2026
0cab651
Finish canonical machinery cleanup
fil-monti Apr 30, 2026
840b0fd
Fix CI canonical OU regressions
fil-monti Apr 30, 2026
dcdae3a
Extract OU canonical parent-above recovery
fil-monti Apr 30, 2026
80ba4af
Harden canonical OU HMC regression test
fil-monti Apr 30, 2026
164dfa0
Remove flaky canonical OU HMC dynamic test
fil-monti Apr 30, 2026
3702354
Extract canonical selection gradient pullbacks
fil-monti Apr 30, 2026
5501fc4
Use analytic canonical branch length gradients
fil-monti Apr 30, 2026
eee0cbc
Move OU covariance gradients into strategies
fil-monti Apr 30, 2026
b9130ce
Refactor canonical OU machinery
fil-monti Apr 30, 2026
2469ec4
Complete canonical adjoint and cache efficiency refactor
fil-monti Apr 30, 2026
1a76004
Modularize canonical OU specialized backend
fil-monti Apr 30, 2026
d72fde5
Improve canonical transition cache diagnostics
fil-monti Apr 30, 2026
b548624
Extract canonical debug and fallback policies
fil-monti Apr 30, 2026
de3ff57
Extract canonical selection gradient projector
fil-monti Apr 30, 2026
84dad20
Split canonical OU provider snapshots
fil-monti Apr 30, 2026
96e608b
Version canonical transition cache entries
fil-monti Apr 30, 2026
2304219
Introduce canonical parameterization capabilities
fil-monti Apr 30, 2026
7920364
Extract canonical OU kernel
fil-monti Apr 30, 2026
e57b421
Centralize canonical integration phases
fil-monti Apr 30, 2026
060debd
Centralize canonical matrix layout conversions
fil-monti Apr 30, 2026
0f088e3
Document canonical OU package boundaries
fil-monti Apr 30, 2026
57f2115
Make canonical branch snapshots opaque
fil-monti Apr 30, 2026
69436f2
Use flat matrices in canonical hot paths
fil-monti Apr 30, 2026
17a151e
Remove legacy canonical gradient compatibility
fil-monti May 1, 2026
fdc7a72
Clean canonical package boundaries
fil-monti May 1, 2026
69f9b3e
Rename tree OU canonical bridge helpers
fil-monti May 1, 2026
d226ccf
Optimize canonical branch gradient reuse
fil-monti May 1, 2026
b102ab6
Add focused canonical parity cache tests
fil-monti May 1, 2026
7e66885
Phase 1: centralize matrix math and fix ThreadLocal leak
fil-monti May 1, 2026
277a7da
Refactor canonical OU machinery
fil-monti May 1, 2026
4dd82d2
Add canonical OU Gaussian observation model
fil-monti May 1, 2026
5444404
Move partial observation machinery into observation model
fil-monti May 1, 2026
72abc44
Clarify canonical observation class placement
fil-monti May 1, 2026
b7ad206
Make canonical matrix inversion self-contained
fil-monti May 1, 2026
941c277
Consolidate partial identity observation handling
fil-monti May 1, 2026
957dba4
Organize canonical machinery into subpackages
fil-monti May 1, 2026
9291f8d
Phase 5: polymorphic tip-parent dispatch via fillParentMessage
fil-monti May 1, 2026
d3371c2
Phase 6: capability-based dispatch and legacy deprecation
fil-monti May 1, 2026
2e5e420
Delete deprecated dead code; migrate last CanonicalGaussianUtils caller
fil-monti May 1, 2026
cbba5e1
Phase 7: typed config builders and property name validation
fil-monti May 1, 2026
faf5f55
Lock canonical OU boundaries
fil-monti May 1, 2026
41c79ed
Split canonical OU branch gradients
fil-monti May 1, 2026
eb161a3
Unify canonical selection pullbacks
fil-monti May 1, 2026
fc7611e
Clean canonical comments and time-series imports
fil-monti May 1, 2026
7fb4064
Flatten canonical OU branch hot paths
fil-monti May 1, 2026
fdffd76
Flatten canonical OU kernel boundaries
fil-monti May 1, 2026
5be8b6d
Flatten native branch covariance adjoints
fil-monti May 1, 2026
37822df
Flatten orthogonal backend fallback internals
fil-monti May 1, 2026
05fc013
Fix timeseries rotation-gradient flat migration
fil-monti May 1, 2026
e43cdd8
Remove canonical preorder state buffer
fil-monti May 1, 2026
9c74e33
Refactor canonical OU machinery
fil-monti May 1, 2026
a69bc37
Harden canonical OU gradient architecture
fil-monti May 1, 2026
d73bfc0
Delay orthogonal diffusion gradient rotation
fil-monti May 2, 2026
8380c0a
Add general OU trait simulator
fil-monti May 2, 2026
92d45ee
Optimize orthogonal canonical gradient pullbacks
fil-monti May 2, 2026
7a28cec
Use block multiplies for covariance expD adjoints
fil-monti May 2, 2026
f3dddda
Optimize exact Frechet coefficient plan
fil-monti May 2, 2026
5b2818a
Optimize canonical transition adjoint hot paths
fil-monti May 2, 2026
3e43152
Use compressed expD in orthogonal block paths
fil-monti May 2, 2026
36d9f3f
Flatten legacy orthogonal gradient callers
fil-monti May 2, 2026
4b62c98
Optimize orthogonal block covariance adjoint
fil-monti May 3, 2026
878df2d
Reuse transition matrix product in adjoint utility
fil-monti May 3, 2026
7edb680
Exploit symmetry in orthogonal block OU algebra
fil-monti May 3, 2026
ca4bd5f
Optimize row-major matrix multiply order
fil-monti May 3, 2026
3b5b696
Reuse covariance adjoint solve for diffusion gradient
fil-monti May 3, 2026
8367d1d
Avoid hypot in Frechet moment cutoff
fil-monti May 3, 2026
5bfa66a
Recover infinite parent-above OU precision
fil-monti May 3, 2026
c9294d0
Reject non-SPD canonical OU precision proposals
May 3, 2026
d1c3b1d
Add canonical OU timing diagnostics
fil-monti May 3, 2026
a6e14cb
Add experimental canonical transition preloading
fil-monti May 3, 2026
076240f
Optimize canonical Frechet coefficient paths
fil-monti May 3, 2026
1956691
Optimize canonical dense matrix paths
fil-monti May 4, 2026
85f28de
Route canonical matrix diagnostics through logger
fil-monti May 4, 2026
d44c6b0
Add ordered OU block rho and theta transform
May 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ out/
*.xml
!examples/**/*.xml
!tests/**/*.xml
!src/test/resources/dr/evomodel/treedatalikelihood/continuous/canonical_ou_hmc_seed666.xml

zig_zag
src/revision.txt
Expand Down
85 changes: 84 additions & 1 deletion build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,12 @@
<!-- complie JUnit test classes -->
<include name="test/dr/**"/>
</javac>
<!-- Copy runtime parser/config resources needed when running tests from ${build}. -->
<copy todir="${build}">
<fileset dir="${src}">
<include name="dr/**/*.properties"/>
</fileset>
</copy>
<echo message="Successfully compiled."/>
</target>

Expand Down Expand Up @@ -239,6 +245,8 @@
<include name="dr/evomodel/tree/**/*.class"/>
<include name="dr/evomodel/treelikelihood/**/*.class"/>
<include name="dr/evomodel/treedatalikelihood/**/*.class"/>
<exclude name="dr/evomodel/treedatalikelihood/TreeDataLikelihoodTest.class"/>

<include name="dr/evomodelxml/**/*.class"/>
<exclude name="dr/evomodelxml/treedatalikelihood/MultiPartitionDataLikelihoodDelegate*"/>
<include name="dr/evoxml/**/*.class"/>
Expand Down Expand Up @@ -358,7 +366,8 @@
<batchtest fork="yes" todir="${report}">
<fileset dir="${src}">
<include name="test/dr/**/*Test.java"/>

<exclude name="test/dr/evomodel/treedatalikelihood/TreeDataLikelihoodTest.java"/>
<exclude name="test/dr/inference/mcmc/MCMCTest.java"/>
<!-- Broken JUnits -->
<exclude name="test/dr/app/beagle/AncestralStateBeagleTreeLikelihoodTest.java"/> <!-- doesn't always fail-->
<exclude name="test/dr/app/beagle/MarkovJumpsTest.java"/> <!-- doesn't always fail-->
Expand Down Expand Up @@ -402,6 +411,80 @@
<echo message="JUnit test finished."/>
</target>

<target name="junit-canonical" depends="compile-all"
description="Run the canonical OU behavior-lock test suite">
<mkdir dir="${report}"/>
<junit printsummary="yes" haltonfailure="no" failureproperty="test.failed">
<classpath>
<path refid="classpath"/>
<path location="${build}"/>
</classpath>
<jvmarg value="-Djava.library.path=${java.library.path}"/>
<formatter type="xml"/>

<batchtest fork="yes" todir="${report}">
<fileset dir="${src}">
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalMathConversionTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalNumericsTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalGaussianMessagePasserOULikelihoodTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalGaussianMessagePasserOUGradientTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalOUFocusedParityAndCacheTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalOrthogonalBlockFrechetExactTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalOUXmlWiringTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalWorkspaceHardeningTest.java"/>
</fileset>
</batchtest>
</junit>
<fail message="At least one of the canonical JUnits failed the test. Check test results." if="test.failed"/>
<echo message="Canonical JUnit tests finished."/>
</target>

<target name="junit-canonical-boundaries" depends="compile-all"
description="Run canonical package-boundary guard tests">
<mkdir dir="${report}"/>
<junit printsummary="yes" haltonfailure="no" failureproperty="test.failed">
<classpath>
<path refid="classpath"/>
<path location="${build}"/>
</classpath>
<jvmarg value="-Djava.library.path=${java.library.path}"/>
<formatter type="xml"/>

<batchtest fork="yes" todir="${report}">
<fileset dir="${src}">
<include name="test/dr/evomodel/treedatalikelihood/continuous/CanonicalPackageBoundaryTest.java"/>
</fileset>
</batchtest>
</junit>
<fail message="At least one canonical package-boundary guard failed. Check test results." if="test.failed"/>
<echo message="Canonical package-boundary guard finished."/>
</target>

<target name="junit-canonical-behavior" depends="compile-all"
description="Run the canonical OU behavior and benchmark guard suite">
<mkdir dir="${report}"/>
<junit printsummary="yes" haltonfailure="no" failureproperty="test.failed">
<classpath>
<path refid="classpath"/>
<path location="${build}"/>
</classpath>
<jvmarg value="-Djava.library.path=${java.library.path}"/>
<formatter type="xml"/>

<batchtest fork="yes" todir="${report}">
<fileset dir="${src}">
<include name="test/dr/evomodel/treedatalikelihood/continuous/Canonical*Test.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/OUDiffusionKernelBridgeValidationTest.java"/>
<include name="test/dr/evomodel/treedatalikelihood/continuous/TreeCanonicalOrthogonalBlockBenchmarkTest.java"/>
<include name="test/dr/inference/timeseries/CanonicalTimeSeriesBehaviorTest.java"/>
<include name="test/dr/inferencexml/timeseries/OUSelectionChartParserHelperTest.java"/>
</fileset>
</batchtest>
</junit>
<fail message="At least one canonical behavior guard failed. Check test results." if="test.failed"/>
<echo message="Canonical behavior guard suite finished."/>
</target>

<target name="junitreport">
<junitreport todir="${report}">
<fileset dir="${report}" includes="*.xml"/>
Expand Down
79 changes: 79 additions & 0 deletions docs/canonical-architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Canonical OU Architecture

The canonical OU tree implementation is organized around a narrow, flat row-major
numerical core. Matrices in canonical hot paths should be represented as
`double[]` with index `row * dimension + column`. Use `double[][]` or EJML
objects only at legacy, BEAST, or external-library boundaries where conversion
would cost more clarity or performance than it saves.

## Module Boundaries

- `dr.evomodel.treedatalikelihood.continuous.canonical.traversal`
owns tree state plus post-order and pre-order movement. It should not own
gradient target math, BEAST/CDI lifecycle, or OU backend specialization.
- `dr.evomodel.treedatalikelihood.continuous.canonical.message`
owns canonical Gaussian states, branch transition factors, local adjoints, and
Gaussian message algebra. It should stay tree-topology agnostic.
- `dr.evomodel.treedatalikelihood.continuous.canonical.gradient`
owns tree-level adjoint preparation and pullbacks to model gradient targets.
It should not know BEAST/CDI lifecycle details or specialized backend classes.
- `dr.evomodel.treedatalikelihood.continuous.canonical.adapter`
owns BEAST/CDI lifecycle, tip synchronization, root-prior adapters, dirty state,
and cache diagnostics. It adapts external model objects into the canonical core.
- `dr.evomodel.continuous.ou.canonical`
owns the OU kernel contracts and optional backend capability interfaces. It is
the narrow model/kernel surface consumed by canonical tree code.
- `dr.evomodel.continuous.ou.orthogonalblockdiagonal`
owns the private specialized orthogonal-block backend: basis caching, prepared
branch data, transition/covariance assembly, and native gradient pullbacks.

Boundary tests in `CanonicalPackageBoundaryTest` enforce the most important
dependencies. When a new dependency violates those tests, prefer adding a small
capability interface at the boundary over importing implementation packages
directly.

## Gradient Ownership

Canonical OU tree gradients enter through
`canonical.adapter.CanonicalOUGradientAdapter`, which delegates to
`canonical.adapter.CanonicalOUTreeLikelihoodIntegrator`. The integrator owns
gradient accumulators, the cached joint-gradient values, and the reusable
`canonical.gradient.BranchGradientInputs` prepared state.

`BranchGradientInputs` is the single canonical tree-gradient preparation product:
it carries branch-local `CanonicalLocalTransitionAdjoints`, effective branch
lengths, prepared transition/basis handles from the transition cache, and the
root pre/post-order states. Selection, diffusion, stationary-mean, branch-length,
and root-mean gradients should consume this prepared state instead of preparing
their own local branch adjoints.

`BranchSpecificGradient` and `ContinuousTraitGradientForBranch` are legacy
branch-gradient machinery. They must not become dependencies of the canonical
tree-gradient backend. Canonical diagnostics may compare against legacy or finite
difference results, but those comparisons should live in tests or explicit debug
helpers rather than normal analytic dispatch.

Parallel canonical branch-gradient preparation and pullback use caller-owned
`BranchGradientWorkspace` instances, one per task-pool worker plus a reduction
workspace. Shared transition/basis data is owned by the transition cache; worker
loops should only write to worker-local scratch or to child-indexed staging slots.

## Orthogonal-Block Pullbacks

The orthogonal-block backend is the only implementation package allowed to know
about the specialized block structure. Canonical tree gradients interact with it
through model capability interfaces and caller-owned workspaces. The hot path is:

- `CanonicalSelectionGradientPullback` prepares tree-level branch adjoints.
- `SpecializedCanonicalSelectionGradientPullback` accumulates into reusable
`SpecializedGradientWorkspace` buffers.
- `SpecializedCanonicalSelectionParameterization` and
`CanonicalGradientPackingCapability` expose fill/accumulate APIs only.
- `orthogonalblockdiagonal` owns prepared branch/basis caches and any private
EJML or block-specialized scratch.

Orthogonal-block pullbacks should be allocation-free after construction:
rotation, compressed-block, native-block, diffusion, and mean gradients all use
flat row-major `double[]` buffers supplied by the caller or by an explicit
workspace. Do not introduce `double[][]` into canonical gradient internals, and
do not add return-array pullback APIs to the canonical tree-gradient path.
18 changes: 15 additions & 3 deletions src/dr/app/beast/development_parsers.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#
# development_parsers.properties
#
# Copyright © 2002-2024 the BEAST Development Team
# Copyright © 2002-2024 the BEAST Development Team
# http://beast.community/about
#
# This file is part of BEAST.
Expand All @@ -28,10 +28,12 @@
# A list of additional parsers to be loaded at runtime
# They can be references to an actual XMLObjectParser class or a class which
# has one or more static instances of XMLObjectParser

dr.util.ParameterSubsetLoggerParser
# OPERATOR SCHEDULES
dr.inferencexml.operators.AlternatingOperatorScheduleParser

dr.inference.model.BlockDiagonalPolarStableMatrixParameter
dr.inference.model.OrthogonalBlockDiagonalPolarStableMatrixParameter
dr.inference.model.GivensRotationMatrixParameter
# SPECIATION
dr.evomodelxml.speciation.ModelAveragingSpeciationLikelihoodParser
dr.evomodelxml.speciation.CalibratedSpeciationLikelihoodParser
Expand Down Expand Up @@ -117,6 +119,8 @@ dr.evomodel.tree.ParaphylyRateStatistic
# SIMULATION STUDIES
dr.evoxml.RandomSubsetTaxaParser
dr.evomodel.continuous.TreeTraitSimulator
dr.evomodel.continuous.GeneralOUTreeSimulator
dr.evomodel.continuous.GeneralOUTraitSimulator
dr.inferencexml.operators.SwapParameterOperatorParser
dr.evomodel.continuous.LatentFactorModelSimulator
dr.evomodel.continuous.MissingInjection
Expand Down Expand Up @@ -494,3 +498,11 @@ dr.inferencexml.loggers.PrngStateLoggerParser
dr.inferencexml.glm.LogisticRegressionGradientParser
dr.inferencexml.model.SplineBasisMatrixParser
dr.inferencexml.model.SplinePredictionLoggerParser

# Time series models
dr.inferencexml.timeseries.UniformTimeGridParser
dr.inferencexml.timeseries.OUProcessModelParser
dr.inferencexml.timeseries.GaussianObservationModelParser
dr.inferencexml.timeseries.BasicTimeSeriesModelParser
dr.inferencexml.timeseries.TimeSeriesLikelihoodParser
dr.inferencexml.timeseries.TimeSeriesGradientParser
4 changes: 4 additions & 0 deletions src/dr/app/beast/release_parsers.properties
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ dr.evomodelxml.treedatalikelihood.TreeDataLikelihoodParser
dr.evomodelxml.treedatalikelihood.MultiPartitionDataLikelihoodParser
dr.evomodelxml.treedatalikelihood.ContinuousDataLikelihoodParser

# SIMULATION STUDIES
dr.evomodel.continuous.GeneralOUTreeSimulator
dr.evomodel.continuous.GeneralOUTraitSimulator


# TREE LIKELIHOOD
dr.evomodelxml.treelikelihood.BeagleTreeLikelihoodParser
Expand Down
Loading
Loading