def __call__(self, x):
"""
Evaluates the piecewise linear function using
interpolation. This method supports vectorized
function calls as the interpolation process can be
expensive for high dimensional data.
For the case when a single point is provided, the
argument x should be a (D,) shaped numpy array or
list, where D is the dimension of points in the
triangulation.
For the vectorized case, the argument x should be
a (n,D)-shaped numpy array.
"""
assert isinstance(x, collections.Sized)
if isinstance(x, pyomo.core.kernel.component_piecewise.\
util.numpy.ndarray):
if x.shape != self._tri.points.shape[1:]:
multi = True
assert x.shape[1:] == self._tri.points[0].shape, \
"%s[1] != %s" % (x.shape, self._tri.points[0].shape)
else:
multi = False
else:
multi = False
_, ndim = self._tri.points.shape
i = self._tri.find_simplex(x)
if multi:
Tinv = self._tri.transform[i,:ndim]
r = self._tri.transform[i,ndim]
b = pyomo.core.kernel.component_piecewise.util.\
numpy.einsum('ijk,ik->ij', Tinv, x-r)
b = pyomo.core.kernel.component_piecewise.util.\
numpy.c_[b, 1 - b.sum(axis=1)]
s = self._tri.simplices[i]
return (b*self._values[s]).sum(axis=1)
else:
b = self._tri.transform[i,:ndim,:ndim].dot(
x - self._tri.transform[i,ndim,:])
s = self._tri.simplices[i]
val = b.dot(self._values[s[:ndim]])
val += (1-b.sum())*self._values[s[ndim]]
return val
评论列表
文章目录