Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions RELEASE-NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

- Add `check_test_point` method to `pm.Model`
- Add `Ordered` Transformation and `OrderedLogistic` distribution
- Add `Chain` transformation
- Better warning message for `Mass matrix contains zeros on the diagonal. Some derivatives might always be zero`

### Fixes
Expand Down
449 changes: 290 additions & 159 deletions docs/source/notebooks/api_quickstart.ipynb

Large diffs are not rendered by default.

44 changes: 43 additions & 1 deletion pymc3/distributions/transforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ def jacobian_det(self, x):


class CholeskyCovPacked(Transform):
name = "cholesky_cov_packed"
name = "cholesky-cov-packed"

def __init__(self, n):
self.diag_idxs = np.arange(1, n + 1).cumsum() - 1
Expand All @@ -398,3 +398,45 @@ def forward_val(self, y, point=None):

def jacobian_det(self, y):
return tt.sum(y[self.diag_idxs])


class Chain(Transform):
def __init__(self, transform_list):
self.transform_list = transform_list
self.name = '+'.join([transf.name for transf in self.transform_list])

def forward(self, x):
y = x
for transf in self.transform_list:
y = transf.forward(y)
return y

def forward_val(self, x, point=None):
y = x
for transf in self.transform_list:
y = transf.forward_val(y)
return y

def backward(self, y):
x = y
for transf in reversed(self.transform_list):
x = transf.backward(x)
return x

def jacobian_det(self, y):
y = tt.as_tensor_variable(y)
det_list = []
ndim0 = y.ndim
for transf in reversed(self.transform_list):
det_ = transf.jacobian_det(y)
det_list.append(det_)
y = transf.backward(y)
ndim0 = min(ndim0, det_.ndim)
# match the shape of the smallest jacobian_det
det = 0.
for det_ in det_list:
if det_.ndim > ndim0:
det += det_.sum(axis=-1)
else:
det += det_
return det
8 changes: 8 additions & 0 deletions pymc3/tests/test_distributions.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,14 @@ def SortedVector(n):
return Domain(vals, edges=(None, None))


def UnitSortedVector(n):
vals = []
np.random.seed(42)
for _ in range(10):
vals.append(np.sort(np.random.rand(n)))
return Domain(vals, edges=(None, None))


def RealMatrix(n, m):
vals = []
np.random.seed(42)
Expand Down
Loading