simetenn / uncertainpy

Uncertainpy: a Python toolbox for uncertainty quantification and sensitivity analysis, tailored towards computational neuroscience.
http://uncertainpy.readthedocs.io
GNU General Public License v3.0
220 stars 50 forks source link

Parameters class using 'distribution=' parameter results in an error #58

Open goghino opened 3 years ago

goghino commented 3 years ago

Hi, I am trying to run the coffee cup example with dependant variables. I am passing the dependant distribution to the Uncertainpy as Parameters(distribution=joint_mvNorm), which later fails with an error. I am using the following code:

#!/usr/bin/env python
# coding: utf-8

import uncertainpy as un
import chaospy as cp
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def coffee_cup_dependent(T_env, alpha):
    # Initial temperature and time
    time = np.linspace(0, 200, 150)            # Minutes
    T_0 = 95                                   # Celsius

    # The equation describing the model
    def f(T, time, alpha, T_env):
        return -alpha*(T - T_env)

    # Solving the equation by integration.
    temperature = odeint(f, T_0, time, args=(alpha, T_env))[:, 0]

    # Return time and model results
    return time, temperature

model = un.Model(run=coffee_cup_dependent, labels=["Time (min)", "Temperature (C)"])

#alpha, T_env
mean_param = [0.2, 20]
cov_param = [[0.0005, 0.01], [0.01, 1.5]]
joint_mvNorm = cp.MvNormal(mean_param, cov_param)

parameters = un.Parameters(distribution=joint_mvNorm)

# Set up the uncertainty quantification
UQ = un.UncertaintyQuantification(model=model, parameters=parameters)

# Perform the uncertainty quantification using polynomial chaos with point collocation (by default)
data = UQ.quantify(method="pc",
                 pc_method="collocation",
                 rosenblatt=True,
                 uncertain_parameters=None,
                 polynomial_order=4,
                 nr_collocation_nodes=None,
                 quadrature_order=None,
                 nr_pc_mc_samples=10**4,
                 nr_mc_samples=10**4,
                 allow_incomplete=False,
                 seed=None,
                 single=False,
                 plot="condensed_first",
                 figure_folder="figures",
                 figureformat=".png",
                 save=True,
                 data_folder="data",
                 filename=None,)

Running the script above produces an error:

Traceback (most recent call last):
  File "coffee_cup_dep_ucpy.py", line 92, in <module>
    data = UQ.quantify(method="pc",
  File "/Users/Juraj/anaconda3/envs/uncertainpy/lib/python3.9/site-packages/uncertainpy/uncertainty.py", line 415, in quantify
    data = self.polynomial_chaos(uncertain_parameters=uncertain_parameters,
  File "/Users/Juraj/anaconda3/envs/uncertainpy/lib/python3.9/site-packages/uncertainpy/uncertainty.py", line 702, in polynomial_chaos
    self.data = self.uncertainty_calculations.polynomial_chaos(
  File "/Users/Juraj/anaconda3/envs/uncertainpy/lib/python3.9/site-packages/uncertainpy/core/uncertainty_calculations.py", line 1345, in polynomial_chaos
    self.create_PCE_collocation_rosenblatt(uncertain_parameters=uncertain_parameters,
  File "/Users/Juraj/anaconda3/envs/uncertainpy/lib/python3.9/site-packages/uncertainpy/core/uncertainty_calculations.py", line 925, in create_PCE_collocation_rosenblatt
    dist_R = cp.J(*dist_R)
  File "/Users/Juraj/anaconda3/envs/uncertainpy/lib/python3.9/site-packages/chaospy/distributions/operators/joint.py", line 54, in __init__
    super(J, self).__init__(
  File "/Users/Juraj/anaconda3/envs/uncertainpy/lib/python3.9/site-packages/chaospy/distributions/baseclass/distribution.py", line 73, in __init__
    assert min(rotation) == 0
ValueError: min() arg is an empty sequence

My environment:

conda create --name uncertainpy
conda activate uncertainpy
conda install pip
pip install uncertainpy
conda list -n uncertainpy
# packages in environment:
#
# Name                    Version                   Build  Channel
chaospy                   4.3.3                    pypi_0    pypi
numpoly                   1.2.3                    pypi_0    pypi
uncertainpy               1.2.3                    pypi_0    pypi
...