# UQ\[py\]Lab (PCE display)

**URL:** <https://uqworld.org/t/uq-py-lab-pce-display/2054>\
**Category:** UQ Discussion Forum\
**Tags:** pce, python, metamodeling\
**Created:** [January 11, 2024, 1:19pm UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054 "2024-01-11T13:19:15Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Eilidh\_Radcliff](https://uqworld.org/user_avatar/uqworld.org/eilidh_radcliff/32/1221_2.png) [@Eilidh\_Radcliff](https://uqworld.org/u/Eilidh_Radcliff)\
**Post date:** [January 11, 2024, 1:19pm UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/1 "2024-01-11T13:19:15Z")

</div>

Hello,

I’m currently working with UQ[py]Lab and have come across an issue. When I try to use `uq.display(myPCE)` to generate a visual representation of the coefficient distribution in myPCEmetamodel, it doesn’t seem to work. However, other functions like `uq.print(myPCE)` are functioning correctly after creating the metamodel.

The error that I see is:

```matlab
Traceback (most recent call last):

line 72, in <module>
    uq.display(myPCE)
 
line 394, in display
    fig = self.make_fig(obj, name, type, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 line 403, in make_fig
    return helpers.display(obj, self, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 line 119, in display
    return display_util.PCE(obj)
           ^^^^^^^^^^^^^^^^^^^^^

 line 358, in PCE
    Coefficients = np.array(Model['PCE']['Coefficients'])
                            ~~~~~~~~~~~~ ^^^^^^^^^^^^^^^^
TypeError: list indices must be integers or slices, not str

```

Could you provide any suggestions on how to resolve this?

Best regards, Eilidh

---

<div class="post-metadata">

**Author:** ![styfen.schaer](https://uqworld.org/user_avatar/uqworld.org/styfen.schaer/32/849_2.png) [@styfen.schaer](https://uqworld.org/u/styfen.schaer)\
**Post date:** [January 11, 2024, 3:48pm UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/2 "2024-01-11T15:48:49Z")

</div>

Hi @Eilidh_Radcliff

Thanks for reporting this. Can you please provide a minimal reproducible example?

Best regards  
Styfen

---

<div class="post-metadata">

**Author:** ![Eilidh\_Radcliff](https://uqworld.org/user_avatar/uqworld.org/eilidh_radcliff/32/1221_2.png) [@Eilidh\_Radcliff](https://uqworld.org/u/Eilidh_Radcliff)\
**Post date:** [January 12, 2024, 1:20pm UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/3 "2024-01-12T13:20:42Z")

</div>

Hi Styfen,

Thank you for the fast response!

I discovered this while experimenting with one of the examples from the documentation of UQLab. I will paste below:

```matlab
from uqpylab import sessions, display_util
import numpy as np
import matplotlib.pyplot as plt
import scipy.io

mySession = sessions.cloud()

ModelOpts = {
    'Type': 'Model',
    'ModelFun': 'simply_supported_beam_9points.model',
    'isVectorized': 'true'
}

myModel = uq.createModel(ModelOpts)

InputOpts = {
    'Marginals': [
        {
        'Name': 'b', # beam width
        'Type': 'Lognormal',
        'Moments': [0.15, 0.0075] # (m)
        },
        {
        'Name': 'h', # beam height
        'Type': 'Lognormal',
        'Moments': [0.3, 0.015] # (m)
        },
        {
        'Name': 'L', # beam length
        'Type': 'Lognormal',
        'Moments': [5, 0.05] # (m)
        },
        {
        'Name': 'E', # Young's modulus
        'Type': 'Lognormal',
        'Moments': [3e10, 4.5e9] # (Pa)
        },
        {
        'Name': 'p', # uniform load
        'Type': 'Lognormal',
        'Moments': [1e4, 1e3] # (N/m)
        }]
}

myInput = uq.createInput(InputOpts)

MetaOpts = {
    'Type': 'Metamodel',
    'MetaType': 'PCE'
}

MetaOpts['TruncOptions'] = {'qNorm': 0.75}
MetaOpts['Degree'] = np.arange(2,11).tolist()

MetaOpts['ExpDesign'] = {
    "NSamples" : 10,
    "Sampling" : "LHS"

}

myPCE = uq.createModel(MetaOpts)

uq.print(myPCE)

uq.display(myPCE)

```

---

<div class="post-metadata">

**Author:** ![styfen.schaer](https://uqworld.org/user_avatar/uqworld.org/styfen.schaer/32/849_2.png) [@styfen.schaer](https://uqworld.org/u/styfen.schaer)\
**Post date:** [January 12, 2024, 2:52pm UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/4 "2024-01-12T14:52:41Z")

</div>

Can you also provide the code for `simply_supported_beam_9points.model`?

I tried it with a dummy function, but could not reproduce the error. Can you also tell me which Python version you are using and if you have installed UQ[py]Lab in a fresh Python environment? Can you also list the output of `pip list`?

---

<div class="post-metadata">

**Author:** ![Eilidh\_Radcliff](https://uqworld.org/user_avatar/uqworld.org/eilidh_radcliff/32/1221_2.png) [@Eilidh\_Radcliff](https://uqworld.org/u/Eilidh_Radcliff)\
**Post date:** [January 14, 2024, 10:29am UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/5 "2024-01-14T10:29:46Z")

</div>

the code for simply\_supported\_beam\_9points:

```matlab
import numpy as np

def model(X):
    """calculates the deflection of a Simply Supported Beam on 9 equally-spaced 
    points along the beam length. X refers to a sample of the input random variables: [b h L E p]. 
    The points for which the deflection is calculated are xi = (1:9)/10*L.
    The vector Y contains the displacement at each of the 9 points.

    Parameters
    ----------
    X: ndarray
        5-column matrix
        x[:,0]: beam width (m)
        x[:,1]: beam height (m)
        x[:,2]: length (m)
        x[:,3]: Young modulus (Pa)
        x[:,4]: uniform load (N)
        
    
    Returns
    -------
    ndarray
        Y[:,0]: deflection at xi=1/10*L
        ...
        Y[:,8]: deflection at xi=9/10*L
    """
    X = np.array(X,ndmin=2)
    b = X[:, 0]; # beam width (m)
    
    h = X[:, 1]; # beam height (m)
    L = X[:, 2]; # Length (m)
    E = X[:, 3]; # Young modulus (Pa)
    p = X[:, 4]; # uniform load (N)
    
    # The beam is considered primatic, therefore:
    I = b* np.power(h,3) / 12; # the moment of intertia

    print('CALCULATING MODEL' )
    Y = np.empty((X.shape[0],9))
    for j in np.arange(0,9):
        xi = (j+1)/10*L
        Y[:,j] = -p*xi*(np.power(L,3)-2*np.power(xi,2)*L + xi**3)/(24*E*I);
    
    print('X type', type(X))   
    print('X shape', X.shape)   
    print('b type', type(b))
    print(type(h))
    print(type(L))
    print(type(E))
    print(type(p))
    print(type(I))
    print('Y type',type(Y))
    print('Y shape', Y.shape)   
    return Y

```

My pip list is:

Package Version

* * *

appdirs 1.4.4  
asttokens 2.4.1  
certifi 2023.11.17  
charset-normalizer 3.3.2  
colorama 0.4.6  
comm 0.2.0  
contourpy 1.2.0  
cycler 0.12.1  
decorator 5.1.1  
executing 2.0.1  
fonttools 4.47.0  
idna 3.6  
ipython 8.19.0  
ipywidgets 8.1.1  
jedi 0.19.1  
jupyterlab-widgets 3.0.9  
kiwisolver 1.4.5  
matplotlib 3.8.2  
matplotlib-inline 0.1.6  
numpy 1.26.2  
packaging 23.2  
pandas 1.5.3  
parso 0.8.3  
Pillow 10.1.0  
pip 22.3.1  
plotly 5.18.0  
prompt-toolkit 3.0.43  
pure-eval 0.2.2  
Pygments 2.17.2  
pyparsing 3.1.1  
python-dateutil 2.8.2  
pytz 2023.3.post1  
requests 2.31.0  
scipy 1.11.4  
setuptools 65.5.0  
six 1.16.0  
stack-data 0.6.3  
tenacity 8.2.3  
traitlets 5.14.0  
uqpylab 0.95  
urllib3 2.1.0  
wcwidth 0.2.12  
widgetsnbextension 4.0.9

I am using Python version: Python 3.11.3

I am working in a fresh venv.

---

<div class="post-metadata">

**Author:** ![styfen.schaer](https://uqworld.org/user_avatar/uqworld.org/styfen.schaer/32/849_2.png) [@styfen.schaer](https://uqworld.org/u/styfen.schaer)\
**Post date:** [January 15, 2024, 7:51am UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/6 "2024-01-15T07:51:51Z")

</div>

Thank you for providing the code. I can now reproduce the error. It seems that `uq.display` is not yet implemented for multi-output PCE. Unfortunately, the error message is not really informative here.

UQLab calculates a separate PCE for each output. So if `uq.display` is important for you, you can fix it for now using:

```python
def display_ith(pce: dict, index: int) -> None:
    pce_ith = pce.copy()
    pce_ith["PCE"] = pce_ith["PCE"][index]
    uq.display(pce_ith)

for i in range(len(myPCE["PCE"])):
    display_ith(myPCE, i)

```

Also note that `uq.print` only prints the first output. However, you should see this in the form of a warning message.

Let us know if you have any further problems.

---

<div class="post-metadata">

**Author:** ![Eilidh\_Radcliff](https://uqworld.org/user_avatar/uqworld.org/eilidh_radcliff/32/1221_2.png) [@Eilidh\_Radcliff](https://uqworld.org/u/Eilidh_Radcliff)\
**Post date:** [January 15, 2024, 10:41am UTC](https://uqworld.org/t/uq-py-lab-pce-display/2054/7 "2024-01-15T10:41:19Z")

</div>

Thank you - this resolves my error for this example too! 😄

When using the function uq.print, why is it only possible to print the first output?
