.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/templating.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_templating.py: Creating Model Templates ========================= .. GENERATED FROM PYTHON SOURCE LINES 5-160 .. rst-class:: sphx-glr-script-out .. code-block:: none creating wrapper with func on <__main__.instancemethod object at 0x7f7256544560> returning self <__main__.instancemethod object at 0x7f7256544560> with <__main__.Class object at 0x7f72565444a0> calling self <__main__.instancemethod object at 0x7f7256544560> with <__main__.Class object at 0x7f72565444a0> 3.0 5.0 SysOutput(w=array([13.]), z=array([4.84])) This is Ipopt version 3.14.11, running with linear solver MUMPS 5.4.1. Number of nonzeros in equality constraint Jacobian...: 0 Number of nonzeros in inequality constraint Jacobian.: 0 Number of nonzeros in Lagrangian Hessian.............: 3 Total number of variables............................: 2 variables with only lower bounds: 0 variables with lower and upper bounds: 0 variables with only upper bounds: 0 Total number of equality constraints.................: 0 Total number of inequality constraints...............: 0 inequality constraints with only lower bounds: 0 inequality constraints with lower and upper bounds: 0 inequality constraints with only upper bounds: 0 iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls 0 5.6300000e+02 0.00e+00 1.00e+02 -1.0 0.00e+00 - 0.00e+00 0.00e+00 0 1 1.0309551e+02 0.00e+00 2.93e+01 -1.0 1.31e+00 - 1.00e+00 1.00e+00f 1 2 1.6353181e+01 0.00e+00 8.40e+00 -1.0 8.54e-01 - 1.00e+00 1.00e+00f 1 3 1.0743000e+00 0.00e+00 2.30e+00 -1.0 5.45e-01 - 1.00e+00 1.00e+00f 1 4 -1.1859781e+00 0.00e+00 5.63e-01 -1.0 3.39e-01 - 1.00e+00 1.00e+00f 1 5 -1.4553424e+00 0.00e+00 1.40e-01 -1.7 2.50e-01 - 1.00e+00 1.00e+00f 1 6 -1.4978741e+00 0.00e+00 4.73e-02 -2.5 1.84e-01 - 1.00e+00 1.00e+00f 1 7 -1.4999974e+00 0.00e+00 1.15e-03 -2.5 2.11e-02 - 1.00e+00 1.00e+00f 1 8 -1.5000000e+00 0.00e+00 2.21e-06 -5.7 1.40e-03 - 1.00e+00 1.00e+00f 1 9 -1.5000000e+00 0.00e+00 7.65e-12 -8.6 2.41e-06 - 1.00e+00 1.00e+00f 1 Number of Iterations....: 9 (scaled) (unscaled) Objective...............: -3.9164490861618806e-01 -1.5000000000000000e+00 Dual infeasibility......: 7.6542195848125813e-12 2.9315661009832183e-11 Constraint violation....: 0.0000000000000000e+00 0.0000000000000000e+00 Variable bound violation: 0.0000000000000000e+00 0.0000000000000000e+00 Complementarity.........: 0.0000000000000000e+00 0.0000000000000000e+00 Overall NLP error.......: 7.6542195848125813e-12 2.9315661009832183e-11 Number of objective function evaluations = 10 Number of objective gradient evaluations = 10 Number of equality constraint evaluations = 0 Number of inequality constraint evaluations = 0 Number of equality constraint Jacobian evaluations = 0 Number of inequality constraint Jacobian evaluations = 0 Number of Lagrangian Hessian evaluations = 9 Total seconds in IPOPT = 0.004 EXIT: Optimal Solution Found. | .. code-block:: Python import functools import numpy as np import condor as co rng = np.random.default_rng(123) class instancemethod: # noqa: N801 def __init__(self, func): print("creating wrapper with func", func, "on", self) self.func = func def __get__(self, obj, cls): print("returning self", self, " with", self.func, obj, cls) if obj is None: return self else: return functools.partial(self, obj) def __call__(self, *args, **kwargs): print("calling self", self, " with", self.func, *args, **kwargs) return self.func(*args, **kwargs) class Class: def __init__(self, x): self.x = x @instancemethod def test(self, y): return self.x + y cls = Class(2.0) print(cls.test(3.0)) class ComponentRaw(co.models.ModelTemplate): """Raw Component base""" input = co.FreeField(co.Direction.input) output = co.AssignedField(co.Direction.output) x = placeholder(default=2.0) y = placeholder(default=1.0) output.z = x**2 + y def hello(self): print("world", self.z, self.x, self.y, self.input, self.output) class ComponentImplementation(co.implementations.ExplicitSystem): pass co.implementations.ComponentRaw = ComponentImplementation class ComponentAT(co.ExplicitSystem, as_template=True): """AT component base""" x = placeholder(default=2.0) y = placeholder(default=1.0) output.z = x**2 + y def hello(self): print("world", self.x, self.y, self.z) class MyComponentR(ComponentRaw): """my component R""" u = input() output.w = z + u def hello2(self): print("world", self.z) class MyComponentA(ComponentAT): """my component A""" u = input() output.w = z + u assert MyComponentR(u=1.23).z == MyComponentA(u=1.23).z # noqa # comp = MyComponentA(u=1., z=5.) class MyComponent1(ComponentRaw): pass comp1 = MyComponent1() class MyComponent2(ComponentAT): u = input() # output.xx = z+u output.x = u + 2.0 # output.x = z+u # this should produce an error because it's overwriting x but didnt comp2 = MyComponent2(u=1.0) class MatSys(co.ExplicitSystem): A = input(shape=(3, 4)) B = input(shape=(4, 2)) output.C = A @ B ms = MatSys(rng.random(size=(3, 4)), rng.random(size=(4, 2))) class SymMatSys(co.ExplicitSystem): A = input(shape=(3, 3), symmetric=True) B = input(shape=(3, 3)) output.C = A @ B + B.T @ A a = rng.random(size=(3, 3)) sms = SymMatSys(a + a.T, rng.random(size=(3, 3))) class Sys(co.ExplicitSystem): x = input() y = input() v = y**2 output.w = x**2 + y**2 output.z = x**2 + y sys = Sys(1.2, 3.4) print(sys, sys.output) class Opt(co.OptimizationProblem): x = variable() y = variable() sys = Sys(x=x, y=y) objective = (sys.w - 1) ** 2 - sys.z Opt.set_initial(x=3.0, y=4.0) opt = Opt() .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.036 seconds) .. _sphx_glr_download_examples_templating.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: templating.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: templating.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: templating.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_