EE_DSnP 板


LINE

(刚刚好像看到这个问题昙花一现???) Anyway... 避免有些人不敢问这些很重要的基本问题, 我还是稍微说一下好了... 1. A graph is connected by links of nodes. The links of nodes are best implemented as node pointers (why? (*)). 2. So a simple binary decision diagram can be implemented as: class BddNodeInt { BddNodeInt* _left; BddNodeInt* _right; }; 3. However, we also like to keep some information on the node, such as "level", "reference count", "visited flag", etc. So we use 4 Bytes to store them as: class BddNodeInt { BddNodeInt* _left; BddNodeInt* _right; unsigned _level : 16; unsigned _refCount : 15; unsigned _visited : 1; }; 4. Please note that the definition of reference count is --- Let this node be 'n'. Whoever pointing to this node (e.g. "k->_left = _n", k is some BddNodeInt*), or any variable associated to this node (e.g. _bddMap("a", n), will increase the reference count of 'n'. 5. But how do you maintain the correctness of the reference count? Whenver there is a BddNodeInt* assignment, or whenever there is a _bddMap insertion, you need to increase the count. And when to decrease the count? 6. Yes, it is quite complicated to "manually" maintain the reference count. This is the case as in CUDD, which is a very error prone feature. 7. Overload the operator or member functions to take care of the count? Look again on the assignment, "k->_left = n". Since both sides are "pointers", there is no way we can overload the pointer assignment. 8. That's the motivation of using an object variable to "wrap" the pointer class --- class BddNode { BddNodeInt* _node; }; 9. All the operations on BddNodeInt* need to go through BddNode --- * In the BddNode constructor, we increase the reference count of the BddNode::_node. So if a BddNode variable is declared, the reference count of its associated BddNodeInt* will be incremented by 1. * In the BddNode descructor, we decrease the reference count of the BddNode::_node. So if the program goes out of the scope of a certain BddNode variable, the reference count of its BddNodeInt* will be decremented by 1. * In the BddNode assignment '=' operator, for example, f = g, we first decrease the reference count of "f._node", and then increase the reference count of "g._node". Of course, we will asssign "f._node = g._node" 10. That's all the place we need to worry about the reference count. As all the operations are on BddNodes, the reference counts can be maintained automatically. 11. That's why we change the BddNodeInt as --- class BddNodeInt { BddNode _left; BddNode _right; unsigned _level : 16; unsigned _refCount : 15; unsigned _visited : 1; }; In other words, when there is a link between BddNodeInt, it is wrapped by a BddNode and therefore the reference count will be incremented by 1. 12. Then how about the "complement edge"? Try --- class BddNodeInt { BddNode _left; BddNode _right; unsigned _level : 15; unsigned _refCount : 14; unsigned _visited : 1; unsigned _leftPhase : 1; unsigned _rightPhase : 1; }; How to represent ~F, where the complement flag is on the node itself but not on its children? 13. So we will take the advanatage of the fact that the pointer addresses are multiplier of 4, and we can use the lowest two bits to record the edge information. We use the lowest 1 bit to record the INVERSION. 14. To use the lower bits of a pointer variable, we need to conver it to a size_t variable, such as: v = size_t(n); and then the edge information can be added to it by v = v + 1. 15. Combining the above, we redefine the classes BddNode and BddNodeInt as... class BddNode { size_t _nodeV; // to hold BddNodeInt* and 1-bit edge info }; class BddNodeInt { BddNode _left; BddNode _right; unsigned _level : 16; unsigned _refCount : 15; unsigned _visited : 1; }; 16. We also define functions like "BddNode::operator () const { return _nodeV; }", "bool isNegEdge() const { return (_nodeV & BDD_NEG_EDGE); }"... etc. (*) The reason of using "pointers" for the links of nodes are "to share the nodes pointed by different edges. (Remember the reason for using pointers is to "share"). ---- 不小心还是写了一堆英文, 希望大家看得懂... --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.129.139
1F:推 nagy:所以BddNode里面的_nodeV的type是size_t !? 不是BddNodeInt*? 01/06 15:41
2F:→ nagy:谢谢老师><""写得好详细Q____Q 01/06 15:42
3F:推 kahang:谢老师><""写得好详细Q____Q(不过昙花一现不是我造成的啊) 01/06 16:19
4F:推 timrau:现在最後几篇文章已经乱了 @@ 01/06 16:55
5F:推 ric2k1:D 掉 393 试试看 01/06 17:24
6F:推 ric2k1:好像 OK 了... 01/06 17:25
7F:推 ric2k1:To nagy: yes, please see the reference code. 01/06 17:26
※ 编辑: ric2k1 来自: 59.121.129.139 (01/06 17:28)
8F:推 mikejdi:谢谢老师!! 01/08 16:41







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP