1st notebook#

[ ]:
%pip install git+https://github.com/nndt-team/nndt.git
%pip install ipyvtklink
[14]:
import nndt
import nndt.space2 as spc
from nndt.datasets import ACDC

nndt.__version__
[14]:
'0.0.3b1'

nndt.init_colab() turns on interactive plots in google collaboratory. This string is not necessary in py-scripts or jupyter notebook.

[15]:
# nndt.init_colab()

spc.load_from_path detects files in some path and loads objects automatically.

[ ]:
ACDC().load()
[16]:
space = spc.load_from_path("./.datasets/ACDC_5")
print(space.print())
Downloading...
From: https://drive.google.com/uc?export=download&id=1UzC2WPkjMQSxzI5sj1rMT47URuZbQhYb
To: /home/kostanew/PycharmProjects/nndt/tutorials/.datasets/ACDC_5/temp.7z
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████| 9.01M/9.01M [00:02<00:00, 4.31MB/s]
Loading complete
S:space 0.0.3b1
├── O3D:patient009 ((0.00, 0.00, 0.00), (0.00, 0.00, 0.00))
│   ├── FS:colored_obj mesh_obj ./.datasets/ACDC_5/patient009/colored.obj
│   ├── FS:sdf_npy sdt ./.datasets/ACDC_5/patient009/sdf.npy
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   └── unload_from_memory()
├── O3D:patient029 ((0.00, 0.00, 0.00), (0.00, 0.00, 0.00))
│   ├── FS:colored_obj mesh_obj ./.datasets/ACDC_5/patient029/colored.obj
│   ├── FS:sdf_npy sdt ./.datasets/ACDC_5/patient029/sdf.npy
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   └── unload_from_memory()
├── O3D:patient049 ((0.00, 0.00, 0.00), (0.00, 0.00, 0.00))
│   ├── FS:colored_obj mesh_obj ./.datasets/ACDC_5/patient049/colored.obj
│   ├── FS:sdf_npy sdt ./.datasets/ACDC_5/patient049/sdf.npy
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   └── unload_from_memory()
├── O3D:patient069 ((0.00, 0.00, 0.00), (0.00, 0.00, 0.00))
│   ├── FS:colored_obj mesh_obj ./.datasets/ACDC_5/patient069/colored.obj
│   ├── FS:sdf_npy sdt ./.datasets/ACDC_5/patient069/sdf.npy
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   └── unload_from_memory()
├── O3D:patient089 ((0.00, 0.00, 0.00), (0.00, 0.00, 0.00))
│   ├── FS:colored_obj mesh_obj ./.datasets/ACDC_5/patient089/colored.obj
│   ├── FS:sdf_npy sdt ./.datasets/ACDC_5/patient089/sdf.npy
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   └── unload_from_memory()
├── init()
├── plot(default, filepath=None)
├── preload(identity|shift_and_scale|to_cube, scale, keep_in_memory=True)
├── print(default|source|full)
├── save_space_to_file(filepath)
├── to_json()
└── unload_from_memory()

After file detection, each file must be read at least once. Use .preload() to do this

[17]:
space.preload()
space.plot(notebook=True)

All methods of the tree above are available for the call and will work correctly with corresponding data

[18]:
help(space.patient009.sampling_grid)
Help on method sampling_grid in module nndt.space2.method_set:

sampling_grid(spacing: (<class 'int'>, <class 'int'>, <class 'int'>) = (2, 2, 2)) -> jax._src.numpy.ndarray.ndarray method of nndt.space2.method_set.SamplingMethodSetNode instance
    Sample points from a bounding box (bbox) according to vertex of uniform mesh.
    This method work for the normalized space.

    Data transformation
    sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]

    :param spacing: Number of slices for each coordinates of the bbox.
    :return: 4-dimensional tensor, the last axis is (x,y,z) point position.

[19]:
space.patient009.sampling_grid((10, 10, 10))
[19]:
DeviceArray([[[[  0.      ,   0.      ,   0.      ],
               [  0.      ,   0.      ,   9.333333],
               [  0.      ,   0.      ,  18.666666],
               ...,
               [  0.      ,   0.      ,  65.33333 ],
               [  0.      ,   0.      ,  74.666664],
               [  0.      ,   0.      ,  84.      ]],

              [[  0.      ,  20.333334,   0.      ],
               [  0.      ,  20.333334,   9.333333],
               [  0.      ,  20.333334,  18.666666],
               ...,
               [  0.      ,  20.333334,  65.33333 ],
               [  0.      ,  20.333334,  74.666664],
               [  0.      ,  20.333334,  84.      ]],

              [[  0.      ,  40.666668,   0.      ],
               [  0.      ,  40.666668,   9.333333],
               [  0.      ,  40.666668,  18.666666],
               ...,
               [  0.      ,  40.666668,  65.33333 ],
               [  0.      ,  40.666668,  74.666664],
               [  0.      ,  40.666668,  84.      ]],

              ...,

              [[  0.      , 142.33334 ,   0.      ],
               [  0.      , 142.33334 ,   9.333333],
               [  0.      , 142.33334 ,  18.666666],
               ...,
               [  0.      , 142.33334 ,  65.33333 ],
               [  0.      , 142.33334 ,  74.666664],
               [  0.      , 142.33334 ,  84.      ]],

              [[  0.      , 162.66667 ,   0.      ],
               [  0.      , 162.66667 ,   9.333333],
               [  0.      , 162.66667 ,  18.666666],
               ...,
               [  0.      , 162.66667 ,  65.33333 ],
               [  0.      , 162.66667 ,  74.666664],
               [  0.      , 162.66667 ,  84.      ]],

              [[  0.      , 183.      ,   0.      ],
               [  0.      , 183.      ,   9.333333],
               [  0.      , 183.      ,  18.666666],
               ...,
               [  0.      , 183.      ,  65.33333 ],
               [  0.      , 183.      ,  74.666664],
               [  0.      , 183.      ,  84.      ]]],


             [[[ 14.888889,   0.      ,   0.      ],
               [ 14.888889,   0.      ,   9.333333],
               [ 14.888889,   0.      ,  18.666666],
               ...,
               [ 14.888889,   0.      ,  65.33333 ],
               [ 14.888889,   0.      ,  74.666664],
               [ 14.888889,   0.      ,  84.      ]],

              [[ 14.888889,  20.333334,   0.      ],
               [ 14.888889,  20.333334,   9.333333],
               [ 14.888889,  20.333334,  18.666666],
               ...,
               [ 14.888889,  20.333334,  65.33333 ],
               [ 14.888889,  20.333334,  74.666664],
               [ 14.888889,  20.333334,  84.      ]],

              [[ 14.888889,  40.666668,   0.      ],
               [ 14.888889,  40.666668,   9.333333],
               [ 14.888889,  40.666668,  18.666666],
               ...,
               [ 14.888889,  40.666668,  65.33333 ],
               [ 14.888889,  40.666668,  74.666664],
               [ 14.888889,  40.666668,  84.      ]],

              ...,

              [[ 14.888889, 142.33334 ,   0.      ],
               [ 14.888889, 142.33334 ,   9.333333],
               [ 14.888889, 142.33334 ,  18.666666],
               ...,
               [ 14.888889, 142.33334 ,  65.33333 ],
               [ 14.888889, 142.33334 ,  74.666664],
               [ 14.888889, 142.33334 ,  84.      ]],

              [[ 14.888889, 162.66667 ,   0.      ],
               [ 14.888889, 162.66667 ,   9.333333],
               [ 14.888889, 162.66667 ,  18.666666],
               ...,
               [ 14.888889, 162.66667 ,  65.33333 ],
               [ 14.888889, 162.66667 ,  74.666664],
               [ 14.888889, 162.66667 ,  84.      ]],

              [[ 14.888889, 183.      ,   0.      ],
               [ 14.888889, 183.      ,   9.333333],
               [ 14.888889, 183.      ,  18.666666],
               ...,
               [ 14.888889, 183.      ,  65.33333 ],
               [ 14.888889, 183.      ,  74.666664],
               [ 14.888889, 183.      ,  84.      ]]],


             [[[ 29.777779,   0.      ,   0.      ],
               [ 29.777779,   0.      ,   9.333333],
               [ 29.777779,   0.      ,  18.666666],
               ...,
               [ 29.777779,   0.      ,  65.33333 ],
               [ 29.777779,   0.      ,  74.666664],
               [ 29.777779,   0.      ,  84.      ]],

              [[ 29.777779,  20.333334,   0.      ],
               [ 29.777779,  20.333334,   9.333333],
               [ 29.777779,  20.333334,  18.666666],
               ...,
               [ 29.777779,  20.333334,  65.33333 ],
               [ 29.777779,  20.333334,  74.666664],
               [ 29.777779,  20.333334,  84.      ]],

              [[ 29.777779,  40.666668,   0.      ],
               [ 29.777779,  40.666668,   9.333333],
               [ 29.777779,  40.666668,  18.666666],
               ...,
               [ 29.777779,  40.666668,  65.33333 ],
               [ 29.777779,  40.666668,  74.666664],
               [ 29.777779,  40.666668,  84.      ]],

              ...,

              [[ 29.777779, 142.33334 ,   0.      ],
               [ 29.777779, 142.33334 ,   9.333333],
               [ 29.777779, 142.33334 ,  18.666666],
               ...,
               [ 29.777779, 142.33334 ,  65.33333 ],
               [ 29.777779, 142.33334 ,  74.666664],
               [ 29.777779, 142.33334 ,  84.      ]],

              [[ 29.777779, 162.66667 ,   0.      ],
               [ 29.777779, 162.66667 ,   9.333333],
               [ 29.777779, 162.66667 ,  18.666666],
               ...,
               [ 29.777779, 162.66667 ,  65.33333 ],
               [ 29.777779, 162.66667 ,  74.666664],
               [ 29.777779, 162.66667 ,  84.      ]],

              [[ 29.777779, 183.      ,   0.      ],
               [ 29.777779, 183.      ,   9.333333],
               [ 29.777779, 183.      ,  18.666666],
               ...,
               [ 29.777779, 183.      ,  65.33333 ],
               [ 29.777779, 183.      ,  74.666664],
               [ 29.777779, 183.      ,  84.      ]]],


             ...,


             [[[104.22223 ,   0.      ,   0.      ],
               [104.22223 ,   0.      ,   9.333333],
               [104.22223 ,   0.      ,  18.666666],
               ...,
               [104.22223 ,   0.      ,  65.33333 ],
               [104.22223 ,   0.      ,  74.666664],
               [104.22223 ,   0.      ,  84.      ]],

              [[104.22223 ,  20.333334,   0.      ],
               [104.22223 ,  20.333334,   9.333333],
               [104.22223 ,  20.333334,  18.666666],
               ...,
               [104.22223 ,  20.333334,  65.33333 ],
               [104.22223 ,  20.333334,  74.666664],
               [104.22223 ,  20.333334,  84.      ]],

              [[104.22223 ,  40.666668,   0.      ],
               [104.22223 ,  40.666668,   9.333333],
               [104.22223 ,  40.666668,  18.666666],
               ...,
               [104.22223 ,  40.666668,  65.33333 ],
               [104.22223 ,  40.666668,  74.666664],
               [104.22223 ,  40.666668,  84.      ]],

              ...,

              [[104.22223 , 142.33334 ,   0.      ],
               [104.22223 , 142.33334 ,   9.333333],
               [104.22223 , 142.33334 ,  18.666666],
               ...,
               [104.22223 , 142.33334 ,  65.33333 ],
               [104.22223 , 142.33334 ,  74.666664],
               [104.22223 , 142.33334 ,  84.      ]],

              [[104.22223 , 162.66667 ,   0.      ],
               [104.22223 , 162.66667 ,   9.333333],
               [104.22223 , 162.66667 ,  18.666666],
               ...,
               [104.22223 , 162.66667 ,  65.33333 ],
               [104.22223 , 162.66667 ,  74.666664],
               [104.22223 , 162.66667 ,  84.      ]],

              [[104.22223 , 183.      ,   0.      ],
               [104.22223 , 183.      ,   9.333333],
               [104.22223 , 183.      ,  18.666666],
               ...,
               [104.22223 , 183.      ,  65.33333 ],
               [104.22223 , 183.      ,  74.666664],
               [104.22223 , 183.      ,  84.      ]]],


             [[[119.111115,   0.      ,   0.      ],
               [119.111115,   0.      ,   9.333333],
               [119.111115,   0.      ,  18.666666],
               ...,
               [119.111115,   0.      ,  65.33333 ],
               [119.111115,   0.      ,  74.666664],
               [119.111115,   0.      ,  84.      ]],

              [[119.111115,  20.333334,   0.      ],
               [119.111115,  20.333334,   9.333333],
               [119.111115,  20.333334,  18.666666],
               ...,
               [119.111115,  20.333334,  65.33333 ],
               [119.111115,  20.333334,  74.666664],
               [119.111115,  20.333334,  84.      ]],

              [[119.111115,  40.666668,   0.      ],
               [119.111115,  40.666668,   9.333333],
               [119.111115,  40.666668,  18.666666],
               ...,
               [119.111115,  40.666668,  65.33333 ],
               [119.111115,  40.666668,  74.666664],
               [119.111115,  40.666668,  84.      ]],

              ...,

              [[119.111115, 142.33334 ,   0.      ],
               [119.111115, 142.33334 ,   9.333333],
               [119.111115, 142.33334 ,  18.666666],
               ...,
               [119.111115, 142.33334 ,  65.33333 ],
               [119.111115, 142.33334 ,  74.666664],
               [119.111115, 142.33334 ,  84.      ]],

              [[119.111115, 162.66667 ,   0.      ],
               [119.111115, 162.66667 ,   9.333333],
               [119.111115, 162.66667 ,  18.666666],
               ...,
               [119.111115, 162.66667 ,  65.33333 ],
               [119.111115, 162.66667 ,  74.666664],
               [119.111115, 162.66667 ,  84.      ]],

              [[119.111115, 183.      ,   0.      ],
               [119.111115, 183.      ,   9.333333],
               [119.111115, 183.      ,  18.666666],
               ...,
               [119.111115, 183.      ,  65.33333 ],
               [119.111115, 183.      ,  74.666664],
               [119.111115, 183.      ,  84.      ]]],


             [[[134.      ,   0.      ,   0.      ],
               [134.      ,   0.      ,   9.333333],
               [134.      ,   0.      ,  18.666666],
               ...,
               [134.      ,   0.      ,  65.33333 ],
               [134.      ,   0.      ,  74.666664],
               [134.      ,   0.      ,  84.      ]],

              [[134.      ,  20.333334,   0.      ],
               [134.      ,  20.333334,   9.333333],
               [134.      ,  20.333334,  18.666666],
               ...,
               [134.      ,  20.333334,  65.33333 ],
               [134.      ,  20.333334,  74.666664],
               [134.      ,  20.333334,  84.      ]],

              [[134.      ,  40.666668,   0.      ],
               [134.      ,  40.666668,   9.333333],
               [134.      ,  40.666668,  18.666666],
               ...,
               [134.      ,  40.666668,  65.33333 ],
               [134.      ,  40.666668,  74.666664],
               [134.      ,  40.666668,  84.      ]],

              ...,

              [[134.      , 142.33334 ,   0.      ],
               [134.      , 142.33334 ,   9.333333],
               [134.      , 142.33334 ,  18.666666],
               ...,
               [134.      , 142.33334 ,  65.33333 ],
               [134.      , 142.33334 ,  74.666664],
               [134.      , 142.33334 ,  84.      ]],

              [[134.      , 162.66667 ,   0.      ],
               [134.      , 162.66667 ,   9.333333],
               [134.      , 162.66667 ,  18.666666],
               ...,
               [134.      , 162.66667 ,  65.33333 ],
               [134.      , 162.66667 ,  74.666664],
               [134.      , 162.66667 ,  84.      ]],

              [[134.      , 183.      ,   0.      ],
               [134.      , 183.      ,   9.333333],
               [134.      , 183.      ,  18.666666],
               ...,
               [134.      , 183.      ,  65.33333 ],
               [134.      , 183.      ,  74.666664],
               [134.      , 183.      ,  84.      ]]]], dtype=float32)

Neural network requires data normalization before training.

Normalization for space units is integrated inside the .preload()

NNDT v0.0.2 supports three method - "identity" is lack of normalization - "shift_and_scale" shifts the bounding box of object to center and divides physical units to scale parameter - "to_cube" push object to cube with edge size of [-1,1]

[20]:
space = spc.load_from_path("../tests/acdc_for_test")
space.preload("shift_and_scale", scale=50)
space.plot()
[21]:
space = spc.load_from_path("../tests/acdc_for_test")
space.preload("to_cube")
space.plot()

.print() supports several modes for pretty printing of 3D object tree. - "default" shows sources, transformations, method sets, and major functions of Object3D. - "sources" shows sources only - "full" shows full tree and all methods

[22]:
print(space.print("source"))
S:space 0.0.3b1
├── O3D:patient009 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient009/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient009/sdf.npy
│   └── TR:transform to_cube
├── O3D:patient029 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient029/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient029/sdf.npy
│   └── TR:transform to_cube
├── O3D:patient049 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient049/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient049/sdf.npy
│   └── TR:transform to_cube
├── O3D:patient069 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient069/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient069/sdf.npy
│   └── TR:transform to_cube
└── O3D:patient089 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
    ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient089/colored.obj
    ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient089/sdf.npy
    └── TR:transform to_cube
[23]:
print(space.print())
S:space 0.0.3b1
├── O3D:patient009 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient009/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient009/sdf.npy
│   ├── TR:transform to_cube
│   ├── MS:mesh
│   ├── MS:mesh_colors
│   ├── MS:sampling
│   ├── MS:sdt
│   ├── MS:train_task
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient029 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient029/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient029/sdf.npy
│   ├── TR:transform to_cube
│   ├── MS:mesh
│   ├── MS:mesh_colors
│   ├── MS:sampling
│   ├── MS:sdt
│   ├── MS:train_task
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient049 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient049/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient049/sdf.npy
│   ├── TR:transform to_cube
│   ├── MS:mesh
│   ├── MS:mesh_colors
│   ├── MS:sampling
│   ├── MS:sdt
│   ├── MS:train_task
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient069 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient069/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient069/sdf.npy
│   ├── TR:transform to_cube
│   ├── MS:mesh
│   ├── MS:mesh_colors
│   ├── MS:sampling
│   ├── MS:sdt
│   ├── MS:train_task
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient089 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient089/colored.obj
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient089/sdf.npy
│   ├── TR:transform to_cube
│   ├── MS:mesh
│   ├── MS:mesh_colors
│   ├── MS:sampling
│   ├── MS:sdt
│   ├── MS:train_task
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── MS:sampling
├── init()
├── plot(default, filepath=None)
├── preload(identity|shift_and_scale|to_cube, scale, keep_in_memory=True)
├── print(default|source|full)
├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
├── sampling_uniform(key, N) -> ns_xyz[N,3]
├── save_space_to_file(filepath)
├── to_json()
└── unload_from_memory()
[24]:
print(space.print("full"))
S:space 0.0.3b1
├── O3D:patient009 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient009/colored.obj
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient009/sdf.npy
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── TR:transform to_cube
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   │   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   │   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   │   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   │   └── unload_from_memory()
│   ├── MS:mesh
│   │   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   │   ├── save_mesh(filepath, {name, array})
│   │   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   │   ├── surface_xyz() -> xyz[N,3]
│   │   └── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── MS:mesh_colors
│   │   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   │   ├── surface_rgba() -> xyz[N,4]
│   │   └── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── MS:sampling
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── MS:sdt
│   │   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   │   └── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── MS:train_task
│   │   └── train_task_sdt2sdf(filename, **kwargs)
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient029 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient029/colored.obj
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient029/sdf.npy
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── TR:transform to_cube
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   │   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   │   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   │   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   │   └── unload_from_memory()
│   ├── MS:mesh
│   │   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   │   ├── save_mesh(filepath, {name, array})
│   │   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   │   ├── surface_xyz() -> xyz[N,3]
│   │   └── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── MS:mesh_colors
│   │   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   │   ├── surface_rgba() -> xyz[N,4]
│   │   └── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── MS:sampling
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── MS:sdt
│   │   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   │   └── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── MS:train_task
│   │   └── train_task_sdt2sdf(filename, **kwargs)
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient049 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient049/colored.obj
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient049/sdf.npy
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── TR:transform to_cube
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   │   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   │   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   │   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   │   └── unload_from_memory()
│   ├── MS:mesh
│   │   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   │   ├── save_mesh(filepath, {name, array})
│   │   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   │   ├── surface_xyz() -> xyz[N,3]
│   │   └── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── MS:mesh_colors
│   │   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   │   ├── surface_rgba() -> xyz[N,4]
│   │   └── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── MS:sampling
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── MS:sdt
│   │   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   │   └── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── MS:train_task
│   │   └── train_task_sdt2sdf(filename, **kwargs)
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient069 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient069/colored.obj
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient069/sdf.npy
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── TR:transform to_cube
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   │   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   │   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   │   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   │   └── unload_from_memory()
│   ├── MS:mesh
│   │   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   │   ├── save_mesh(filepath, {name, array})
│   │   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   │   ├── surface_xyz() -> xyz[N,3]
│   │   └── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── MS:mesh_colors
│   │   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   │   ├── surface_rgba() -> xyz[N,4]
│   │   └── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── MS:sampling
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── MS:sdt
│   │   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   │   └── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── MS:train_task
│   │   └── train_task_sdt2sdf(filename, **kwargs)
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── O3D:patient089 ((-1.00, -1.00, -1.00), (1.00, 1.00, 1.00))
│   ├── FS:colored_obj mesh_obj^ ../tests/acdc_for_test/patient089/colored.obj
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── FS:sdf_npy sdt^ ../tests/acdc_for_test/patient089/sdf.npy
│   │   ├── MS:sampling
│   │   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   │   └── unload_from_memory()
│   ├── TR:transform to_cube
│   │   ├── plot(default, filepath=None)
│   │   ├── print(default|source|full)
│   │   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   │   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   │   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   │   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   │   └── unload_from_memory()
│   ├── MS:mesh
│   │   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   │   ├── save_mesh(filepath, {name, array})
│   │   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   │   ├── surface_xyz() -> xyz[N,3]
│   │   └── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── MS:mesh_colors
│   │   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   │   ├── surface_rgba() -> xyz[N,4]
│   │   └── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── MS:sampling
│   │   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   │   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   │   └── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── MS:sdt
│   │   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   │   └── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── MS:train_task
│   │   └── train_task_sdt2sdf(filename, **kwargs)
│   ├── plot(default, filepath=None)
│   ├── print(default|source|full)
│   ├── sampling_eachN_from_mesh(count=N, step=M, shift=K) -> (ns_ind[N], ns_xyz[N])
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   ├── sampling_uniform(key, N) -> ns_xyz[N,3]
│   ├── save_mesh(filepath, {name, array})
│   ├── surface_ind2rgba(ind[..,1]) -> rgba[..,4]
│   ├── surface_ind2xyz(ind[..,1]) -> ns_xyz[..,3]
│   ├── surface_rgba() -> xyz[N,4]
│   ├── surface_xyz() -> xyz[N,3]
│   ├── surface_xyz2ind(ns_xyz[..,3]) -> ns_dist[..,1], ns_ind[..,1]
│   ├── surface_xyz2localsdt(ns_xyz[3], spacing=(D,H,W), scale=1.) -> ns_xyz[D,H,W,3], ns_localsdt[D,H,W,1]
│   ├── surface_xyz2rgba(ns_xyz[..,3]) -> rgba[..,4]
│   ├── surface_xyz2sdt(ns_xyz[..,3]) -> ns_sdt[..,1]
│   ├── train_task_sdt2sdf(filename, **kwargs)
│   ├── transform_sdt_ns2ps(ns_sdt[..]) -> ps_sdt[..]
│   ├── transform_sdt_ps2ns(ps_sdt[..]) -> ns_sdt[..]
│   ├── transform_xyz_ns2ps(ns_xyz[..,3]) -> ps_xyz[..,3]
│   ├── transform_xyz_ps2ns(ps_xyz[..,3]) -> ns_xyz[..,3]
│   └── unload_from_memory()
├── MS:sampling
│   ├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
│   ├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
│   └── sampling_uniform(key, N) -> ns_xyz[N,3]
├── init()
├── plot(default, filepath=None)
├── preload(identity|shift_and_scale|to_cube, scale, keep_in_memory=True)
├── print(default|source|full)
├── sampling_grid(spacing=(D,H,W)) -> ns_xyz[D,H,W,3]
├── sampling_grid_with_noise(key, spacing=(D,H,W), sigma) -> ns_xyz[N,3]
├── sampling_uniform(key, N) -> ns_xyz[N,3]
├── save_space_to_file(filepath)
├── to_json()
└── unload_from_memory()