From 3f7a32bae85b8e6e8efb1647ece9046773973ff7 Mon Sep 17 00:00:00 2001 From: John Bogovic Date: Wed, 15 Jul 2026 13:38:07 -0400 Subject: [PATCH] feat: fix RealTransformFiniteDerivatives copy * expose step size in constructor * expose step size in WrappedIterativeInvertibleRealTransform --- .../RealTransformFiniteDerivatives.java | 30 ++++++++++++------- ...appedIterativeInvertibleRealTransform.java | 20 +++++++++++-- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/imglib2/realtransform/inverse/RealTransformFiniteDerivatives.java b/src/main/java/net/imglib2/realtransform/inverse/RealTransformFiniteDerivatives.java index bb9b6de..1c84a85 100644 --- a/src/main/java/net/imglib2/realtransform/inverse/RealTransformFiniteDerivatives.java +++ b/src/main/java/net/imglib2/realtransform/inverse/RealTransformFiniteDerivatives.java @@ -53,13 +53,30 @@ public class RealTransformFiniteDerivatives extends AbstractDifferentiableRealTr protected double step; + private int ndims; + private double[] p; + private double[] q; + private double[] qc; + private double[][] newjac; + public RealTransformFiniteDerivatives( final RealTransform transform ) + { + this( transform, 0.01); + } + + public RealTransformFiniteDerivatives( final RealTransform transform, double step ) { this.transform = transform; int srcD = transform.numSourceDimensions(); int tgtD = transform.numTargetDimensions(); jacobian = new AffineTransform( srcD > tgtD ? srcD : tgtD ); - step = 0.01; + this.step = step; + + ndims = numSourceDimensions(); + p = new double[ ndims ]; + q = new double[ ndims ]; + qc = new double[ ndims ]; + newjac = new double[ ndims ][ ndims+1 ]; } public void setStep( double step ) @@ -89,7 +106,7 @@ public void apply( RealLocalizable source, RealPositionable target ) public RealTransformFiniteDerivatives copy() { - return new RealTransformFiniteDerivatives( transform.copy() ); + return new RealTransformFiniteDerivatives( transform.copy(), step ); } /** @@ -102,15 +119,7 @@ public RealTransformFiniteDerivatives copy() */ public AffineTransform jacobian( double[] x ) { - int ndims = numSourceDimensions(); - double[] p = new double[ ndims ]; - double[] q = new double[ ndims ]; - double[] qc = new double[ ndims ]; - - double[][] newjac = new double[ ndims ][ ndims+1 ]; - transform.apply( x, qc ); - for ( int i = 0; i < ndims; i++ ) { for ( int j = 0; j < ndims; j++ ) @@ -127,7 +136,6 @@ public AffineTransform jacobian( double[] x ) } } jacobian.set( newjac ); - return jacobian; } diff --git a/src/main/java/net/imglib2/realtransform/inverse/WrappedIterativeInvertibleRealTransform.java b/src/main/java/net/imglib2/realtransform/inverse/WrappedIterativeInvertibleRealTransform.java index 88da041..7f02547 100644 --- a/src/main/java/net/imglib2/realtransform/inverse/WrappedIterativeInvertibleRealTransform.java +++ b/src/main/java/net/imglib2/realtransform/inverse/WrappedIterativeInvertibleRealTransform.java @@ -49,15 +49,31 @@ public class WrappedIterativeInvertibleRealTransform< T extends RealTransform > public WrappedIterativeInvertibleRealTransform( final T xfm ) { - this.forwardTransform = xfm; + this(xfm, 0.01); + } + /** + * WrappedIterativeInvertibleRealTransform constructor. Wrapps the given + * transform with a {@link RealTransformFiniteDerivatives} if needed, using + * the provided step. + * + * @param xfm + * transformation to wrap + * @param finiteDerivativeStep + * step size for finite derivatives if needed + */ + public WrappedIterativeInvertibleRealTransform( final T xfm, double finiteDerivativeStep ) + { + this.forwardTransform = xfm; if( xfm instanceof DifferentiableRealTransform ) { differentiableTransform = (DifferentiableRealTransform) xfm; } else { - differentiableTransform = new RealTransformFiniteDerivatives( xfm ); + final RealTransformFiniteDerivatives tformFinite = new RealTransformFiniteDerivatives( xfm ); + tformFinite.setStep(finiteDerivativeStep); + differentiableTransform = tformFinite; } inverseTransform = new InverseRealTransformGradientDescent( xfm.numSourceDimensions(), differentiableTransform );