-
Notifications
You must be signed in to change notification settings - Fork 13
kgp実験メモ
班管理ミスった.やり直し.
とはいえ,適切にタイムアウト=30mとしても時間で打ち切られない.
正常にタイムアウト処理が行われたケースを見たことがない.
終了は,異常タイムアウトかMAX_GENERATION
かSTOP_BY_PATCH_FOUND
のいずれか
-maxtime
がまともに動いていない?
回帰テストしてるらしい.
-tmax2 (Optional) maximum time (in miliseconds) for validating the regression test cases
KGPが早い理由は回帰テストサボりの可能性がある. 修正できたように見えて,回帰テストすると死ぬとか.
loglevel=DEBUG
に変更して真面目にログを読んでみる.
### 起動
java -jar /opt/apr-data/bin/astor.jar -mode jgenprog -location /opt/apr-data/example/math002 -scope package -failing org.apache.commons.math3.distribution.HypergeometricDistributionTest -srcjavafolder sr
2018-11-27 00:50:52,752 INFO main - command line arguments: [-mode jgenprog -location /opt/apr-data/example/math002 -scope package -failing org.apache.commons.math3.distribution.HypergeometricDist
2
### GZolterによる分析.ここで3分くらい.Suspiciousnessの計算っぽい
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:149) - Gzoltar fault localization: min susp value parameter: 0.1
[DEBUG] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:158) - Gzoltar run over: /opt/apr-data/example/math002/./output_astor/AstorMain-math002/bin/default , does it exist? true
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:169) - -gz-Adding classpath: [/opt/apr-data/example/math002/./output_astor/AstorMain-math002//bin//default, /opt/apr-data/astor/examples/libs/junit-4.4.jar]
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:206) - Test failt: org.apache.commons.math3.util.FastMathTest#checkMissingFastMathClasses
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:206) - Test failt: org.apache.commons.math3.random.CorrelatedRandomVectorGeneratorTest#testSampleWithZeroCovariance
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:206) - Test failt: org.apache.commons.math3.distribution.HypergeometricDistributionTest#testMath1021
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:218) - Gzoltar Test Result Total:5195, fails: 3, GZoltar suspicious 37312, with positive susp 341
[INFO ] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:226) - nr test results 5195
[DEBUG] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:259) - Suspicious: line org.apache.commons.math3.random.CorrelatedRandomVectorGenerator l: 168, susp 0.289
[DEBUG] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:259) - Suspicious: line org.apache.commons.math3.random.CorrelatedRandomVectorGenerator l: 169, susp 0.289
[DEBUG] fr.inria.astor.core.faultlocalization.gzoltar.GZoltarFaultLocalization.searchSuspicious(GZoltarFaultLocalization.java:259) - Suspicious: line org.apache.commons.math3.random.CorrelatedRandomVectorGenerator l: 173, susp 0.289
### 上記suspに基づく,変更箇所の生成?
[INFO ] fr.inria.astor.core.solutionsearch.AstorCoreEngine.initPopulation(AstorCoreEngine.java:693) -
---- Initial suspicious size: 55
[DEBUG] fr.inria.astor.core.solutionsearch.population.ProgramVariantFactory.createProgramInstance(ProgramVariantFactory.java:116) - Creating variant 1
[DEBUG] fr.inria.astor.core.solutionsearch.population.ProgramVariantFactory.createModificationPoints(ProgramVariantFactory.java:256) - --ModifPoint:CtForImpl, suspValue 0.2886751345948129, line 168, file CorrelatedRandomVectorGenerator.java
[DEBUG] fr.inria.astor.core.solutionsearch.population.ProgramVariantFactory.createModificationPoints(ProgramVariantFactory.java:256) - --ModifPoint:CtAssignmentImpl, suspValue 0.2886751345948129, line 169, file CorrelatedRandomVectorGenerator.java
[DEBUG] fr.inria.astor.core.solutionsearch.population.ProgramVariantFactory.createModificationPoints(ProgramVariantFactory.java:256) - --ModifPoint:CtLocalVariableImpl, suspValue 0.2886751345948129, line 173, file CorrelatedRandomVectorGenerator.java
### ここがエグい.5mくらいかかる.全テスト実行しているっぽい.それ必要?
[INFO ] fr.inria.astor.core.solutionsearch.population.ProgramVariantFactory.createInitialPopulation(ProgramVariantFactory.java:82) - Creating program variant #1, [Variant id: 1, #gens: 50, #ops: 0, parent:-]
[DEBUG] fr.inria.astor.core.solutionsearch.AstorCoreEngine.initPopulation(AstorCoreEngine.java:707) - Calculating fitness
[DEBUG] fr.inria.astor.core.solutionsearch.AstorCoreEngine.setFitnessOfPopulation(AstorCoreEngine.java:716) - Calculating fitness for original program variant.
[DEBUG] fr.inria.astor.core.validation.processbased.ProcessValidator.validate(ProcessValidator.java:65) - -Running first validation
[DEBUG] fr.inria.astor.core.validation.processbased.LaucherJUnitProcess.printCommandToExecute(LaucherJUnitProcess.java:228) - Executing process:
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -Xmx2048m -cp /opt/apr-data/astor/examples/libs/junit-4.4.jar:/opt/apr-data/example/math002/./output_astor/AstorMain-math002/bin/default/:/opt/apr-data/bin/astor.jar: fr.inria.astor.core.validation.junit.JUnitNologExternalExecutor org.apache.commons.math3.distribution.HypergeometricDistributionTest
[DEBUG] fr.inria.astor.core.validation.processbased.LaucherJUnitProcess.getTestResult(LaucherJUnitProcess.java:253) - Analyzing output from process
[DEBUG] fr.inria.astor.core.validation.processbased.ProcessValidator.validate(ProcessValidator.java:80) - TR: Success: false, failTest= 1, was successful: false, cases executed: 16] ,[]
[DEBUG] fr.inria.astor.core.validation.processbased.ProcessValidator.executeRegressionTesting(ProcessValidator.java:183) - -Test Failing is passing, Executing regression
[DEBUG] fr.inria.astor.core.validation.processbased.LaucherJUnitProcess.printCommandToExecute(LaucherJUnitProcess.java:228) - Executing process:
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -Xmx2048m -cp /opt/apr-data/astor/examples/libs/junit-4.4.jar:/opt/apr-data/example/math002/./output_astor/AstorMain-math002/bin/default/:/opt/apr-data/bin/astor.jar: fr.inria.astor.core.validation.junit.JUnitNologExternalExecutor org.apache.commons.math3.RetryRunnerTest o
...
[DEBUG] fr.inria.astor.core.validation.processbased.ProcessValidator.executeRegressionTesting(ProcessValidator.java:201) - TR: Success: false, failTest= 58, was successful: false, cases executed: 4413] ,
[DEBUG] fr.inria.astor.core.solutionsearch.AstorCoreEngine.setFitnessOfPopulation(AstorCoreEngine.java:741) - The original fitness is : 58.0
### いつものパラメタダンプ
[INFO ] fr.inria.astor.core.setup.ConfigurationProperties.print(ConfigurationProperties.java:66) - ----------------------------
[INFO ] fr.inria.astor.core.setup.ConfigurationProperties.print(ConfigurationProperties.java:67) - ---Configuration properties:---Execution values
[INFO ] fr.inria.astor.core.setup.ConfigurationProperties.print(ConfigurationProperties.java:69) - p:lastJUnitVersion= ./examples/libs/junit-4.11.jar
[INFO ] fr.inria.astor.core.setup.ConfigurationProperties.print(ConfigurationProperties.java:69) - p:alternativecompliancelevel= 4
[INFO ] fr.inria.astor.core.setup.ConfigurationProperties.print(ConfigurationProperties.java:69) - p:ignoredTestCases=
### こっからGA処理開始.毎秒1世代(1個体)くらい進んでいるように見える
[INFO ] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.startEvolution(EvolutionarySearchEngine.java:40) -
----Starting Solution Search
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.startEvolution(EvolutionarySearchEngine.java:65) -
----------Running generation: 1, population size: 1
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.processGenerations(EvolutionarySearchEngine.java:134) -
***** Generation 1 : 0
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.processGenerations(EvolutionarySearchEngine.java:143) - **Parent Variant: [Variant id: 1, #gens: 50, #ops: 0, parent:-]
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.createNewProgramVariant(EvolutionarySearchEngine.java:193) -
--Child created id: 2
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.modifyProgramVariant(EvolutionarySearchEngine.java:242) - --Creating new operations for variant [Variant id: 2, #gens: 50, #ops: 0, par
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.modifyProgramVariant(EvolutionarySearchEngine.java:256) - ---analyzing modificationPoint position: 30
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.modifyProgramVariant(EvolutionarySearchEngine.java:275) - location: StorelessBivariateCovariance.java90
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.modifyProgramVariant(EvolutionarySearchEngine.java:277) - operation: OP_INSTANCE:
RemoveOp:(spoon.support.reflect.code.CtOperatorAssignmentImpl) `covarianceNumerator += ((((n) - 1.0) / (n)) * deltaX) * deltaY ` -topatch--> `-` (null)
[DEBUG] fr.inria.astor.core.solutionsearch.EvolutionarySearchEngine.modifyProgramVariant(EvolutionarySearchEngine.java:297) -
--Summary Creation: for variant [Variant id: 2, #gens: 49, #ops: 1, parent:1] gen mutated: 1 , gen not mut: 0, gen not applied 0
有馬君に頼んで調べてもらった. 完全に解決.
astorのタイムアウト時間の計測方法に起因する計測スクリプトのバグ.
0m 10m 30m 35m 40m
t|---------|-----------------------|-----|------|
|起動 |初期処理 |期待していたタイムアウトのライン
|タイムアウトコマンドによる打ち切り
|------------------------------------|実際のタイムアウト
30m
astorは初期処理(コンパイル・フルテスト)後にタイムアウト時間の計測が開始される. タイムアウトコマンドは5mの猶予を持っているが,上記初期処理は10mくらいかかるので, タイムアウトコマンドによる強制終了が発生する.
猶予を+30m(60m)として再実験. 20台による並列処理.11/29朝には終わる予定.
...
わかった.
-maxtime=1800
これがまずい.正しくは単位は分.
加え,上記のタイムアウトでastor自体が適切にタイムアウトできないと,結果が出力されない.
- タイムアウトが長すぎる
-
timeout
コマンドで不適切なタイムアウト発生 - 結果が出力されない
よって,
-maxtime=30
とするのに加え,
-maxgen=100000
にするべき.
話にならん. ほとんど修正できず.
修正1割(60, 70, 71, 73, 80, 81, 82, 85, 95) 最大世代数到達=正常終了6割 エラー落ち3割
genp-30mも追加で試す
math30くらいまで終了. 劇的に改善とはいえず. 思うこと2点.
-
やはり乱数が再現していない? math9-9は10mで成功,30mで失敗 時間以外のパラメタ同じなので,30mで失敗する理由がないはず.
-
後ろの世代が役に立っていない? まずheap落ちがかなり増えた. heap発生すると即死なので時間を増やしても効果がない. 長時間起動で安定しないとも言いかえられる.
kgpが揃った. 概ね問題なさそう. 33/104 で(少なくとも1乱数で)修正成功. トータル17時間くらい.
genpは実行中. 絶不調.やはりパラメタ指定がおかしい?
-maxgen=100000
が悪いっぽい
世代数を上げると初回の計算が死ぬほど重くなって,
結果10mのタイムアウトに引っかかってる.
原稿で指摘できる問題. 「スケールしない」 実装の問題だとは思うけど.
パラメタを極力デフォルトに戻した.
maxgen=200
flthreshold=0.1
19プロジェクト x 10シードで成功なし.
概ね14プロジェクトが強制タイムアウト(exit1).
5プロジェクトがOUTPUT_STATUS=MAX_GENERATION
.
後者は一応正常終了なので良い.前者がまずい.
このパラメタだと600sはきついのかも.
maxgen=100
くらいか?
カウント方法が微妙にバグってる. 過小に出ているのでハンデに.
もう一度実行しよう.17時間あれば終わる.
コピペで結果が得られるように
30プロジェクト x 10シードで成功ナシ.
タイムアウトしているわけでもないが,
OUTPUT_STATUS=EXHAUSTIVE_NAVIGATED
で終了.
修正を試みているようなログは出ているので,根本的に間違っているわけではないと思う.
java -jar /opt/apr-data/bin/astor.jar -mode jkali -location /opt/apr-data/example/math021 -scope package -failing org.apache.commons.math3.linear.RectangularCholeskyDecompositionTest -srcjavafolder src/m
...
[INFO ] fr.inria.astor.core.solutionsearch.ExhaustiveSearchEngine.startEvolution(ExhaustiveSearchEngine.java:59) - mod_point MP=org.apache.commons.math3.linear.Array2DRowRealMatrix line: 509, pointed ele
[INFO ] fr.inria.astor.core.solutionsearch.ExhaustiveSearchEngine.startEvolution(ExhaustiveSearchEngine.java:60) - -->op: OP_INSTANCE:
RemoveOp:(spoon.support.reflect.code.CtForImpl) `for (int i = 0; i < nRows; i++) { java.lang.System.arraycopy(data[i], 0, out[i], 0, data[i].length)[...] ` -topatch--> `-` (null)
[INFO ] fr.inria.astor.core.solutionsearch.ExhaustiveSearchEngine.startEvolution(ExhaustiveSearchEngine.java:59) - mod_point MP=org.apache.commons.math3.linear.Array2DRowRealMatrix line: 510, pointed ele
[INFO ] fr.inria.astor.core.solutionsearch.ExhaustiveSearchEngine.startEvolution(ExhaustiveSearchEngine.java:60) - -->op: OP_INSTANCE:
RemoveOp:(spoon.support.reflect.code.CtInvocationImpl) `java.lang.System.arraycopy(data[i], 0, out[i], 0, data[i].length) ` -topatch--> `-` (null)
[INFO ] fr.inria.astor.core.solutionsearch.AstorCoreEngine.atEnd(AstorCoreEngine.java:168) - Time Repair Loop (s): 30.196
[INFO ] fr.inria.astor.core.solutionsearch.AstorCoreEngine.atEnd(AstorCoreEngine.java:170) - generationsexecuted: 1
[INFO ] fr.inria.astor.core.solutionsearch.AstorCoreEngine.printFinalStatus(AstorCoreEngine.java:234) -
----SUMMARY_EXECUTION---
[INFO ] fr.inria.astor.core.solutionsearch.AstorCoreEngine.atEnd(AstorCoreEngine.java:184) -
--SOLUTIONS DESCRIPTION--
Astor Output:
General stats:
EXECUTION_IDENTIFIER=
TOTAL_TIME=30.196
NR_GENERATIONS=null
NR_RIGHT_COMPILATIONS=61
NR_FAILLING_COMPILATIONS=3
NR_ERRONEOUS_VARIANCES=null
NR_FAILING_VALIDATION_PROCESS=null
OUTPUT_STATUS=EXHAUSTIVE_NAVIGATED
Patch stats:
[INFO ] fr.inria.astor.core.output.PatchJSONStandarOutput.produceOutput(PatchJSONStandarOutput.java:103) - Storing ing JSON at /opt/apr-data/example/math021/./output_astor/AstorMain-math021//astor_output
[INFO ] fr.inria.astor.core.output.PatchJSONStandarOutput.produceOutput(PatchJSONStandarOutput.java:104) - astor_output:
{"general":{"NR_RIGHT_COMPILATIONS":61,"NR_ERRONEOUS_VARIANCES":null,"EXECUTION_IDENTIFIER":"","OUTPUT_STATUS":"EXHAUSTIVE_NAVIGATED","NR_FAILLING_COMPILATIONS":3,"NR_GENERATIONS":null,"TOTAL_TIME":30.19
[INFO ] fr.inria.main.evolution.AstorMain.run(AstorMain.java:200) - Time Total(s): 480.223
real 495.243
user 614.733
sys 5.641
謎.
math70辺りでsshがぽつぽつ切れていた. tmux必須か.
かなりの割合でkgpが勝てる. というよりkgpの方が修正できる割合が多い. 10mがシビアすぎるかも.
あとastorが変に停止するケースがたくさんある. 使い方間違ってる気もするが,. 成功するケースもあるのでよくわからん.
乱数1では新たに2バグ直るようになった 31 43
修正が早くなったものもある 81 20 58
逆に遅くなったもの 57 78 61 50
新たに修正可能になる=無限ループを回避するで納得できるが, 速度が変わる理由がよくわからん
あと(おそらく無限ループにより)停止状態になっていたもの 70 77 65 73 75 ...
こいつらは修正はできなかったもののうまく終了できていた JUnitカスタムの効果といえる
1m30s
はクソ 90.00
にしたい
export TIMEFORMAT=$'\nreal %3R\nuser %3U\nsys %3S'
asis
kgp
/ astor
tobe
kgp
/ genp
/ kali
kgpで多発 題材側でheap例外めっちゃ出てる
実行マシンは4gb
試したところ,8gbあればいけそう
ただawsの設定を変えるのに抵抗がある
「c5x.large
を使った」とだけ書きたい
c5dよりc5の方がよいか? c5dはssdを積んでるのでディスクアクセスが早い astor側に有利に働く
加え,メモリ増やしたほうがよいか. 4gbしかないので8gbくらいには kgpのheap問題多少解決するかも
あとdockerのcpu数も変に制御しないほうがよいかも astorの足を引っ張ってそう kgpもコンパイルはマルチプロセスなので, kgpにとってもハンデになってる
pythonで
どっこい
ログを眺めてみたところ,それぞれハンデを抱えている状態.
kgp:無限ループ引っかかるとどうしようもなくなる(例のスレッド停止不可問題に起因) astor:謎Los_Angelsエラー (編集済み)
タイムゾーンを指定すれば良いっぽい.
sudo timedatectl set-timezone Asia/Tokyo
dockerのコンソールログが6GBになっていた
--max-generation=10000000
で世代生成に失敗すると,
100万回ゴミ出力されてとんでもないサイズのテキストが生成される
世代=1万程度に変更
dockerのcpuを指定して比較
指定なし(フルCPU)
real 1m53.329s
user 5m58.083s
sys 0m33.293s
CPU1個(--cpuset-cpus=0)
real 2m48.501s
user 2m36.803s
sys 0m11.005s
CPU数が多いほどたしかに早いけど,kgpもjavacはマルチプロセスだし, なんともいえないところ
VMごとに別シード別APR手法を適用している. これら2つのパラメタを環境変数に移行. これにより,初回のみ環境変数を手で設定すれば, あとは全て同じコマンドで別条件の実験を実施できる.
継承ベースのJUnitでは停止できない カスタムjarを作成することにより解決 テスト実行部分をスレッド化してタイムアウトを差し込んだ https://github.com/kusumotolab/kGenProg/issues/392
...
astorでpopulation=100にすると全く修正できなくなった. 基本デフォルト値使う方針で,世代無限,時間10mとすることに.
astorのflthresholdのデフォルト値がバグってる デフォルト0.1と書いてあるが実際は0. 0だと修正うまくいかないので
[ec2-user@ip-172-31-10-226 ~]$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 41M 1.8G 3% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/nvme0n1p1 8.0G 8.0G 20K 100% /
tmpfs 371M 0 371M 0% /run/user/0
tmpfs 371M 0 371M 0% /run/user/1000
NVMeをマウントする必要があるらしい https://dev.classmethod.jp/cloud/aws/ec2-m5d-instance/
各世代1っぽい?
Astor Output:
General stats:
EXECUTION_IDENTIFIER=
TOTAL_TIME=33.182
NR_GENERATIONS=100
NR_RIGHT_COMPILATIONS=49
NR_FAILLING_COMPILATIONS=51
NR_ERRONEOUS_VARIANCES=null
NR_FAILING_VALIDATION_PROCESS=null
OUTPUT_STATUS=MAX_GENERATION
astorは各世代1 kgpは
ついでにたまってたPRも処理
exp-for-journal
ブランチがエグいことになってきたので,
再度masterから切り直し.
git co exp-for-journal
git diff master --binary > x.patch
git co master
patch x.patch
バイナリはパッチできないので手作業で
c5d.large
ssh ec2-user@54.250.186.120 -i apr.pem ssh ec2-user@13.230.253.238 -i apr.pem
gpuより遅い
run kgp math 49
gpu
real 4m46.198s
user 7m54.706s
sys 0m32.092s
aws
real 6m57.095s
user 11m20.650s
sys 0m1.776s
apr = {kgp, jgenprog, jkali}
scope = {file, package, app}
project = {math{1..104}, Lang{...}, Chart{...}, ...}
seed = {1..10}
timelimit = 10m (600s)
maxgen = 1000
populat. = 10
10m x 10seed x 104bugs = 170h 170h x 3aprs = 510h
10台c5d.large x 240時間/月 = $230
停止していた 謎
$ less /opt/apr-data/example/math001/defects4j.build.properties
#File automatically generated by Defects4J
d4j.bug.id=1
d4j.classes.modified=org.apache.commons.math3.fraction.Fraction,org.apache.commons.math3.fraction.BigFraction
d4j.dir.src.classes=src/main/java
d4j.dir.src.tests=src/test/java
d4j.project.id=Math
d4j.tests.trigger=org.apache.commons.math3.fraction.BigFractionTest::testDigitLimitConstructor,org.apache.commons.math3.fraction.FractionTest::testDigitLimitCons
d4j.tests.trigger
が複数引数になっている.
パースできていない.最初だけしか取り出せていない.
依存山程あるはず ???
何かと停止する astorも
→ timeoutコマンドを追加
https://github.com/kusumotolab/kGenProg/wiki/20181115-meeting
カスタムjarを作成することにより解決 https://github.com/kusumotolab/kGenProg/issues/392
memo
C:\pbl\workspace\junit4\src\main\java\org\junit\internal\runners\statements\FailOnTimeout.java
FailOnTimeout#evaluate
手元でのQSortの実行方法
$ gradle assemble; x=$(realpath build/libs/kGenProg.jar)
$ (cd example/QuickSort01; java -jar $(cygpath -w $x) -r . -s 'src/example/QuickSort.java' -t 'src/example/QuickSortTest.java' --test-time-limit=1)
永続データはdockerから切り離すと良い
- クローンした{KGP,astor,d4j}リポジトリ
- d4jからチェックアウトした題材
- {KGP,astor,d4j}のコンパイル結果
- ビルドツールのキャッシュ{.m2,.gradle}
実行手順
$ cd /opt/apr-data/kgp/example/QuickSort01/
$ sudo javac -cp $astor_base/examples/libs/junit-4.4.jar -d bin src/example/QuickSort*.java
t=$base/kgp/example/QuickSort01; (cd $t; java -jar $base/bin/astor.jar -mode jgenprog -location $t -failing example.QuickSortTest -srcjavafolder src/ -srctestfolder src/ -binjavafolder bin/ -bintestfolder bin/ -dependencies $astor_base/examples/libs/junit-4.4.jar ; )
結果 ある程度考えてるっぽい
[INFO ] fr.inria.astor.core.validation.processbased.LaucherJUnitProcess.killProcess(LaucherJUnitProcess.java:171) - The Process that runs JUnit test cases did not terminate within waitTime of 10 seconds
[INFO ] fr.inria.astor.core.validation.processbased.LaucherJUnitProcess.killProcess(LaucherJUnitProcess.java:173) - Killed the Process that runs JUnit test cases 7299
https://github.com/kusumotolab/kGenProg/issues/392 上記ISSUEのせいでKGP修正がタイムアウトした後にプロセスが停止する. 実験が回せない. 無限ループ遺伝子一つでも生まれると発生するっぽい.
実験環境をDocker化した.
docker化で発生した問題. surefire & jdk8で発生するバグ.
https://issues.apache.org/jira/browse/SUREFIRE-1588 https://stackoverflow.com/questions/53010200/maven-surefire-could-not-find-forkedbooter-class?noredirect=1&lq=1
Math全てのpom.xmlに以下追記で対処
<useSystemClassLoader>false</useSystemClassLoader>
NPEが出る
java -jar bin/astor.jar # NPE
java -jar $(realpath bin/astor.jar) # ok
https://github.com/kusumotolab/kGenProg-exp
$ # macの人はsh使って下さい!!!
$ git clone git@github.com:kusumotolab/kGenProg-exp.git
$ cd kGenProg-exp
$ source util.sh
$ build_kgp # kgpのクローンとビルド
$ build_astor # astorのクローンとビルド
Math73の場合
$ run kgp 85
$ run astor 85
exp-for-journal
を切りました.
上記スクリプトでは自動的にこのブランチに切り替えてjar生成します.
https://github.com/kusumotolab/kGenProg/tree/exp-for-journal
kgp https://github.com/kusumotolab/kGenProg kgp-example https://github.com/kusumotolab/kGenProg-example astor https://github.com/SpoonLabs/astor apr比較 https://github.com/Spirals-Team/defects4j-repair/tree/master/results/2015-august
担当:ま D4JのMathを対象に乱数を変えつつ自動で実験できる環境の整備. 実験スクリプトの作成とも言いかえて良い. GPUマシンで作成中.
起動構成を整理した表を作りたい. 人力で頑張るしかない.
target | src | test | exec-test |
---|---|---|---|
math02 | src/main/java | src/test/java/ | org.apache.xTest |
math05 | src/main/java | src/test/java/ | org.apache.xxxx |
math73 | src/main/java | src/test/java/ | org.apache.yyyy |
KGPで修正できない,あるいは圧倒的に敗北する題材が多数ある. 軽くで良いのでKGPを修正して良い実験結果を出せないか?
ひとまずMath73をなんとかしたい.
kgp | astor | ||
---|---|---|---|
Math02 | -- | 死 | 無 |
Math05 | -- | ||
Math70 | -- | ||
Math73 | -- | 12h ng | 10m |
Math73 | MacBookPro13 | 1m14s | 8m59s |
Math85 | -- | 40s | 40s |
Math85 | MacBookPro13 | 32s | 43s |
そもそも題材自体がテスト実行できないので両方死ぬ. どうもmaven周りっぽい. https://github.com/kusumotolab/kGenProg/issues/267 実験対象外にするか?
昔試したことがある.その時は失敗.
https://github.com/kusumotolab/kGenProg/issues/269
現在のバージョンでどうかは未確認.
NPEですね.
2018-11-08 13:03:12 [main] [INFO] jp.kusumotolab.kgenprog.KGenProgMain - in the era of the 1st generation (0 seconds)
2018-11-08 13:03:12 [main] [INFO] jp.kusumotolab.kgenprog.ga.VariantStore - exec selection. 2nd variants: (1, 0) => 1
2018-11-08 13:03:12 [main] [INFO] jp.kusumotolab.kgenprog.ga.EvolutionLogger - max fitness(0): 0.0
2018-11-08 13:03:12 [main] [INFO] jp.kusumotolab.kgenprog.ga.EvolutionLogger - min fitness(0): 1.0
Exception in thread "main" java.lang.NullPointerException
at jp.kusumotolab.kgenprog.ga.EvolutionLogger.isInitialVariant(EvolutionLogger.java:73)
at jp.kusumotolab.kgenprog.ga.EvolutionLogger.writeToLogger(EvolutionLogger.java:63)
at jp.kusumotolab.kgenprog.ga.EvolutionLogger.log(EvolutionLogger.java:54)
at jp.kusumotolab.kgenprog.KGenProgMain.run(KGenProgMain.java:99)
at jp.kusumotolab.kgenprog.CUILauncher.launch(CUILauncher.java:49)
at jp.kusumotolab.kgenprog.CUILauncher.main(CUILauncher.java:27)
astorはexample配下にないので未実行.
圧倒的敗北.要議論 議論は別Headに切り出し.
両方修正可能. astorはマルチスレッドなので早い. KGPはインメモリなので早い.
time-limit = 60000
test-time-limit = 10
max-generation = 3000
headcount = 10
mutation-generating-count = 100
crossover-generating-count = 0
# random-seed = 123
Humanパッチはこんなん APRでは不可能な内容
diff --git a/org/apache/commons/math/analysis/solvers/BrentSolver.java b/org/apache/commons/math/analysis/solvers/BrentSolver.java
index e0cb427..4e95ed5 100644
--- a/org/apache/commons/math/analysis/solvers/BrentSolver.java
+++ b/org/apache/commons/math/analysis/solvers/BrentSolver.java
@@ -32,11 +32,6 @@ import org.apache.commons.math.analysis.UnivariateRealFunction;
*/
public class BrentSolver extends UnivariateRealSolverImpl {
+ /** Error message for non-bracketing interval. */
+ private static final String NON_BRACKETING_MESSAGE =
+ "function values at endpoints do not have different signs. " +
+ "Endpoints: [{0}, {1}], Values: [{2}, {3}]";
-
/** Serializable version identifier */
private static final long serialVersionUID = 7694577816772532779L;
@@ -133,11 +128,6 @@ public class BrentSolver extends UnivariateRealSolverImpl {
return solve(f, initial, yInitial, max, yMax, initial, yInitial);
}
+ if (yMin * yMax > 0) {
+ throw MathRuntimeException.createIllegalArgumentException(
+ NON_BRACKETING_MESSAGE, min, max, yMin, yMax);
+ }
-
// full Brent algorithm starting with provided initial guess
return solve(f, min, yMin, max, yMax, initial, yInitial);
@@ -186,7 +176,9 @@ public class BrentSolver extends UnivariateRealSolverImpl {
} else {
// neither value is close to zero and min and max do not bracket root.
throw MathRuntimeException.createIllegalArgumentException(
+ NON_BRACKETING_MESSAGE, min, max, yMin, yMax);
- "function values at endpoints do not have different signs. " +
- "Endpoints: [{0}, {1}], Values: [{2}, {3}]",
- min, max, yMin, yMax);
}
} else if (sign < 0){
// solve using only the first endpoint as initial guess
astorはこう.一行の置換修正
--- org/apache/commons/math/analysis/solvers/BrentSolver.java
+++ org/apache/commons/math/analysis/solvers/BrentSolver.java
@@ -129,9 +129,7 @@
}
- return solve(f, min, yMin, max, yMax, initial, yInitial);
- }
@@ -141,6 +139,8 @@
+ return solve(f, min, initial);}
+
修正ファイルはBrentSolver
kgpの上の該当する行の疑惑値は1.0になっているので,再利用がうまくいっていなさそう
再利用すべきコードは別ファイルにある.
$ find astor/examples/math_73/src/main/java/org/apache/commons/math/ -type f | xargs grep 'return solve(f, min, initial)'
.../solvers/LaguerreSolver.java: return solve(f, min, initial);
.../solvers/MullerSolver.java: return solve(f, min, initial);
.../solvers/RiddersSolver.java: return solve(f, min, initial);
こいつをうまく再利用できていない. 再利用候補には入っている.
kgpはプロジェクト全体から再利用候補を探しているため,再利用候補の数が膨大(17,000越え)になっているため,適切な再利用ができていない. astorの今の設定はパッケージ内から選んでいるため,再利用候補が少なく(500程度),成功していると考えられる.