日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DC888 : worklist slovers

發布時間:2023/12/9 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的偽代碼:

def dfs(graph, root, visitor):"""DFS over a graph.Start with node 'root', calling 'visitor' for every visited node."""visited = set()def dfs_walk(node):visited.add(node)visitor(node)for succ in graph.successors(node):if not succ in visited:dfs_walk(succ)dfs_walk(root)

后根序列(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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。