DC888 : worklist slovers
worklist slovers
- solving constraints in prolog
- Static and Dynamic Solutions
- Iterative worklist solvers
- Chaotic iterations 混沌迭代
- Worklist是數(shù)據(jù)流分析的重點(diǎn),worklist類(lèi)似于stack/queue
solving constraints in prolog
其中remember的提示就是對(duì)3、5、6的output需要注意處理變量v的definition。
對(duì)每個(gè)bb塊的IN和OUT都加以constraint。
用prolog的形式重新定義reaching definition。需要處理的元素有X1_IN, X2_IN, X3_IN, X4_IN, X5_IN, X6_IN, X1_OUT, X2_OUT, X3_OUT, X4_OUT, X5_OUT, X6_OUT]
下面的等式則是之前constraint的等價(jià)表示。
Conservative Solutions:A system of equations gives us a solution that is conservative.
通過(guò)左邊的constraint得到右邊input和output的值,值可能不是精確的,但是不會(huì)存在錯(cuò)誤值的。
其中a的值可能就是完全不需要,但不影響結(jié)果正確性,所以對(duì)于prolog是滿足條件正確性即可。
這里的solution就是每次進(jìn)行迭代的結(jié)果,其中point 6的output是錯(cuò)誤的,稱(chēng)此時(shí)x6_out就是false negative,
Static and Dynamic Solutions
Static Analyses can, sometimes, provide solutions that will never happen in an actual run of the program.
靜態(tài)分析有時(shí)可以提供在程序的實(shí)際運(yùn)行中永遠(yuǎn)不會(huì)出現(xiàn)的解決方案。
這里就是說(shuō)靜態(tài)分析是會(huì)包含不可能發(fā)生的情況,但不是wrong的結(jié)果,稱(chēng)為false positive,如果是分析錯(cuò)誤得到wrong的結(jié)果,則是false negative。
Finding solutions with prolog
Infinity queries
Iterative worklist solvers
Chaotic iterations 混沌迭代
(1) 將左邊的所有constraints放入bag中
(2) 隨機(jī)抽取一個(gè)constraint進(jìn)行解析,檢查是否對(duì)x1、x2、x3、x4、x5、x6的input和output改變情況
(3) 如果x1、x2、x3、x4、x5、x6的input和output的值發(fā)生不改變時(shí),當(dāng)bag中有constraint時(shí),繼續(xù)取constraint。如果bag沒(méi)有constraint,則處理結(jié)束。
(4) 如果(3)中input和output的值改變,則繼續(xù)從bag取constraints,繼續(xù)修改。x1、x2、x3、x4、x5、x6的input和output的值。
用reaching definition舉例,IN[xi]表示當(dāng)前xi的input set,IN’[xi]表示經(jīng)過(guò)constraint之后的input set。其中兩個(gè)并運(yùn)算就是reaching definition的equation。
運(yùn)算結(jié)束的terminate是每個(gè)point 的input和output的set值都不變。
混沌迭代中_|_(bottom)表示未賦值。F1到Fn表示傳遞函數(shù)。
混沌迭代算法復(fù)雜度高,需要一下幾點(diǎn)的優(yōu)化
第一步中需要找到suitable order to process ,需要一定順序。第二步循環(huán)N次無(wú)法改變
對(duì)variable對(duì)dependency歸納,為了后面order point process
Worklist是數(shù)據(jù)流分析的重點(diǎn),worklist類(lèi)似于stack/queue
用worklist代替混沌迭代
W中存放的是每個(gè)需要處理的variable
這里的y是經(jīng)過(guò)傳遞函數(shù)F處理的后的v,當(dāng)v的set值發(fā)生變化時(shí),需要把與v有相關(guān)依賴(lài)的其它variable添加到worklist中。
簡(jiǎn)化處理,為了方便講解,原來(lái)的計(jì)算方法對(duì)6個(gè)程序點(diǎn),存在12個(gè)參數(shù)(6個(gè)IN,6個(gè)OUT),但實(shí)際上IN和OUT能相互推導(dǎo),所以只保留6個(gè)輸入的集合不會(huì)影響計(jì)算效果
初始的worklist是[x1,x2,x3,x4,x5,x6],第二步中,x1賦初值[]時(shí),與之相應(yīng)有依賴(lài)關(guān)系的x2,x4要insert到worklist。第三步中x2的值發(fā)生改變,與之相應(yīng)有依賴(lài)關(guān)系的x3、x6 insert到worklist中,待處理。以此類(lèi)推。
因?yàn)榍懊娈?huà)出來(lái)的依賴(lài)圖是對(duì)部分節(jié)點(diǎn)并不存在循環(huán),所以它不存在一個(gè)拓?fù)湟饬x上的遍歷順序,但我們可以有一個(gè)準(zhǔn)遍歷順序(quasi-ordering)。
深度優(yōu)先搜索(Depth-First Search),也稱(chēng)為深度優(yōu)先遍歷(Depth-First Span),從根節(jié)點(diǎn)開(kāi)始遍歷。將當(dāng)前遍歷節(jié)點(diǎn)加入遍歷過(guò)的列表,并對(duì)與當(dāng)前節(jié)點(diǎn)有聯(lián)通邊的所有節(jié)點(diǎn)進(jìn)行深度優(yōu)先遍歷。下面是python的偽代碼:
后根序列(post-order):和DFS的遍歷過(guò)程類(lèi)似,但注意這里是先遍歷,再加入到列表。
def postorder(graph, root):"""Return a post-order ordering of nodes in the graph."""visited = set()order = []def dfs_walk(node):visited.add(node)for succ in graph.successors(node):if not succ in visited:dfs_walk(succ)order.append(node)dfs_walk(root)return order反向后根遍歷(Reverse postorder):顧名思義,就是把后根遍歷的序列轉(zhuǎn)置以下,是后根遍歷的逆序,簡(jiǎn)稱(chēng)rPostorder。生成的順序是[1,4, 5, 2, 6, 3]。圖和后根遍歷的一樣,只不過(guò)方向相反。
當(dāng)然,一個(gè)圖轉(zhuǎn)換成DFS或者rPostorder的時(shí)候,由于對(duì)多個(gè)節(jié)點(diǎn)共父節(jié)點(diǎn)的情況下,這多個(gè)節(jié)點(diǎn)之間的順序是不確定的,所以可能會(huì)存在多個(gè)DFS或者Postorder,也就會(huì)有多個(gè)rPostorder。
第一個(gè)是post-order,不是topological排序
第二個(gè)是BFS,也不是拓?fù)渑判?br />
總結(jié)
以上是生活随笔為你收集整理的DC888 : worklist slovers的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sqlite3源码编译到Android,
- 下一篇: 《思考,快与慢》读书笔记