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燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP