How to build an analytic discipline?

A simple MDODiscipline can be created using analytic formulas, e.g. \(y_1=2x^2\) and \(y_2=5+3x^2z^3\), thanks to the class AnalyticDiscipline which is a quick alternative to model a simple analytic MDO problem!

Create the dictionary of analytic outputs

First of all, we have to define the output expressions in a dictionary where keys are output names and values are formula with string format:

expressions = {'y_1': '2*x**2',
                    'y_2': '5+3*x**2+z**3'}

Create and instantiate the discipline

Then, we create and instantiate the corresponding AnalyticDiscipline inheriting from MDODiscipline by means of the API function create_discipline() with:

  • discipline_name="AnalyticDiscipline",

  • name="analytic",

  • expressions=expr_dict.

In practice, we write:

from gemseo.api import create_discipline

disc = create_discipline("AnalyticDiscipline", "analytic",
                         expressions=expressions)

Note

GEMSEO takes care of the grammars and MDODiscipline._run() method generation from the expressions argument. In the background, GEMSEO considers that x is a monodimensional float input parameter and y_1 and y_2 are monodimensional float output parameters.

Execute the discipline

Lastly, this discipline can be executed as any other:

from numpy import array
input_data = {"x": array([2.0]), "z": array([3.0])}

out = disc.execute(input_data)
print("y_1 =", out["y_1"])
print("y_2 =", out["y_2"])

which results in:

y_1 = [ 8.]
y_2 = [ 44.]

About the analytic jacobian

The discipline will provide analytic derivatives (Jacobian) automatically using the sympy library, by means of the AnalyticDiscipline._compute_jacobian() method.

This can be checked easily using MDODiscipline.check_jacobian():

disc.check_jacobian(input_data,
                         derr_approx=disc.FINITE_DIFFERENCES,
                         step=1e-5, threshold=1e-3)

which results in:

   INFO - 10:34:33 : Jacobian:  dp y_2/dp x succeeded!
   INFO - 10:34:33 : Jacobian:  dp y_2/dp z succeeded!
   INFO - 10:34:33 : Jacobian:  dp y_1/dp x succeeded!
   INFO - 10:34:33 : Jacobian:  dp y_1/dp z succeeded!
   INFO - 10:34:33 : Linearization of MDODiscipline: AnalyticDiscipline is correct !
True