Source code for teneva.sample_func
"""Package teneva, module sample_func: sampling from functional TT-tensor.
This module contains the function "sample_func" for sampling from the
functional TT-tensor (i.e., the tensor of interpolation coefficients).
"""
import numpy as np
import teneva
[docs]def sample_func(A, seed=None, cores_are_prepared=False):
"""Sample random points according to given functional probability TT-tensor.
Args:
A (list): TT-tensor, which represents the interpolation coeeficients
for the probability distribution.
cores_are_prepared (bool): special flag for inner usage.
seed (int): random seed. It should be an integer number or a numpy
Generator class instance.
Returns:
np.ndarray: generated point for the tensor in the form of array of the
shape [d], where d is the dimension.
"""
rand = teneva._rand(seed)
if not cores_are_prepared:
A = teneva.copy(A)
for G in A:
G[:, 0, :] *= np.sqrt(2.)
A = teneva.orthogonalize(A, 0)
x_prev = None
G_prev = np.array([1.])
for G in A:
G_cur = np.einsum('i,ijk->jk', G_prev, G)
G0 = np.copy(G_cur)
G0[0, :] /= np.sqrt(2)
x_new = np.empty(1 if x_prev is None else x_prev.shape[0] + 1)
if x_prev is not None:
x_new[:-1] = x_prev
p = sum([np.polynomial.chebyshev.Chebyshev(cf)**2 for cf in G0.T])
x_cur = x_new[-1] = _sample_poly_1(p, rand)
H_new = _cheb_my_poly(np.array(x_cur), G.shape[1])
G_prev = np.einsum('i,ik', H_new, G_cur)
x_prev = x_new
return x_prev
def _cheb_my_poly(X, n):
X = np.asarray(X)
to_red = False
if X.ndim == 0:
X = X[None]
to_red = True
res = np.ones([X.shape[0], n])
if n > 1:
res[:, 1] = X
for i in range(2, n):
res[:, i] = 2*X*res[:, i - 1] - res[:, i - 2]
res[:, 0] = np.sqrt(0.5)
if to_red:
res = res[0]
return res
def _sample_poly_1(p2, rand):
p2_int = p2.integ(lbnd=-1)
xi = rand.uniform() # np.random.uniform() #
p2_int_sh = p2_int - xi*(p2_int(1))
roots = [np.real(i) for i in p2_int_sh.roots() if np.imag(i) == 0]
assert len(roots) == 1
return roots[0]