Skip to content

Pathfinder failure fitting Mauna Loa GP example #458

Closed
@fonnesbeck

Description

@fonnesbeck

When attempting to fit the Mauna Loa example in pymc-examples:

with pm.Model() as model:
    # yearly periodic component x long term trend
    η_per = pm.HalfCauchy("η_per", beta=2, initval=1.0)
    ℓ_pdecay = pm.Gamma("ℓ_pdecay", alpha=10, beta=0.075)
    period = pm.Normal("period", mu=1, sigma=0.05)
    ℓ_psmooth = pm.Gamma("ℓ_psmooth ", alpha=4, beta=3)
    cov_seasonal = (
        η_per**2 * pm.gp.cov.Periodic(1, period, ℓ_psmooth) * pm.gp.cov.Matern52(1, ℓ_pdecay)
    )
    gp_seasonal = pm.gp.Marginal(cov_func=cov_seasonal)

    # small/medium term irregularities
    η_med = pm.HalfCauchy("η_med", beta=0.5, initval=0.1)
    ℓ_med = pm.Gamma("ℓ_med", alpha=2, beta=0.75)
    α = pm.Gamma("α", alpha=5, beta=2)
    cov_medium = η_med**2 * pm.gp.cov.RatQuad(1, ℓ_med, α)
    gp_medium = pm.gp.Marginal(cov_func=cov_medium)

    # long term trend
    η_trend = pm.HalfCauchy("η_trend", beta=2, initval=2.0)
    ℓ_trend = pm.Gamma("ℓ_trend", alpha=4, beta=0.1)
    cov_trend = η_trend**2 * pm.gp.cov.ExpQuad(1, ℓ_trend)
    gp_trend = pm.gp.Marginal(cov_func=cov_trend)

    # noise model
    η_noise = pm.HalfNormal("η_noise", sigma=0.5, initval=0.05)
    ℓ_noise = pm.Gamma("ℓ_noise", alpha=2, beta=4)
    σ = pm.HalfNormal("σ", sigma=0.25, initval=0.05)
    cov_noise = η_noise**2 * pm.gp.cov.Matern32(1, ℓ_noise) + pm.gp.cov.WhiteNoise(σ)

    # The Gaussian process is a sum of these three components
    gp = gp_seasonal + gp_medium + gp_trend

    # Since the normal noise model and the GP are conjugates, we use `Marginal` with the `.marginal_likelihood` method
    y_ = gp.marginal_likelihood("y", X=t, y=y, noise=cov_noise)

    approx = pmx.fit(method='pathfinder')

It appears to generate rewrite errors:

ERROR (pytensor.graph.rewriting.basic): SequentialGraphRewriter apply <pytensor.tensor.rewriting.elemwise.InplaceElemwiseOptimizer object at 0x7f01855aabd0>
ERROR (pytensor.graph.rewriting.basic): Traceback:
ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/rewriting/basic.py", line 292, in apply
    sub_prof = rewriter.apply(fgraph)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/tensor/rewriting/elemwise.py", line 192, in apply
    and not fgraph.has_destroyers([node.inputs[i]])
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/destroyhandler.py", line 393, in has_destroyers
    droot, _, root_destroyer = self.refresh_droot_impact()
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/destroyhandler.py", line 431, in refresh_droot_impact
    self.droot, self.impact, self.root_destroyer = _build_droot_impact(self)
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/destroyhandler.py", line 200, in _build_droot_impact
    raise InconsistencyError(f"Multiple destroyers of {input_root}")
pytensor.graph.utils.InconsistencyError: Multiple destroyers of Blockwise{SolveTriangular{unit_diagonal=False, lower=False, check_finite=True, b_ndim=2, overwrite_b=True}, (m,m),(m,n)->(m,n)}.0

ERROR (pytensor.graph.rewriting.basic): SequentialGraphRewriter apply <pytensor.scan.rewriting.ScanInplaceOptimizer object at 0x7f01852667e0>
ERROR (pytensor.graph.rewriting.basic): Traceback:
ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/rewriting/basic.py", line 292, in apply
    sub_prof = rewriter.apply(fgraph)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/scan/rewriting.py", line 1035, in apply
    for scan_idx, original_node in enumerate(reversed(fgraph.toposort())):
                                                      ^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/fg.py", line 760, in toposort
    return io_toposort(self.inputs, self.outputs, self.orderings())
                                                  ^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/fg.py", line 784, in orderings
    orderings = feature.orderings(self)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/destroyhandler.py", line 683, in orderings
    droot, impact, __ignore = self.refresh_droot_impact()
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/destroyhandler.py", line 431, in refresh_droot_impact
    self.droot, self.impact, self.root_destroyer = _build_droot_impact(self)
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/home/fonnesbeck/repos/pymc-examples/.pixi/envs/default/lib/python3.12/site-packages/pytensor/graph/destroyhandler.py", line 200, in _build_droot_impact
    raise InconsistencyError(f"Multiple destroyers of {input_root}")
pytensor.graph.utils.InconsistencyError: Multiple destroyers of Blockwise{SolveTriangular{unit_diagonal=False, lower=False, check_finite=True, b_ndim=2, overwrite_b=True}, (m,m),(m,n)->(m,n)}.0

pymc_extras: 0.2.4
pymc : 5.22.0
pytensor : 2.30.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions