Есть ли способ заставить OpenMDAO вызывать ошибку, если данный вход не подключен? Я знаю, что для многих входов можно указать значения по умолчанию, чтобы вход не нужно было подключать, однако есть ли способ указать OpenMDAO автоматически вызывать ошибку, если определенные ключевые входы не подключены?
Это не встроено в OpenMDAO, начиная с V3.17. Тем не менее, это возможно сделать. Единственное предостережение в том, что мне пришлось использовать некоторые непубличные API, чтобы заставить его работать (обратите внимание на использование p.model._conn_global_abs_in2out
). Таким образом, эти API могут быть изменены позже.
Этот код должен дать вам желаемое поведение. Вы можете расширить возможности с помощью пометка переменной, если вам нужно решение, которое не требует от вас предоставления списка имен переменных функции проверки. Вместо этого используйте метод list_inputs
может принимать теги для фильтрации, если хотите.
import openmdao.api as om
def validate_connections(prob, force_connected):
# make sure its a set and not a generic iterator (i.e. array)
force_connected_set = set(force_connected)
model_inputs = prob.model.list_inputs(out_stream=None, prom_name=True)
#gets the promoted names from the list of inputs
input_set = set([inp[1]['prom_name'] for inp in model_inputs])
# filter the inputs into connected and unconnected sets
connect_dict = p.model._conn_global_abs_in2out
unconnected_inputs = set()
connected_inputs = set()
for abs_name, in_data in model_inputs:
if abs_name in connect_dict and (not 'auto_ivc' in connect_dict[abs_name]):
connected_inputs.add(in_data['prom_name'])
else:
unconnected_inputs.add(in_data['prom_name'])
# now we need to check if there are any unconnected inputs
# in the model that aren't in the spec
illegal_unconnected = force_connected_set.intersection(unconnected_inputs)
if len(illegal_unconnected) > 0:
raise ValueError(f'unconnected inputs {illegal_unconnected} are are not allowed')
p = om.Problem()
###############################################################################################
# comment and uncomment these three lines to change the error you get from the validate method
###############################################################################################
# p.model.add_subsystem('c0', om.ExecComp('x=3*a'), promotes_outputs=['x'])
# p.model.add_subsystem('c1', om.ExecComp('b=a+17'))
# p.model.connect('c1.b', 'c2.b')
p.model.add_subsystem('c2', om.ExecComp('y=2*x+b'), promotes_inputs=['x'])
p.model.add_subsystem('c3', om.ExecComp('z=x**2+y'))
p.setup()
p.final_setup()
Если вы считаете, что эту функцию следует добавить в OpenMDAO, не стесняйтесь отправлять POEM, предлагающий, как может выглядеть формальная функция и ее API.