Skip to content

Commit

Permalink
Merge 0955a53 into a855771
Browse files Browse the repository at this point in the history
  • Loading branch information
DKilkenny committed Sep 23, 2019
2 parents a855771 + 0955a53 commit f6426ef
Show file tree
Hide file tree
Showing 16 changed files with 1,316 additions and 5 deletions.
2 changes: 1 addition & 1 deletion openmdao/code_review/test_lint_attributes.py
Expand Up @@ -69,7 +69,7 @@ def test_attributes(self):

# Loop over files
for file_name in os.listdir(dirpath):
if file_name != '__init__.py' and file_name[-3:] == '.py':
if not file_name.startswith('_') and file_name[-3:] == '.py':
if print_info:
print('File: {}'.format(file_name))

Expand Down
2 changes: 1 addition & 1 deletion openmdao/code_review/test_lint_docstrings.py
Expand Up @@ -527,7 +527,7 @@ def test_docstrings(self):

# Loop over files
for file_name in os.listdir(dirpath):
if file_name != '__init__.py' and file_name[-3:] == '.py' and not os.path.isdir(file_name):
if not file_name.startswith("_") and file_name[-3:] == '.py' and not os.path.isdir(file_name):
if print_info:
print(file_name)

Expand Down
2 changes: 1 addition & 1 deletion openmdao/code_review/test_lint_peps.py
Expand Up @@ -27,7 +27,7 @@

file_excludes = [
'test_*',
'__init__.py',
'_*.py',
]

ignores = {
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions openmdao/docs/features/model_visualization/index.rst
Expand Up @@ -15,3 +15,4 @@ a model.
view_connections.rst
n2_basics.rst
n2_details.rst
meta_model_basics.rst
38 changes: 38 additions & 0 deletions openmdao/docs/features/model_visualization/meta_model_basics.rst
@@ -0,0 +1,38 @@
.. _meta_model_basics:

*************************
Metamodel Visualization
*************************

When evaluating surrogate models, it can be helpful to determine training data fit graphically. OpenMDAO
has created a package to visualize the training data and surrogate models generated from it. This page
explains how to use the `meta_model_viewer.py` package from the command line.

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

.. embed-code::
../test_suite/test_examples/meta_model_examples/meta_model_viewer_example.py


From the Command Line
---------------------

.. _om-command-view_meta_model:

Generating a metamodel diagram for a model from the command line is easy. You need a
Python script that contains the metamodel.

Running :code:`openmdao meta_model meta_model_viewer_example.py` will open the metamodel generated from the script in the
browser and generate a metamodel viewer like the one below.

.. image:: images/meta_model_viewer.png
:width: 900

The command, :code:`openmdao meta_model` requires a file path and the name of the surrogate model which you
want to visualize if there is more than one surrogate in your file:

.. embed-shell-cmd::
:cmd: openmdao meta_model -h

@@ -0,0 +1,34 @@
"""Example script for meta model viewer."""
import numpy as np
import openmdao.api as om
from openmdao.visualization.meta_model_viewer.meta_model_visualization import MetaModelVisualization

# Model
interp = om.MetaModelUnStructuredComp()

# Training Data
x_train1 = np.linspace(0, 10, 20)
x_train2 = np.linspace(0, 20, 20)
x_train3 = np.linspace(0, 30, 20)
x_train4 = np.linspace(0, 40, 20)
y_train = np.linspace(10, 20, 20)

# 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)
interp.add_input('input_4', 0., training_data=x_train4)

# Outputs
interp.add_output('output_1', 0., training_data=.5 * np.cos(y_train))
interp.add_output('output_2', 0., training_data=.5 * np.sin(y_train))

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

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

viz = MetaModelVisualization(interp)
@@ -0,0 +1,37 @@
import numpy as np
import openmdao.api as om
from openmdao.visualization.meta_model_viewer.meta_model_visualization import MetaModelVisualization

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()
ivc = om.IndepVarComp()
ivc.add_output('x0', 0.0)
ivc.add_output('x1', 0.0)

prob.model.add_subsystem('p', ivc, promotes=['*'])
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()

MetaModelVisualization(mm)
78 changes: 77 additions & 1 deletion openmdao/utils/om.py
Expand Up @@ -12,6 +12,9 @@
from openmdao.core.problem import Problem
from openmdao.visualization.n2_viewer.n2_viewer import n2
from openmdao.visualization.connection_viewer.viewconns import view_connections
from openmdao.components.meta_model_unstructured_comp import MetaModelUnStructuredComp
from openmdao.components.meta_model_structured_comp import MetaModelStructuredComp
from openmdao.visualization.meta_model_viewer.meta_model_visualization import view_metamodel
from openmdao.devtools.debug import config_summary, tree, dump_dist_idxs
from openmdao.devtools.itrace import _itrace_exec, _itrace_setup_parser
from openmdao.devtools.iprofile_app.iprofile_app import _iprof_exec, _iprof_setup_parser
Expand Down Expand Up @@ -236,6 +239,78 @@ def _viewconns(prob):
return _viewconns


def _meta_model_parser(parser):
"""
Set up the openmdao subparser for the 'openmdao meta_model' command.
Parameters
----------
parser : argparse subparser
The parser we're adding options to.
"""
parser.add_argument('file', nargs=1, help='Python file containing the model.')
parser.add_argument('-m', '--metamodel_pathname', action='store', dest='pathname',
help='pathname of the metamodel component.')
parser.add_argument('-p', '--port_number', default=5007, action='store', dest='port_number',
help='Port number to open viewer')


def _meta_model_cmd(options):
"""
Return the post_setup hook function for 'openmdao meta_model'.
Parameters
----------
options : argparse Namespace
Command line options.
Returns
-------
function
The post-setup hook function.
"""
def _view_metamodel(prob):
Problem._post_setup_func = None

mm_types = (MetaModelStructuredComp, MetaModelUnStructuredComp)

pathname = options.pathname
port_number = options.port_number

if pathname:
comp = prob.model._get_subsystem(pathname)
if comp and isinstance(comp, mm_types):
view_metamodel(comp, port_number)
return
else:
comp = None

metamodels = {mm.pathname: mm for
mm in prob.model.system_iter(include_self=True, typ=mm_types)}

mm_names = list(metamodels.keys())
mm_count = len(mm_names)

if mm_count == 0:
print("No Metamodel components found in model.")

elif mm_count == 1 and not pathname:
comp = metamodels[mm_names[0]]
view_metamodel(comp, port_number)

else:
try_str = "Try one of the following: {}.".format(mm_names)

if not pathname:
raise AttributeError("Metamodel not specified.\n {}".format(try_str))
elif not comp:
raise AttributeError("Metamodel '{}' not found.\n {}".format(pathname, try_str))
else:
raise AttributeError("'{}' is not a Metamodel.\n {}".format(pathname, try_str))

return _view_metamodel


def _config_summary_setup_parser(parser):
"""
Set up the openmdao subparser for the 'openmdao summary' command.
Expand Down Expand Up @@ -504,6 +579,7 @@ def _post_setup_exec(options):
'Print citations referenced by problem'),
'check': (_check_config_setup_parser, _check_config_cmd,
'Perform a number of configuration checks on the problem.'),
'meta_model': (_meta_model_parser, _meta_model_cmd, "Meta Model Viewer.")
}


Expand All @@ -527,7 +603,7 @@ def _post_setup_exec(options):
'Colored jacobian viewer.'),
'xdsm': (_xdsm_setup_parser, _xdsm_cmd, 'XDSM viewer.'),
'scaffold': (_scaffold_setup_parser, _scaffold_exec,
'Generate a simple scaffold for a component.')
'Generate a simple scaffold for a component.'),
}


Expand Down
Empty file.

0 comments on commit f6426ef

Please sign in to comment.