| 193 | return np.exp(self.logpmf(x)) |
| 194 | |
| 195 | def logpmf(self, x): |
| 196 | x1 = np.atleast_1d(x) |
| 197 | in_domain = self.in_domain(x1) |
| 198 | rval = np.zeros_like(x1, dtype=float) - np.inf |
| 199 | x_in_domain = x1[in_domain] |
| 200 | |
| 201 | ubound = x_in_domain + self.q * 0.5 |
| 202 | lbound = x_in_domain - self.q * 0.5 |
| 203 | # -- reflect intervals right of mu to other side |
| 204 | # for more accurate calculation |
| 205 | flip = lbound > self.mu |
| 206 | tmp = lbound[flip].copy() |
| 207 | lbound[flip] = self.mu - (ubound[flip] - self.mu) |
| 208 | ubound[flip] = self.mu - (tmp - self.mu) |
| 209 | |
| 210 | assert np.all(ubound > lbound) |
| 211 | a = self._norm_logcdf(ubound) |
| 212 | b = self._norm_logcdf(lbound) |
| 213 | rval[in_domain] = a + np.log1p(-np.exp(b - a)) |
| 214 | if isinstance(x, np.ndarray): |
| 215 | return rval |
| 216 | return float(rval) |
| 217 | |
| 218 | def rvs(self, size=()): |
| 219 | x = mtrand.normal(loc=self.mu, scale=self.sigma, size=size) |