Необязательная ошибка OpenMDAO при неподключенном вводе

Есть ли способ заставить OpenMDAO вызывать ошибку, если данный вход не подключен? Я знаю, что для многих входов можно указать значения по умолчанию, чтобы вход не нужно было подключать, однако есть ли способ указать OpenMDAO автоматически вызывать ошибку, если определенные ключевые входы не подключены?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не встроено в 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.

Другие вопросы по теме