cudd - Cudd_PrintMinterm,访问产品总和中的各个最小项
问题描述
这可能是本论坛常驻 CUDD/BDD 专家@DCTLib 的问题,但如果其他人有见解,当然欢迎!
考虑给定的最小项,例如: 0--0---0--0---0----11 1 。
我需要单独取每个 minterm 并用 P(x_i) 替换“1”(我正在处理变量的概率),用 1-P(x_i) 替换 0,用 1 替换“-”。然后我将其中的因素相乘一个最小项,P(x_i)...(1-P(x_j)) 并将它们加起来以获得顶部事件的概率。(对应于最小项的概率的和积)
我需要一一处理的原因是我正在处理会炸毁内存的大文件。一旦我超过 80-100 个变量,您就处于整个 minterm 文本文件转储大小的 TB OoM 中. 如果可能,我想获取每个 minterm,将其添加到运行总和中,并在添加后将其删除。
希望这很清楚,但如果不是,可能需要一些迭代。谢谢,
解决方案
你有几个选择:
a) 似乎您已经在 BDD 上有一个带有 Cudd_PrintMinterm 输出的文本文件。计算 minterms 值的总和实际上并不是一个 CUDD 问题。只需逐个解析行并即时计算总和:
std::ifstream inFile("minterms.txt");
std::string currentLine;
double sumSoFar = 0;
while (std::getline(inFile,currentLine)) {
// Process the line "currentLine"
};
if (inFile.fail()) throw "Oopsie";
但是您也可以在 python 中执行此操作。您可能需要使用这种方法来处理数值精度。
b) 描述问题的方式,不需要遍历最小项,而是可以为每个 BDD 节点分配 na 概率 p(n),并计算到根 BDD 节点的概率。你这样做的方式是通过将概率 1 分配给 TRUE 叶,将概率 0 分配给 FALSE 叶,并为每个具有 TRUE 后继 t、ELSE 后继 e 和变量 x 的内部节点 (t,e,x) 计算
p(n) = p(t)*p(x) + p(e)*(1-p(x))
然后 p(root) 就是您要搜索的内容。这种方法更优雅,但需要您编写一个(通常是递归的)处理 BDD 结构本身的过程。这里有一个计算令人满意的分配的示例(使用封装 CUDD 自身类型的数据类型):https ://github.com/VerifiableRobotics/slugs/blob/master/src/BFAbstractionLibrary/BFCudd.cpp
推荐阅读
- r - 识别电话号码,然后匹配国家代码,然后在列中分配正确的名称
- java - 关于@Service Spring Boot 中的@Spy 和@InjectMocks 的说明
- aws-appsync - 如何在 AppSync 突变上生成 Slug
- c# - 如何创建多个系列
- php - 如何在 PHP 中正确添加日期和时间(字符串)?
- javascript - 在事件处理程序中访问 React 组件参数
- c++ - [basic.start.main]/2 以“实现不应预定义主要功能”开头。这意味着什么?
- c++ - 将用户定义的数据类型保存到 C++ 中的文件
- python - 与 Pandas 组合 GPS 点
- html - 使用时 Ng-hide 不起作用标签在一起