Python 中的貪婪排名演算法

發表於2015-12-29

在較早的一遍文章中,我曾經提到過我已經寫了一個屬於自己的排序演算法,並且認為需要通過一些程式碼來重新回顧一下這個排序演算法。

對於我所完成的工作,我核實並且保證微處理器的安全。對非常複雜的CPU進行測試的一個方法就是建立該晶片的另一個模型,其可以用來產生在CPU上執行的偽隨機指令流。這所謂的ISG(指令流產生器)能夠在很短的時間內建立幾千(甚至幾百萬)個這樣的測試,通過某種方式,使其可以巧妙地給出一些對將在CPU上執行的指令流的控制或操縱。

現在對這些指令流進行模擬,可以通過每一個測試例項花費的時間獲取到CPU的那一部分被使用了(這叫做被覆蓋)的資訊,並且ISG所產生的的過個測試可能會覆蓋CPU的同一個區域。為了增加CPU的整體覆蓋範圍,我們啟動一個被稱作復原的行為——所有的測試都執行,並且它們的覆蓋範圍和花費的時間將被儲存起來。在這次復原的最後,您可能會有幾千個測試例項只覆蓋了CPU的某一部分。

如果你拿著這個復原測試的記過,並且對其進行排序,你會發現這個測試結果的一個子集會給出它們覆蓋了CPU的所有部分。通常,上千的偽隨機測試可能會被排序,進而產生一個只有幾百個測試的子列表,它們在執行時將會給出同樣的覆蓋範圍。接下來我們經常會做的是,檢視CPU的哪個部分沒有被覆蓋,然後通過ISG或其它方法在產生更多的測試,來試圖填補這一空白。再然後會執行一次新的復原,並且迴圈得再一次進行排序來充分使用該CPU,以達到某個覆蓋範圍目標。

對測試進行排名是復原流程的一個重要部分,當其進行地很好時你可能就會忘記它。不幸的是,有時,當我想要對其它資料進行排名時,CAD工具廠商所提供的常用排名演算法並不適合。因此,能夠擴充套件到處理成百上千個測試和覆蓋點才是一個排名演算法的本質。

輸入

通常情況下,我不得不從其他CAD程式產生的文字或HTML檔案來解析我的輸入 – 這是個是單調乏味的工作,我會跳過這個乏味的工作,而通過以Python字典的形式提供理想的輸入。 (有時用於解析輸入檔案的程式碼可以跟排名演算法一樣大或著更大)。

讓我們假設每個ISG測試都有一個名稱,在確定的“時間”內執行,當模擬顯示’覆蓋’設計中的
一組編號的特性時。解析之後,所收集的輸入資料由程式中的結果字典來表示。

貪婪排名演算法的核心是對當前選擇測試的子集進行排序:

  1. 至少用一個測試集覆蓋儘可能大的範圍。
  2. 經過第一個步驟,逐步減少測試集,同時覆蓋儘可能大的範圍。
  3. 給選擇的測試做出一個排序,這樣小資料集的測試也可以選擇使用
  4. 完成上述排序後,接下來就可以優化演算法的執行時間了
  5. 當然,他需要能在很大的測試集下工作。

貪婪排名演算法的工作原理就是先選擇當前測試集的某一項的最優解,然後尋找下一項的最優解,依次進行…

如果有兩個以上的演算法得出相同的執行結果,那麼將以執行”時間“來比較兩種演算法優劣。

用下面的函式完成的演算法:

每次while迴圈(第5行),下一個最好的測試會被追加到排名和測試,不會
丟棄貢獻的任何額外覆蓋(37-41行)

上面的函式是略顯簡單,所以我花了一點時間用tutor來標註,當執行時列印出它做的。

函式(有指導):

它完成同樣的事情,但程式碼量更大,太繁冗:

每一塊以
if tutor開始:  新增以上程式碼

樣值輸出

呼叫排序並列印結果的程式碼是:

結果包含大量東西,來自tutor並且最後跟著結果。

對這個偽隨機生成15條測試資料的測試案例,看起來只需要七條去產生最大的總覆蓋率。(而且如果你願意放棄三條測試,其中每個只覆蓋了一個額外的點,那麼15條測試中的4條就將給出92.5%的最大可能覆蓋率)。

 

下一個會是什麼

已經存在有一種新的
統一覆蓋互通性標準 (Unified Coverage Interoperability Standard)以供資料庫理想的儲存測試覆蓋率資料,貪婪排名應該被掛起到 UCIS DB,以便通過它的C-介面獲得輸入資料,或者也可能是替代解析文字檔案的XML輸出。

相關文章