def test_extract_obs_data(): with pytest.raises(TypeError): extract_obs_data(at.matrix()) data = np.random.normal(size=(2, 3)) data_at = at.as_tensor(data) mask = np.random.binomial(1, 0.5, size=(2, 3)).astype(bool) for val_at in (data_at, aesara.shared(data)): res = extract_obs_data(val_at) assert isinstance(res, np.ndarray) assert np.array_equal(res, data) # AdvancedIncSubtensor check data_m = np.ma.MaskedArray(data, mask) missing_values = data_at.type()[mask] constant = at.as_tensor(data_m.filled()) z_at = at.set_subtensor(constant[mask.nonzero()], missing_values) assert isinstance(z_at.owner.op, (AdvancedIncSubtensor, AdvancedIncSubtensor1)) res = extract_obs_data(z_at) assert isinstance(res, np.ndarray) assert np.ma.allequal(res, data_m) # AdvancedIncSubtensor1 check data = np.random.normal(size=(3, )) data_at = at.as_tensor(data) mask = np.random.binomial(1, 0.5, size=(3, )).astype(bool) data_m = np.ma.MaskedArray(data, mask) missing_values = data_at.type()[mask] constant = at.as_tensor(data_m.filled()) z_at = at.set_subtensor(constant[mask.nonzero()], missing_values) assert isinstance(z_at.owner.op, (AdvancedIncSubtensor, AdvancedIncSubtensor1)) res = extract_obs_data(z_at) assert isinstance(res, np.ndarray) assert np.ma.allequal(res, data_m)
def find_observations(self) -> Optional[Dict[str, Var]]: """If there are observations available, return them as a dictionary.""" if self.model is None: return None observations = {} for obs in self.model.observed_RVs: aux_obs = getattr(obs.tag, "observations", None) if aux_obs is not None: try: obs_data = extract_obs_data(aux_obs) observations[obs.name] = obs_data except TypeError: warnings.warn(f"Could not extract data from symbolic observation {obs}") else: warnings.warn(f"No data for observation {obs}") return observations
def log_likelihood_vals_point(self, point, var, log_like_fun): """Compute log likelihood for each observed point.""" # TODO: This is a cheap hack; we should filter-out the correct # variables some other way point = {i.name: point[i.name] for i in log_like_fun.f.maker.inputs if i.name in point} log_like_val = np.atleast_1d(log_like_fun(point)) if isinstance(var.owner.op, (AdvancedIncSubtensor, AdvancedIncSubtensor1)): try: obs_data = extract_obs_data(var.tag.observations) except TypeError: warnings.warn(f"Could not extract data from symbolic observation {var}") mask = obs_data.mask if np.ndim(mask) > np.ndim(log_like_val): mask = np.any(mask, axis=-1) log_like_val = np.where(mask, np.nan, log_like_val) return log_like_val