# %%
import numpy as np
from .interpolation import interpolate, interpolate_grid as interpolate_grid_wrapper
from .transformer import (
integrate_numeric,
integrate_closed_form,
derivative_numeric,
derivative_closed_form,
derivative_space_numeric,
derivative_space_closed_form
)
from .transformer import get_cell, get_velocity, batch_effect
from ...core.utility import methods
# %%
[docs]def assert_version():
numbers = np.__version__.split(".")
version = float(numbers[0] + "." + numbers[1])
assert (
version >= 1.14
), """ You are using a older installation of numpy, please install 1.15.
or newer """
# %%
half = np.float16
single = np.float32
double = np.float64
[docs]def to(x, dtype=np.float32, device=None):
return np.array(x)
# %%
[docs]def tonumpy(x):
return x
# %%
[docs]def check_device(x, device_name):
return True # always return true, because device can only be cpu
# %%
[docs]def backend_type():
return np.ndarray
# %%
# %%
[docs]def identity(d, n_sample=1, epsilon=0, device="cpu"):
assert epsilon >= 0, "epsilon need to be larger than or 0"
return np.zeros((n_sample, d), dtype=np.float32) + epsilon
# %%
# %%
[docs]def calc_velocity(grid, theta, params):
grid = batch_effect(grid, theta)
v = get_velocity(grid, theta, params)
return v.reshape(theta.shape[0], -1)
# %%
[docs]def exp(*args, **kwargs):
return np.exp(*args, **kwargs)
[docs]def linspace(*args, **kwargs):
return np.linspace(*args, **kwargs)
[docs]def meshgrid(*args, **kwargs):
return np.meshgrid(*args, **kwargs)
[docs]def matmul(*args, **kwargs):
return np.matmul(*args, **kwargs)
[docs]def max(*args, **kwargs):
return np.max(*args, **kwargs)
[docs]def ones(*args, **kwargs):
return np.ones(*args, **kwargs)
[docs]def pdist(c):
x, y = np.meshgrid(c, c)
return np.abs(x - y)
# %%
# %%
[docs]def gradient(grid, theta, params, method=None, time=1.0):
methods.check(method)
method = methods.default(method)
if method == methods.closed_form:
phi, der = derivative_closed_form(grid, theta, params, time)
return der
elif method == methods.numeric:
h = 1e-2
phi, der = derivative_numeric(grid, theta, params, time, h)
return der
# %%
[docs]def gradient_space(grid, theta, params, method=None, time=1.0):
methods.check(method)
method = methods.default(method)
if method == methods.closed_form:
phi, der = derivative_space_closed_form(grid, theta, params, time)
return der
elif method == methods.numeric:
h = 1e-2
phi, der = derivative_space_numeric(grid, theta, params, time, h)
return der
# %%
[docs]def interpolate_grid(transformed_grid, params):
return interpolate_grid_wrapper(transformed_grid)