Source code for openmdao.test_suite.components.paraboloid_invalid_region
import openmdao.api as om
[docs]class Paraboloid(om.ExplicitComponent):
"""
Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
This version of Paraboloid optionally raises an analysis error when the
design variables x and y are in an invalid region defined by the specified
"invalid_x" and "invalid_y" ranges.
The path of evaluated points to the optmized solution is recorded as
well as the number of analysis errors raised.
Parameters
----------
invalid_x : tuple of float or None
The range of values for x which will trigger an AnalysisError
invalid_y : tuple of float or None
The range of values for y which will trigger an AnalysisError
func : str, 'compute' or 'compute_partials'
The function that will raise the AnalysisError (compute or compute_partials).
Attributes
----------
invalid_x : tuple of float or None
The range of values for x which will trigger an AnalysisError
invalid_y : tuple of float or None
The range of values for y which will trigger an AnalysisError
func : str, 'compute' or 'compute_partials'
The function that will raise the AnalysisError (compute or compute_partials).
"""
[docs] def __init__(self, invalid_x=None, invalid_y=None, func='compute'):
super().__init__()
self.invalid_x = invalid_x
self.invalid_y = invalid_y
self.func = func
self.eval_count = -1
self.eval_history = []
self.raised_eval_errors = []
self.grad_count = -1
self.grad_history = []
self.raised_grad_errors = []
[docs] def setup(self):
self.add_input('x', val=0.0)
self.add_input('y', val=0.0)
self.add_output('f_xy', val=0.0)
self.declare_partials('*', '*')
[docs] def compute(self, inputs, outputs):
"""
f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
"""
self.eval_count += 1
x = inputs['x']
y = inputs['y']
f_xy = outputs['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
self.eval_history.append((x.item(), y.item(), f_xy.item()))
if self.invalid_x and self.func == 'compute':
beg, end = self.invalid_x
if x >= beg and x <= end:
self.raised_eval_errors.append(self.eval_count)
raise om.AnalysisError(f'Invalid x: {beg} < {x.item():8.4f} < {end}).')
if self.invalid_y and self.func == 'compute':
beg, end = self.invalid_y
if y >= beg and y <= end:
self.raised_eval_errors.append(self.eval_count)
raise om.AnalysisError(f'Invalid y: {beg} < {y.item():8.4f} < {end}).')
[docs] def compute_partials(self, inputs, partials):
"""
Partial derivatives.
"""
self.grad_count += 1
x = inputs['x']
y = inputs['y']
partials['f_xy', 'x'] = 2.0*x - 6.0 + y
partials['f_xy', 'y'] = 2.0*y + 8.0 + x
self.grad_history.append((x.item(), y.item()))
if self.invalid_x and self.func == 'compute_partials':
beg, end = self.invalid_x
if x > beg and x < end:
self.raised_grad_errors.append(self.grad_count)
raise om.AnalysisError(f'Invalid x: {beg} < {x.item():8.4f} < {end}).')
if self.invalid_y and self.func == 'compute_partials':
beg, end = self.invalid_y
if y > beg and y < end:
self.raised_grad_errors.append(self.grad_count)
raise om.AnalysisError(f'Invalid y: {beg} < {y.item():8.4f} < {end}).')