求和-积算法¶
- partial_unroll(factors, eliminate=frozenset({}), plate_to_step={})[source]¶
对带板(plated)的因子图执行部分展开(unrolling),转换为标准因子图。仅支持 history={0, 1} 的板(plates)。
对于板(history=0),展开操作会将
_{i}
后缀附加到板中索引i
的变量名上 (例如,对于 i=0,"x"->”x_0”)。对于马尔可夫维度(history=1),展开操作会将后缀var_prev
重命名为var_{i}
,并将var_curr
重命名为var_{i+1}
,对应于索引i
(例如,对于 i=0,"x_prev"->”x_0”,"x_curr"->”x_1”)。假设马尔可夫变量的名称遵循var_suffix
格式,特别是对于初始因子使用var_0
(例如,对于 history=1,("x_0", "x_prev", "x_curr")
)。
- partial_sum_product(sum_op, prod_op, factors, eliminate=frozenset({}), plates=frozenset({}), pedantic=False, pow_op=None, plate_to_scale=None)[source]¶
对因子集合执行部分求和-积收缩(contraction)。
- 返回值
部分收缩的 Funsors 列表。
- 返回类型
- dynamic_partial_sum_product(sum_op, prod_op, factors, eliminate=frozenset({}), plate_to_step={})[source]¶
是张量变量消除算法
funsor.sum_product.partial_sum_product()
的推广,它除了处理板(plate)维度外,还能处理高阶马尔可夫维度。转移因子中的马尔可夫维度可以使用funsor.sum_product.sarkka_bilmes_product()
中的并行扫描算法高效地消除。然后将结果因子与初始因子结合,并消除最终状态。因此,当马尔可夫维度被消除时,factors
必须包含初始因子和转移因子。- 参数
- 返回值
部分收缩的 Funsors 列表。
- 返回类型
- modified_partial_sum_product(sum_op, prod_op, factors, eliminate=frozenset({}), plate_to_step={})[source]¶
是张量变量消除算法
funsor.sum_product.partial_sum_product()
的推广,它除了处理板(plate)维度外,还能处理马尔可夫维度。转移因子中的马尔可夫维度可以使用funsor.sum_product.sequential_sum_product()
中的并行扫描算法高效地消除。然后将结果因子与初始因子结合,并消除最终状态。因此,当马尔可夫维度被消除时,factors
必须包含成对的初始因子和转移因子。- 参数
- 返回值
部分收缩的 Funsors 列表。
- 返回类型
- sum_product(sum_op, prod_op, factors, eliminate=frozenset({}), plates=frozenset({}), pedantic=False, pow_op=None, plate_to_scale=None)[source]¶
对因子集合执行求和-积收缩。
- 返回值
单个收缩后的 Funsor。
- 返回类型
- sequential_sum_product(sum_op, prod_op, trans, time, step)[source]¶
对于具有维度
time
、prev
和curr
的 funsortrans
,计算一个等价于以下形式的递归:tail_time = 1 + arange("time", trans.inputs["time"].size - 1) tail = sequential_sum_product(sum_op, prod_op, trans(time=tail_time), time, {"prev": "curr"}) return prod_op(trans(time=0)(curr="drop"), tail(prev="drop")) .reduce(sum_op, "drop")
但通过并行方式高效计算,时间复杂度为 O(log(time))。
- mixed_sequential_sum_product(sum_op, prod_op, trans, time, step, num_segments=None)[source]¶
对于具有维度
time
、prev
和curr
的 funsortrans
,计算一个等价于以下形式的递归:tail_time = 1 + arange("time", trans.inputs["time"].size - 1) tail = sequential_sum_product(sum_op, prod_op, trans(time=tail_time), time, {"prev": "curr"}) return prod_op(trans(time=0)(curr="drop"), tail(prev="drop")) .reduce(sum_op, "drop")
通过混合并行和串行扫描算法,处理
num_segments
个段。
- sarkka_bilmes_product(sum_op, prod_op, trans, time_var, global_vars=frozenset({}), num_periods=1)[source]¶
- class MarkovProductMeta(name, bases, dct)[source]¶
基类:
FunsorMeta
将
step
转换为元组并填充默认step_names
的包装器。
- class MarkovProduct(sum_op, prod_op, trans, time, step, step_names=None)[source]¶
基类:
Funsor
是
sequential_sum_product()
的惰性表示。- 参数