在 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
是否可以使用 Component
s 实现此类行为?我的意思是 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_nodes
或 vec_size
.
其他用户表示有兴趣在组件中允许动态调整大小的 IO。例如,将输入的大小基于它所连接的输出。参见 https://github.com/OpenMDAO/POEMs/pull/51。
我们正在努力解决这个问题,但我们现在 table 找不到合适的 table 解决方案。
在函数式编程的上下文中,采用 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
是否可以使用 Component
s 实现此类行为?我的意思是 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_nodes
或 vec_size
.
其他用户表示有兴趣在组件中允许动态调整大小的 IO。例如,将输入的大小基于它所连接的输出。参见 https://github.com/OpenMDAO/POEMs/pull/51。
我们正在努力解决这个问题,但我们现在 table 找不到合适的 table 解决方案。