Commit a272d7c5 authored by Martin Reinecke's avatar Martin Reinecke

more renamings

parent 914f053a
Pipeline #64989 passed with stages
in 8 minutes and 50 seconds
...@@ -427,12 +427,12 @@ ...@@ -427,12 +427,12 @@
"\n", "\n",
"mask = np.full(s_space.shape, 1.)\n", "mask = np.full(s_space.shape, 1.)\n",
"mask[l:h] = 0\n", "mask[l:h] = 0\n",
"mask = ift.Field.from_arr(s_space, mask)\n", "mask = ift.Field.from_raw(s_space, mask)\n",
"\n", "\n",
"R = ift.DiagonalOperator(mask)(HT)\n", "R = ift.DiagonalOperator(mask)(HT)\n",
"n = n.val.copy()\n", "n = n.val_rw()\n",
"n[l:h] = 0\n", "n[l:h] = 0\n",
"n = ift.Field.from_arr(s_space, n)\n", "n = ift.Field.from_raw(s_space, n)\n",
"\n", "\n",
"d = R(sh) + n" "d = R(sh) + n"
] ]
...@@ -501,7 +501,7 @@ ...@@ -501,7 +501,7 @@
"m_data = HT(m).val\n", "m_data = HT(m).val\n",
"m_var_data = m_var.val\n", "m_var_data = m_var.val\n",
"uncertainty = np.sqrt(m_var_data)\n", "uncertainty = np.sqrt(m_var_data)\n",
"d_data = d.val.copy()\n", "d_data = d.val_rw()\n",
"\n", "\n",
"# Set lost data to NaN for proper plotting\n", "# Set lost data to NaN for proper plotting\n",
"d_data[d_data == 0] = np.nan" "d_data[d_data == 0] = np.nan"
...@@ -583,12 +583,12 @@ ...@@ -583,12 +583,12 @@
"\n", "\n",
"mask = np.full(s_space.shape, 1.)\n", "mask = np.full(s_space.shape, 1.)\n",
"mask[l:h,l:h] = 0.\n", "mask[l:h,l:h] = 0.\n",
"mask = ift.Field.from_arr(s_space, mask)\n", "mask = ift.Field.from_raw(s_space, mask)\n",
"\n", "\n",
"R = ift.DiagonalOperator(mask)(HT)\n", "R = ift.DiagonalOperator(mask)(HT)\n",
"n = n.val.copy()\n", "n = n.val_rw()\n",
"n[l:h, l:h] = 0\n", "n[l:h, l:h] = 0\n",
"n = ift.Field.from_arr(s_space, n)\n", "n = ift.Field.from_raw(s_space, n)\n",
"curv = Curvature(R=R, N=N, Sh=Sh)\n", "curv = Curvature(R=R, N=N, Sh=Sh)\n",
"D = curv.inverse\n", "D = curv.inverse\n",
"\n", "\n",
......
...@@ -63,7 +63,7 @@ if __name__ == '__main__': ...@@ -63,7 +63,7 @@ if __name__ == '__main__':
mock_position = ift.from_random('normal', harmonic_space) mock_position = ift.from_random('normal', harmonic_space)
tmp = p(mock_position).val.astype(np.float64) tmp = p(mock_position).val.astype(np.float64)
data = np.random.binomial(1, tmp) data = np.random.binomial(1, tmp)
data = ift.Field.from_arr(R.target, data) data = ift.Field.from_raw(R.target, data)
# Compute likelihood and Hamiltonian # Compute likelihood and Hamiltonian
position = ift.from_random('normal', harmonic_space) position = ift.from_random('normal', harmonic_space)
......
...@@ -57,7 +57,7 @@ if __name__ == '__main__': ...@@ -57,7 +57,7 @@ if __name__ == '__main__':
for _ in range(n_samps): for _ in range(n_samps):
fld = pspec(ift.from_random('normal', pspec.domain)) fld = pspec(ift.from_random('normal', pspec.domain))
klengths = fld.domain[0].k_lengths klengths = fld.domain[0].k_lengths
ycoord = fld.val.copy() ycoord = fld.val_rw()
ycoord[0] = ycoord[1] ycoord[0] = ycoord[1]
ax.plot(klengths, ycoord, alpha=1) ax.plot(klengths, ycoord, alpha=1)
......
...@@ -95,7 +95,7 @@ if __name__ == '__main__': ...@@ -95,7 +95,7 @@ if __name__ == '__main__':
# and harmonic transformaion # and harmonic transformaion
# Masking operator to model that parts of the field have not been observed # Masking operator to model that parts of the field have not been observed
mask = ift.Field.from_arr(position_space, mask) mask = ift.Field.from_raw(position_space, mask)
Mask = ift.MaskOperator(mask) Mask = ift.MaskOperator(mask)
# The response operator consists of # The response operator consists of
......
...@@ -40,7 +40,7 @@ def exposure_2d(): ...@@ -40,7 +40,7 @@ def exposure_2d():
exposure[:, x_shape*4//5:x_shape] *= .1 exposure[:, x_shape*4//5:x_shape] *= .1
exposure[:, x_shape//2:x_shape*3//2] *= 3. exposure[:, x_shape//2:x_shape*3//2] *= 3.
return ift.Field.from_arr(position_space, exposure) return ift.Field.from_raw(position_space, exposure)
if __name__ == '__main__': if __name__ == '__main__':
...@@ -95,7 +95,7 @@ if __name__ == '__main__': ...@@ -95,7 +95,7 @@ if __name__ == '__main__':
mock_position = ift.from_random('normal', domain) mock_position = ift.from_random('normal', domain)
data = lamb(mock_position) data = lamb(mock_position)
data = np.random.poisson(data.val.astype(np.float64)) data = np.random.poisson(data.val.astype(np.float64))
data = ift.Field.from_arr(d_space, data) data = ift.Field.from_raw(d_space, data)
likelihood = ift.PoissonianEnergy(data)(lamb) likelihood = ift.PoissonianEnergy(data)(lamb)
# Settings for minimization # Settings for minimization
......
...@@ -71,7 +71,7 @@ class PolynomialResponse(ift.LinearOperator): ...@@ -71,7 +71,7 @@ class PolynomialResponse(ift.LinearOperator):
def apply(self, x, mode): def apply(self, x, mode):
self._check_input(x, mode) self._check_input(x, mode)
val = x.val.copy() val = x.val_rw()
if mode == self.TIMES: if mode == self.TIMES:
# FIXME Use polynomial() here # FIXME Use polynomial() here
out = self._mat.dot(val) out = self._mat.dot(val)
......
...@@ -87,7 +87,7 @@ class LMSpace(StructuredDomain): ...@@ -87,7 +87,7 @@ class LMSpace(StructuredDomain):
for m in range(1, mmax+1): for m in range(1, mmax+1):
ldist[idx:idx+2*(lmax+1-m)] = tmp[2*m:] ldist[idx:idx+2*(lmax+1-m)] = tmp[2*m:]
idx += 2*(lmax+1-m) idx += 2*(lmax+1-m)
return Field.from_arr(self, ldist) return Field.from_raw(self, ldist)
def get_unique_k_lengths(self): def get_unique_k_lengths(self):
return np.arange(self.lmax+1, dtype=np.float64) return np.arange(self.lmax+1, dtype=np.float64)
...@@ -123,7 +123,7 @@ class LMSpace(StructuredDomain): ...@@ -123,7 +123,7 @@ class LMSpace(StructuredDomain):
lm0 = gl.get_default_codomain() lm0 = gl.get_default_codomain()
theta = pyHealpix.GL_thetas(gl.nlat) theta = pyHealpix.GL_thetas(gl.nlat)
# evaluate the kernel function at the required thetas # evaluate the kernel function at the required thetas
kernel_sphere = Field.from_arr(gl, func(theta)) kernel_sphere = Field.from_raw(gl, func(theta))
# normalize the kernel such that the integral over the sphere is 4pi # normalize the kernel such that the integral over the sphere is 4pi
kernel_sphere = kernel_sphere * (4 * np.pi / kernel_sphere.integrate()) kernel_sphere = kernel_sphere * (4 * np.pi / kernel_sphere.integrate())
# compute the spherical harmonic coefficients of the kernel # compute the spherical harmonic coefficients of the kernel
...@@ -131,7 +131,7 @@ class LMSpace(StructuredDomain): ...@@ -131,7 +131,7 @@ class LMSpace(StructuredDomain):
kernel_lm = op.adjoint_times(kernel_sphere.weight(1)).val kernel_lm = op.adjoint_times(kernel_sphere.weight(1)).val
# evaluate the k lengths of the harmonic space # evaluate the k lengths of the harmonic space
k_lengths = self.get_k_length_array().val.astype(np.int) k_lengths = self.get_k_length_array().val.astype(np.int)
return Field.from_arr(self, kernel_lm[k_lengths]) return Field.from_raw(self, kernel_lm[k_lengths])
@property @property
def lmax(self): def lmax(self):
......
...@@ -240,7 +240,7 @@ class PowerSpace(StructuredDomain): ...@@ -240,7 +240,7 @@ class PowerSpace(StructuredDomain):
@property @property
def pindex(self): def pindex(self):
"""data_object : bin indices """numpy.ndarray : bin indices
Bin index for every pixel in the harmonic partner. Bin index for every pixel in the harmonic partner.
""" """
......
...@@ -97,14 +97,14 @@ class RGSpace(StructuredDomain): ...@@ -97,14 +97,14 @@ class RGSpace(StructuredDomain):
res = np.arange(self.shape[0], dtype=np.float64) res = np.arange(self.shape[0], dtype=np.float64)
res = np.minimum(res, self.shape[0]-res)*self.distances[0] res = np.minimum(res, self.shape[0]-res)*self.distances[0]
if len(self.shape) == 1: if len(self.shape) == 1:
return Field.from_arr(self, res) return Field.from_raw(self, res)
res *= res res *= res
for i in range(1, len(self.shape)): for i in range(1, len(self.shape)):
tmp = np.arange(self.shape[i], dtype=np.float64) tmp = np.arange(self.shape[i], dtype=np.float64)
tmp = np.minimum(tmp, self.shape[i]-tmp)*self.distances[i] tmp = np.minimum(tmp, self.shape[i]-tmp)*self.distances[i]
tmp *= tmp tmp *= tmp
res = np.add.outer(res, tmp) res = np.add.outer(res, tmp)
return Field.from_arr(self, np.sqrt(res)) return Field.from_raw(self, np.sqrt(res))
def get_k_length_array(self): def get_k_length_array(self):
if (not self.harmonic): if (not self.harmonic):
......
...@@ -32,8 +32,8 @@ class Field(object): ...@@ -32,8 +32,8 @@ class Field(object):
---------- ----------
domain : DomainTuple domain : DomainTuple
The domain of the new Field. The domain of the new Field.
val : data_object val : numpy.ndarray
This object's global shape must match the domain shape This object's shape must match the domain shape
After construction, the object will no longer be writeable! After construction, the object will no longer be writeable!
Notes Notes
...@@ -93,7 +93,7 @@ class Field(object): ...@@ -93,7 +93,7 @@ class Field(object):
return Field(domain, val) return Field(domain, val)
@staticmethod @staticmethod
def from_arr(domain, arr): def from_raw(domain, arr):
"""Returns a Field constructed from `domain` and `arr`. """Returns a Field constructed from `domain` and `arr`.
Parameters Parameters
...@@ -148,15 +148,19 @@ class Field(object): ...@@ -148,15 +148,19 @@ class Field(object):
@property @property
def val(self): def val(self):
"""numpy.ndarray : the data object storing the field's entries. """numpy.ndarray : the array storing the field's entries.
Notes Notes
----- -----
This property is intended for low-level, internal use only. Do not use The returned array is read-only.
from outside of NIFTy's core; there should be better alternatives.
""" """
return self._val return self._val
def val_rw(self):
"""numpy.ndarray : a copy of the array storing the field's entries.
"""
return self._val.copy()
@property @property
def dtype(self): def dtype(self):
"""type : the data type of the field's entries""" """type : the data type of the field's entries"""
...@@ -241,7 +245,7 @@ class Field(object): ...@@ -241,7 +245,7 @@ class Field(object):
Field Field
The weighted field. The weighted field.
""" """
aout = self.val.copy() aout = self.val_rw()
spaces = utilities.parse_spaces(spaces, len(self._domain)) spaces = utilities.parse_spaces(spaces, len(self._domain))
......
...@@ -179,7 +179,7 @@ class _TwoLogIntegrations(LinearOperator): ...@@ -179,7 +179,7 @@ class _TwoLogIntegrations(LinearOperator):
res[from_third] = (res[from_third] + res[no_border])/2*self._log_vol[extender_sl] + x[first] res[from_third] = (res[from_third] + res[no_border])/2*self._log_vol[extender_sl] + x[first]
res[from_third] = np.cumsum(res[from_third], axis=axis) res[from_third] = np.cumsum(res[from_third], axis=axis)
else: else:
x = x.val.copy() x = x.val_rw()
res = np.zeros(self._domain.shape) res = np.zeros(self._domain.shape)
x[from_third] = np.cumsum(x[from_third][reverse], axis=axis)[reverse] x[from_third] = np.cumsum(x[from_third][reverse], axis=axis)[reverse]
res[first] += x[from_third] res[first] += x[from_third]
...@@ -199,7 +199,7 @@ class _Normalization(Operator): ...@@ -199,7 +199,7 @@ class _Normalization(Operator):
pd = PowerDistributor(hspace, pd = PowerDistributor(hspace,
power_space=self._domain[space], power_space=self._domain[space],
space=space) space=space)
mode_multiplicity = pd.adjoint(full(pd.target, 1.)).val.copy() mode_multiplicity = pd.adjoint(full(pd.target, 1.)).val_rw()
zero_mode = (slice(None),)*self._domain.axes[space][0] + (0,) zero_mode = (slice(None),)*self._domain.axes[space][0] + (0,)
mode_multiplicity[zero_mode] = 0 mode_multiplicity[zero_mode] = 0
self._mode_multiplicity = makeField(self._domain, self._mode_multiplicity = makeField(self._domain,
......
...@@ -172,12 +172,11 @@ class LOSResponse(LinearOperator): ...@@ -172,12 +172,11 @@ class LOSResponse(LinearOperator):
"getting negative distances") "getting negative distances")
real_ends = starts + diffs*real_distances real_ends = starts + diffs*real_distances
dist = np.array(self.domain[0].distances).reshape((-1, 1)) dist = np.array(self.domain[0].distances).reshape((-1, 1))
localized_pixel_starts = starts/dist + 0.5 pixel_starts = starts/dist + 0.5
localized_pixel_ends = real_ends/dist + 0.5 pixel_ends = real_ends/dist + 0.5
# get the shape of the local data slice w_i = _comp_traverse(pixel_starts,
w_i = _comp_traverse(localized_pixel_starts, pixel_ends,
localized_pixel_ends,
self.domain[0].shape, self.domain[0].shape,
np.array(self.domain[0].distances), np.array(self.domain[0].distances),
1./(1./difflen+truncation*sigmas), 1./(1./difflen+truncation*sigmas),
...@@ -229,6 +228,6 @@ class LOSResponse(LinearOperator): ...@@ -229,6 +228,6 @@ class LOSResponse(LinearOperator):
if mode == self.TIMES: if mode == self.TIMES:
result_arr = self._smat.matvec(x.val.reshape(-1)) result_arr = self._smat.matvec(x.val.reshape(-1))
return Field(self._target, result_arr) return Field(self._target, result_arr)
local_input_data = x.val.reshape(-1) input_data = x.val.reshape(-1)
res = self._smat.rmatvec(local_input_data).reshape(self.domain[0].shape) res = self._smat.rmatvec(input_data).reshape(self.domain[0].shape)
return Field(self._domain, res) return Field(self._domain, res)
...@@ -321,7 +321,7 @@ class Linearization(object): ...@@ -321,7 +321,7 @@ class Linearization(object):
tmp = self._val.sinc() tmp = self._val.sinc()
tmp2 = ((np.pi*self._val).cos()-tmp)/self._val tmp2 = ((np.pi*self._val).cos()-tmp)/self._val
ind = self._val.val == 0 ind = self._val.val == 0
loc = tmp2.val.copy() loc = tmp2.val_rw()
loc[ind] = 0 loc[ind] = 0
tmp2 = Field(tmp.domain, loc) tmp2 = Field(tmp.domain, loc)
return self.new(tmp, makeOp(tmp2)(self._jac)) return self.new(tmp, makeOp(tmp2)(self._jac))
...@@ -371,7 +371,7 @@ class Linearization(object): ...@@ -371,7 +371,7 @@ class Linearization(object):
tmp2 = self._val.sign() tmp2 = self._val.sign()
ind = self._val.val == 0 ind = self._val.val == 0
loc = tmp2.val.copy().astype(float) loc = tmp2.val_rw().astype(float)
loc[ind] = np.nan loc[ind] = np.nan
tmp2 = Field(tmp.domain, loc) tmp2 = Field(tmp.domain, loc)
......
...@@ -188,7 +188,7 @@ class MetricGaussianKL_MPI(Energy): ...@@ -188,7 +188,7 @@ class MetricGaussianKL_MPI(Energy):
for s in self._samples: for s in self._samples:
tmp = self._hamiltonian(self._lin+s) tmp = self._hamiltonian(self._lin+s)
if v is None: if v is None:
v = tmp.val.val.copy() v = tmp.val.val_rw()
g = tmp.gradient g = tmp.gradient
else: else:
v += tmp.val.val v += tmp.val.val
......
...@@ -48,7 +48,7 @@ def _toArray(fld): ...@@ -48,7 +48,7 @@ def _toArray(fld):
def _toArray_rw(fld): def _toArray_rw(fld):
if isinstance(fld, Field): if isinstance(fld, Field):
return fld.val.copy().reshape(-1) return fld.val_rw().reshape(-1)
return _multiToArray(fld) return _multiToArray(fld)
......
...@@ -132,12 +132,17 @@ class MultiField(object): ...@@ -132,12 +132,17 @@ class MultiField(object):
return MultiField(domain, tuple(Field(dom, val) return MultiField(domain, tuple(Field(dom, val)
for dom in domain._domains)) for dom in domain._domains))
def to_global_data(self): @property
def val(self):
return {key: val.val return {key: val.val
for key, val in zip(self._domain.keys(), self._val)} for key, val in zip(self._domain.keys(), self._val)}
def val_rw(self):
return {key: val.val_rw()
for key, val in zip(self._domain.keys(), self._val)}
@staticmethod @staticmethod
def from_global_data(domain, arr): def from_raw(domain, arr):
return MultiField( return MultiField(
domain, tuple(Field(domain[key], arr[key]) domain, tuple(Field(domain[key], arr[key])
for key in domain.keys())) for key in domain.keys()))
......
...@@ -56,7 +56,7 @@ class _DomRemover(LinearOperator): ...@@ -56,7 +56,7 @@ class _DomRemover(LinearOperator):
def apply(self, x, mode): def apply(self, x, mode):
self._check_input(x, mode) self._check_input(x, mode)
self._check_float_dtype(x) self._check_float_dtype(x)
x = x.to_global_data() x = x.val
if isinstance(self._domain, DomainTuple): if isinstance(self._domain, DomainTuple):
res = x.ravel() if mode == self.TIMES else x.reshape( res = x.ravel() if mode == self.TIMES else x.reshape(
self._domain.shape) self._domain.shape)
......
...@@ -74,7 +74,7 @@ class DOFDistributor(LinearOperator): ...@@ -74,7 +74,7 @@ class DOFDistributor(LinearOperator):
wgt = np.bincount(dofdex.val.ravel(), minlength=nbin) wgt = np.bincount(dofdex.val.ravel(), minlength=nbin)
wgt = wgt*partner.scalar_dvol wgt = wgt*partner.scalar_dvol
else: else:
dvol = Field.from_arr(partner, partner.dvol).val dvol = Field.from_raw(partner, partner.dvol).val
wgt = np.bincount(dofdex.val.ravel(), wgt = np.bincount(dofdex.val.ravel(),
minlength=nbin, weights=dvol) minlength=nbin, weights=dvol)
# The explicit conversion to float64 is necessary because bincount # The explicit conversion to float64 is necessary because bincount
...@@ -108,7 +108,7 @@ class DOFDistributor(LinearOperator): ...@@ -108,7 +108,7 @@ class DOFDistributor(LinearOperator):
oarr = np.zeros(self._hshape, dtype=x.dtype) oarr = np.zeros(self._hshape, dtype=x.dtype)
oarr = special_add_at(oarr, 1, self._dofdex, arr) oarr = special_add_at(oarr, 1, self._dofdex, arr)
oarr = oarr.reshape(self._domain.shape) oarr = oarr.reshape(self._domain.shape)
res = Field.from_arr(self._domain, oarr) res = Field.from_raw(self._domain, oarr)
return res return res
def _times(self, x): def _times(self, x):
......
...@@ -310,7 +310,7 @@ def _plot1D(f, ax, **kwargs): ...@@ -310,7 +310,7 @@ def _plot1D(f, ax, **kwargs):
plt.yscale(kwargs.pop("yscale", "log")) plt.yscale(kwargs.pop("yscale", "log"))
xcoord = dom.k_lengths xcoord = dom.k_lengths
for i, fld in enumerate(f): for i, fld in enumerate(f):
ycoord = fld.val.copy() ycoord = fld.val_rw()
ycoord[0] = ycoord[1] ycoord[0] = ycoord[1]
plt.plot(xcoord, ycoord, label=label[i], plt.plot(xcoord, ycoord, label=label[i],
linewidth=linewidth[i], alpha=alpha[i]) linewidth=linewidth[i], alpha=alpha[i])
......
...@@ -144,7 +144,7 @@ def approximation2endo(op, nsamples): ...@@ -144,7 +144,7 @@ def approximation2endo(op, nsamples):
approx = sc.var approx = sc.var
dct = approx.to_dict() dct = approx.to_dict()
for kk in dct: for kk in dct:
foo = dct[kk].to_global_data_rw() foo = dct[kk].val_rw()
foo[foo == 0] = 1 foo[foo == 0] = 1
dct[kk] = makeField(dct[kk].domain, foo) dct[kk] = makeField(dct[kk].domain, foo)
return MultiField.from_dict(dct) return MultiField.from_dict(dct)
...@@ -297,8 +297,8 @@ def makeField(domain, arr): ...@@ -297,8 +297,8 @@ def makeField(domain, arr):
The newly created random field The newly created random field
""" """
if isinstance(domain, (dict, MultiDomain)): if isinstance(domain, (dict, MultiDomain)):
return MultiField.from_global_data(domain, arr) return MultiField.from_raw(domain, arr)
return Field.from_arr(domain, arr) return Field.from_raw(domain, arr)
def makeDomain(domain): def makeDomain(domain):
......
...@@ -131,11 +131,11 @@ def test_rosenbrock(minimizer): ...@@ -131,11 +131,11 @@ def test_rosenbrock(minimizer):
@property @property
def value(self): def value(self):
return rosen(self._position.val.copy()) return rosen(self._position.val_rw())
@property @property
def gradient(self): def gradient(self):
inp = self._position.val.copy() inp = self._position.val_rw()
out = ift.Field(space, rosen_der(inp)) out = ift.Field(space, rosen_der(inp))
return out return out
...@@ -143,13 +143,13 @@ def test_rosenbrock(minimizer): ...@@ -143,13 +143,13 @@ def test_rosenbrock(minimizer):
def metric(self): def metric(self):
class RBCurv(ift.EndomorphicOperator): class RBCurv(ift.EndomorphicOperator):
def __init__(self, loc): def __init__(self, loc):
self._loc = loc.val.copy() self._loc = loc.val_rw()
self._capability = self.TIMES self._capability = self.TIMES
self._domain = space self._domain = space
def apply(self, x, mode): def apply(self, x, mode):
self._check_input(x, mode) self._check_input(x, mode)
inp = x.val.copy() inp = x.val_rw()
out = ift.Field( out = ift.Field(
space, rosen_hess_prod(self._loc.copy(), inp)) space, rosen_hess_prod(self._loc.copy(), inp))
return out return out
...@@ -159,8 +159,8 @@ def test_rosenbrock(minimizer): ...@@ -159,8 +159,8 @@ def test_rosenbrock(minimizer):
return ift.InversionEnabler(RBCurv(self._position), t1) return ift.InversionEnabler(RBCurv(self._position), t1)
def apply_metric(self, x):