Skip to content

Commit 2b3b399

Browse files
committed
test(itkwasm): add pyodide transform interface test
1 parent bc12365 commit 2b3b399

File tree

2 files changed

+156
-2
lines changed

2 files changed

+156
-2
lines changed

packages/core/python/itkwasm/itkwasm/pyodide.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .point_set import PointSet, PointSetType
66
from .mesh import Mesh, MeshType
77
from .polydata import PolyData, PolyDataType
8-
from .transform import Transform, TransformType
8+
from .transform import Transform, TransformType, TransformList
99
from .binary_file import BinaryFile
1010
from .binary_stream import BinaryStream
1111
from .text_file import TextFile

packages/core/python/itkwasm/test/test_pyodide.py

Lines changed: 155 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from pytest_pyodide import run_in_pyodide, copy_files_to_pyodide
99

1010
#from itkwasm import __version__ as test_package_version
11-
test_package_version = '1.0b194'
11+
test_package_version = '1.0b195'
1212

1313

1414
def package_wheel():
@@ -273,6 +273,160 @@ async def test_transform_list_conversion(selenium):
273273
assert translation_py.numberOfFixedParameters == 0
274274
np.testing.assert_allclose(translation_py.parameters, translation_parameters)
275275

276+
@copy_files_to_pyodide(file_list=file_list, install_wheels=True)
277+
@run_in_pyodide(packages=["numpy"])
278+
async def test_linear_transform_conversion(selenium):
279+
from itkwasm import Transform, TransformType, TransformParameterizations, FloatTypes, TransformList
280+
from itkwasm.pyodide import to_js, to_py
281+
import numpy as np
282+
283+
# Create a single linear (affine) transform
284+
transform_type = TransformType(
285+
transformParameterization=TransformParameterizations.Affine,
286+
parametersValueType=FloatTypes.Float64,
287+
inputDimension=3,
288+
outputDimension=3
289+
)
290+
291+
fixed_parameters = np.array([0.0, 0.0, 0.0]).astype(np.float64)
292+
parameters = np.array([
293+
1.0, 0.0, 0.0, # 3x3 matrix row 1
294+
0.0, 1.0, 0.0, # 3x3 matrix row 2
295+
0.0, 0.0, 1.0, # 3x3 matrix row 3
296+
10.0, 20.0, 30.0 # translation vector
297+
]).astype(np.float64)
298+
299+
transform = Transform(
300+
transformType=transform_type,
301+
numberOfParameters=12,
302+
numberOfFixedParameters=3,
303+
fixedParameters=fixed_parameters,
304+
parameters=parameters
305+
)
306+
307+
transform_list: TransformList = [transform]
308+
309+
# Convert to JS and back
310+
transform_list_js = to_js(transform_list)
311+
transform_list_py = to_py(transform_list_js)
312+
313+
# Verify the conversion
314+
assert len(transform_list_py) == 1
315+
316+
transform_py = transform_list_py[0]
317+
assert transform_py.transformType.transformParameterization == TransformParameterizations.Affine
318+
assert transform_py.transformType.parametersValueType == FloatTypes.Float64
319+
assert transform_py.transformType.inputDimension == 3
320+
assert transform_py.transformType.outputDimension == 3
321+
assert transform_py.numberOfFixedParameters == 3
322+
assert transform_py.numberOfParameters == 12
323+
324+
np.testing.assert_allclose(transform_py.fixedParameters, fixed_parameters)
325+
np.testing.assert_allclose(transform_py.parameters, parameters)
326+
327+
328+
@copy_files_to_pyodide(file_list=file_list, install_wheels=True)
329+
@run_in_pyodide(packages=["numpy"])
330+
async def test_composite_transform_conversion(selenium):
331+
from itkwasm import Transform, TransformType, TransformParameterizations, FloatTypes, TransformList
332+
from itkwasm.pyodide import to_js, to_py
333+
import numpy as np
334+
335+
# Create a composite transform
336+
composite_transform_type = TransformType(
337+
transformParameterization=TransformParameterizations.Composite,
338+
parametersValueType=FloatTypes.Float32,
339+
inputDimension=2,
340+
outputDimension=2
341+
)
342+
343+
composite_transform = Transform(
344+
transformType=composite_transform_type,
345+
numberOfParameters=9, # Sum of parameters from component transforms
346+
numberOfFixedParameters=4, # Sum of fixed parameters from component transforms
347+
fixedParameters=np.array([64.0, 64.0, 64.0, 64.0]).astype(np.float32),
348+
parameters=np.array([
349+
# Rigid2D parameters (3)
350+
0.0, 64.0, 64.0,
351+
# Affine parameters (6)
352+
1.0, 0.0, 0.0, 1.0, 0.0, 0.0
353+
]).astype(np.float32)
354+
)
355+
356+
# Create first component transform (Rigid2D)
357+
rigid_transform_type = TransformType(
358+
transformParameterization=TransformParameterizations.Rigid2D,
359+
parametersValueType=FloatTypes.Float32,
360+
inputDimension=2,
361+
outputDimension=2
362+
)
363+
364+
rigid_transform = Transform(
365+
transformType=rigid_transform_type,
366+
numberOfParameters=3,
367+
numberOfFixedParameters=2,
368+
fixedParameters=np.array([64.0, 64.0]).astype(np.float32),
369+
parameters=np.array([0.0, 64.0, 64.0]).astype(np.float32)
370+
)
371+
372+
# Create second component transform (Affine)
373+
affine_transform_type = TransformType(
374+
transformParameterization=TransformParameterizations.Affine,
375+
parametersValueType=FloatTypes.Float32,
376+
inputDimension=2,
377+
outputDimension=2
378+
)
379+
380+
affine_transform = Transform(
381+
transformType=affine_transform_type,
382+
numberOfParameters=6,
383+
numberOfFixedParameters=2,
384+
fixedParameters=np.array([64.0, 64.0]).astype(np.float32),
385+
parameters=np.array([1.0, 0.0, 0.0, 1.0, 0.0, 0.0]).astype(np.float32)
386+
)
387+
388+
# Create transform list with composite + components
389+
transform_list: TransformList = [composite_transform, rigid_transform, affine_transform]
390+
391+
# Convert to JS and back
392+
transform_list_js = to_js(transform_list)
393+
transform_list_py = to_py(transform_list_js)
394+
395+
# Verify the conversion
396+
assert len(transform_list_py) == 3
397+
398+
# Verify composite transform
399+
composite_py = transform_list_py[0]
400+
assert composite_py.transformType.transformParameterization == TransformParameterizations.Composite
401+
assert composite_py.transformType.parametersValueType == FloatTypes.Float32
402+
assert composite_py.transformType.inputDimension == 2
403+
assert composite_py.transformType.outputDimension == 2
404+
assert composite_py.numberOfFixedParameters == 4
405+
assert composite_py.numberOfParameters == 9
406+
407+
# Verify rigid transform
408+
rigid_py = transform_list_py[1]
409+
assert rigid_py.transformType.transformParameterization == TransformParameterizations.Rigid2D
410+
assert rigid_py.transformType.parametersValueType == FloatTypes.Float32
411+
assert rigid_py.transformType.inputDimension == 2
412+
assert rigid_py.transformType.outputDimension == 2
413+
assert rigid_py.numberOfFixedParameters == 2
414+
assert rigid_py.numberOfParameters == 3
415+
np.testing.assert_allclose(rigid_py.fixedParameters, np.array([64.0, 64.0]))
416+
np.testing.assert_allclose(rigid_py.parameters, np.array([0.0, 64.0, 64.0]))
417+
418+
# Verify affine transform
419+
affine_py = transform_list_py[2]
420+
assert affine_py.transformType.transformParameterization == TransformParameterizations.Affine
421+
assert affine_py.transformType.parametersValueType == FloatTypes.Float32
422+
assert affine_py.transformType.inputDimension == 2
423+
assert affine_py.transformType.outputDimension == 2
424+
assert affine_py.numberOfFixedParameters == 2
425+
assert affine_py.numberOfParameters == 6
426+
np.testing.assert_allclose(affine_py.fixedParameters, np.array([64.0, 64.0]))
427+
np.testing.assert_allclose(affine_py.parameters, np.array([1.0, 0.0, 0.0, 1.0, 0.0, 0.0]))
428+
429+
276430
@copy_files_to_pyodide(file_list=file_list, install_wheels=True)
277431
@run_in_pyodide(packages=["numpy"])
278432
async def test_binary_stream_conversion(selenium):

0 commit comments

Comments
 (0)