Metamodel Visualization#

When evaluating meta models, it can be useful to determine their fit of the training data, graphically. OpenMDAO has a visualization package to view the training data and meta models generated from it. This page explains how to use view_mm in the command line.

The metamodel viewer allows a user the ability of reducing a high dimensional input space down to three dimensions to enable the user to determine the fit of a meta model to the given training data.

Running the Visualizer#

view_mm

Note

This tool is accessible through the OpenMDAO command line tools which can be found om-command.

Running openmdao view_mm structured_meta_model_example.py will open the metamodel generated from the script in the browser and generate a metamodel viewer like the one below. The user can adjust sliders to make slices in the graph, change X and Y inputs, and change the scatter distance value to fine tune the distance a point can be from the model line.

To recreate the viewer above, copy the first script given below and paste it into a file named structured_meta_model_example.py. Next, run openmdao view_mm structured_meta_model_example.py in the command line.

Structured MetaModel Example Script#

import numpy as np
import openmdao.api as om

num_train = 10

x0_min, x0_max = -5.0, 10.0
x1_min, x1_max = 0.0, 15.0
train_x0 = np.linspace(x0_min, x0_max, num_train)
train_x1 = np.linspace(x1_min, x1_max, num_train)
t_data = np.array([[308.12909601, 253.61567418, 204.6578079, 161.25549718, 123.40874201, 91.1175424,   64.38189835,  43.20180985,  27.5772769,   17.50829952],
                [162.89542418, 123.20470795,  89.06954726,  60.48994214,  37.46589257, 19.99739855,   8.08446009,   1.72707719,   0.92524984,   5.67897804,],
                [ 90.2866907,   63.02637433,  41.32161352,  25.17240826,  14.57875856, 9.54066442,  10.05812583,  16.13114279,  27.75971531,  44.94384339,],
                [ 55.60211264,  38.37989042,  26.71322375,  20.60211264,  20.04655709, 25.04655709,  35.60211264,  51.71322375,  73.37989042, 100.60211264],
                [ 22.81724065,  13.24080685,   9.2199286,   10.75460591,  17.84483877, 30.49062719, 48.69197117,  72.4488707,  101.76132579, 136.62933643],
                [  5.11168719,   0.78873608,   2.02134053,   8.80950054,  21.1532161, 39.05248721,  62.50731389,  91.51769611, 126.0836339,  166.20512723],
                [ 14.3413983,   12.87962416,  16.97340558,  26.62274256,  41.82763509, 62.58808317,  88.90408682, 120.77564601, 158.20276077, 201.18543108],
                [ 20.18431209,  19.1914092,   23.75406186,  33.87227009,  49.54603386, 70.77535319,  97.56022808, 129.90065853, 167.79664453, 211.24818608],
                [  8.48953212,   5.57319475,   8.21241294,  16.40718668,  30.15751598, 49.46340083,  74.32484124, 104.74183721, 140.71438873, 182.2424958 ],
                [ 10.96088904,   3.72881146,   2.05228945,   5.93132298,  15.36591208, 30.35605673,  50.90175693,  77.00301269, 108.65982401, 145.87219088]])

prob = om.Problem()
mm = prob.model.add_subsystem('mm', om.MetaModelStructuredComp(method='slinear'),
                            promotes=['x0', 'x1'])
mm.add_input('x0', 0.0, train_x0)
mm.add_input('x1', 0.0, train_x1)
mm.add_output('f', 0.0, t_data)

prob.setup()
prob.final_setup()

Unstructured MetaModel Example Script#

To view this example metamodel, copy the following script into a file named unstructured_meta_model_example.py and then run openmdao view_mm unstructured_meta_model_example.py in the command line.

from math import pi

# Model
interp = om.MetaModelUnStructuredComp()

# Training Data
x_train1 = np.random.uniform(0, pi, 100)
x_train2 = np.random.uniform(0, pi, 100)
x_train3 = np.random.uniform(0, pi, 100)
y = np.sin(x_train1 * x_train2 * x_train3)

# Inputs
interp.add_input('input_1', 0., training_data=x_train1)
interp.add_input('input_2', 0., training_data=x_train2)
interp.add_input('input_3', 0., training_data=x_train3)

# Outputs
interp.add_output('output_1', 0., training_data=y)

# Surrogate Model
interp.options['default_surrogate'] = om.KrigingSurrogate()

prob = om.Problem()
prob.model.add_subsystem('interp', interp)
prob.setup()
prob.final_setup()

Note

OpenMDAO supports structured and unstructured metamodels. Please refer to the documentation for a more in depth overview of what Unstructured and Structured metamodels are.

Multiple Meta Models in Script#

If your model has multiple metamodels, you can specify which of them you want to visualize. For example, in this code there are two metamodels.

class CosMetaModel(om.MetaModelUnStructuredComp):
    def setup(self):
        # Training Data
        x_train = np.linspace(0, 10, 20)
        y_train = np.linspace(0, 20, 20)

        # Inputs
        self.add_input('x', 0., training_data=x_train)
        self.add_input('y', 0., training_data=y_train)

        # Outputs
        self.add_output('cos_x', 0., training_data=np.cos(x_train + y_train))

        # Surrogate Model
        self.options['default_surrogate'] = om.ResponseSurface()


class SinMetaModel(om.MetaModelUnStructuredComp):
    def setup(self):
        # Training Data
        x_train = np.linspace(0, 10, 20)
        y_train = np.linspace(0, 20, 20)

        # Inputs
        self.add_input('x', 0., training_data=x_train)
        self.add_input('y', 0., training_data=y_train)

        # Outputs
        self.add_output('sin_x', 0., training_data=np.sin(x_train + y_train))

        # Surrogate Model
        self.options['default_surrogate'] = om.ResponseSurface()


# define model with two metamodel components
model = om.Group()
cos_mm = model.add_subsystem('cos_mm', CosMetaModel())
sin_mm = model.add_subsystem('sin_mm', SinMetaModel())

# setup a problem using our dual metamodel model
prob = om.Problem(model)
prob.setup()
prob.final_setup()

To visualize only the first one, you would use the command:

openmdao view_mm -m cos_mm multiple_metamodels.py

Command Line Interface#

The command, openmdao view_mm requires a file path, the name of the meta model which you want to visualize if there is more than one, and optionally a port number:

openmdao view_mm -h
/usr/share/miniconda/envs/test/lib/python3.11/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.
  pid, fd = os.forkpty()
usage: openmdao view_mm [-h] [-m PATHNAME] [-r RESOLUTION] [-p PORT_NUMBER]
                        [--no_browser]
                        file

positional arguments:
  file                  Python file containing the model.

options:
  -h, --help            show this help message and exit
  -m PATHNAME, --metamodel_pathname PATHNAME
                        pathname of the metamodel component.
  -r RESOLUTION, --resolution RESOLUTION
                        Number of points to create contour grid
  -p PORT_NUMBER, --port_number PORT_NUMBER
                        Port number to open viewer
  --no_browser          Bokeh server will start server without browser

Note

When using Bash on Windows you are required to set –no_browser option to start the server and then open an internet browser and copy/paste the path to viewer. Bash on Windows does not allow the terminal to access your browser to open the viewer.