DC888 : worklist slovers
worklist slovers
- solving constraints in prolog
- Static and Dynamic Solutions
- Iterative worklist solvers
- Chaotic iterations 混沌迭代
- Worklist是數據流分析的重點,worklist類似于stack/queue
solving constraints in prolog
其中remember的提示就是對3、5、6的output需要注意處理變量v的definition。
對每個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的等價表示。
Conservative Solutions:A system of equations gives us a solution that is conservative.
通過左邊的constraint得到右邊input和output的值,值可能不是精確的,但是不會存在錯誤值的。
其中a的值可能就是完全不需要,但不影響結果正確性,所以對于prolog是滿足條件正確性即可。
這里的solution就是每次進行迭代的結果,其中point 6的output是錯誤的,稱此時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.
靜態分析有時可以提供在程序的實際運行中永遠不會出現的解決方案。
這里就是說靜態分析是會包含不可能發生的情況,但不是wrong的結果,稱為false positive,如果是分析錯誤得到wrong的結果,則是false negative。
Finding solutions with prolog
Infinity queries
Iterative worklist solvers
Chaotic iterations 混沌迭代
(1) 將左邊的所有constraints放入bag中
(2) 隨機抽取一個constraint進行解析,檢查是否對x1、x2、x3、x4、x5、x6的input和output改變情況
(3) 如果x1、x2、x3、x4、x5、x6的input和output的值發生不改變時,當bag中有constraint時,繼續取constraint。如果bag沒有constraint,則處理結束。
(4) 如果(3)中input和output的值改變,則繼續從bag取constraints,繼續修改。x1、x2、x3、x4、x5、x6的input和output的值。
用reaching definition舉例,IN[xi]表示當前xi的input set,IN’[xi]表示經過constraint之后的input set。其中兩個并運算就是reaching definition的equation。
運算結束的terminate是每個point 的input和output的set值都不變。
混沌迭代中_|_(bottom)表示未賦值。F1到Fn表示傳遞函數。
混沌迭代算法復雜度高,需要一下幾點的優化
第一步中需要找到suitable order to process ,需要一定順序。第二步循環N次無法改變
對variable對dependency歸納,為了后面order point process
Worklist是數據流分析的重點,worklist類似于stack/queue
用worklist代替混沌迭代
W中存放的是每個需要處理的variable
這里的y是經過傳遞函數F處理的后的v,當v的set值發生變化時,需要把與v有相關依賴的其它variable添加到worklist中。
簡化處理,為了方便講解,原來的計算方法對6個程序點,存在12個參數(6個IN,6個OUT),但實際上IN和OUT能相互推導,所以只保留6個輸入的集合不會影響計算效果
初始的worklist是[x1,x2,x3,x4,x5,x6],第二步中,x1賦初值[]時,與之相應有依賴關系的x2,x4要insert到worklist。第三步中x2的值發生改變,與之相應有依賴關系的x3、x6 insert到worklist中,待處理。以此類推。
因為前面畫出來的依賴圖是對部分節點并不存在循環,所以它不存在一個拓撲意義上的遍歷順序,但我們可以有一個準遍歷順序(quasi-ordering)。
深度優先搜索(Depth-First Search),也稱為深度優先遍歷(Depth-First Span),從根節點開始遍歷。將當前遍歷節點加入遍歷過的列表,并對與當前節點有聯通邊的所有節點進行深度優先遍歷。下面是python的偽代碼:
后根序列(post-order):和DFS的遍歷過程類似,但注意這里是先遍歷,再加入到列表。
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):顧名思義,就是把后根遍歷的序列轉置以下,是后根遍歷的逆序,簡稱rPostorder。生成的順序是[1,4, 5, 2, 6, 3]。圖和后根遍歷的一樣,只不過方向相反。
當然,一個圖轉換成DFS或者rPostorder的時候,由于對多個節點共父節點的情況下,這多個節點之間的順序是不確定的,所以可能會存在多個DFS或者Postorder,也就會有多個rPostorder。
第一個是post-order,不是topological排序
第二個是BFS,也不是拓撲排序
總結
以上是生活随笔為你收集整理的DC888 : worklist slovers的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlite3源码编译到Android,
- 下一篇: 《思考,快与慢》读书笔记