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:
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
Hi @Eilidh_Radcliff
Thanks for reporting this. Can you please provide a minimal reproducible example?
Best regards
Styfen
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:
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)
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
?
the code for simply_supported_beam_9points:
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.
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:
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.
1 Like
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?