在 OpenMDAO 中是否可以对在标量上定义的组件进行矢量化?

Is vectorization of Components defined on scalars possible in OpenMDAO?

在函数式编程的上下文中,采用 returns 标量的函数可以映射到 lists/vectors 到 return 和 list/vector 的映射值。在常规 Python 中,我会在功能上或以 NumPy 的矢量化方式执行此操作:

import numpy as np # NumPy import

xs = [1,2,3,4,5] # List of inputs
f = lambda x: x**2 # Some function, which could be the equivalent of an ExplicitComponent

list(map(f, xs)) # Functional style
[ f(x) for x in xs ] # List comprehension
f(np.array(xs)) # NumPy vectorized style

是否可以使用 Components 实现此类行为?我的意思是 Component 可以采用标量输入并像普通函数一样执行,但也会自动对向量和可变长度列表执行操作。

我在文档中找不到任何类似的内容。我知道 OpenMDAO 中的大部分行为都使用 NumPy 的向量化来提高效率,但这是否意味着所有可能具有向量输入的组件都必须使用某种 self.options.declare('num_nodes', default=1) 方法编写并传递全局状态 n所有 Component 中 length/dimension n 的 lists/vectors 的节点数?

关于设计注意事项,我了解到输入向量的笛卡尔积的向量化在 NumPy 中没有默认实现,它们更像 zip。但对于单个 NumPy 数组,它确实像默认情况下部分应用的映射函数一样工作,例如:

>>> xs = [1,2,3,4,5]
>>> f = lambda x,y: x**2 + y**2
>>> f(np.array(xs), np.array([2,4,6,8]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
ValueError: operands could not be broadcast together with shapes (5,) (4,) 
>>> f(np.array(xs), np.array([2,4,6,8,10]))
array([  5,  20,  45,  80, 125])
>>> f(np.array(xs), 1)
array([ 2,  5, 10, 17, 26])

另一种方法是使用 NumPy 的 meshgrid(),如下所示:

xs, ys = [1,2,3,4,5], [2,4,6,8]
f = lambda x, y: x**2 + y**2
xys = np.meshgrid(xs, ys)
f(xys[0], xys[1])

那么对于 Component 来说,这样的行为是否更可行(并且更可取!)?

从 OpenMDAO V3.1 开始,在 OpenMDAO 中执行此操作的唯一方法是通过 option/argument 例如 num_nodesvec_size.

其他用户表示有兴趣在组件中允许动态调整大小的 IO。例如,将输入的大小基于它所连接的输出。参见 https://github.com/OpenMDAO/POEMs/pull/51

我们正在努力解决这个问题,但我们现在 table 找不到合适的 table 解决方案。