Skip to content

Commit 8d5c67e

Browse files
authored
Merge pull request gousiosg#20 from bitslab/alekh
Solving RQ4
2 parents d0dcd32 + 9832bc6 commit 8d5c67e

File tree

8 files changed

+259
-90
lines changed

8 files changed

+259
-90
lines changed

artifacts/configs/jflex-fixed/jflex-fixed.yaml

Lines changed: 76 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -8,93 +8,93 @@ testJar: jflex-1.8.2-tests.jar
88
#mvnOptions: -DfailIfNoTests=false -Dmaven.surefire.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"
99
mvnOptions: -DfailIfNoTests=false
1010
properties:
11-
- name: StateSetQuickcheck#size2nbits
12-
entryPoint: "jflex.state.StateSetQuickcheck.size2nbits(I)V"
13-
- name: StateSetQuickcheck#containsIsSubset
14-
entryPoint: "jflex.state.StateSetQuickcheck.containsIsSubset(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
15-
- name: StateSetQuickcheck#addIsUnion
16-
entryPoint: "jflex.state.StateSetQuickcheck.addIsUnion(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
17-
- name: StateSetQuickcheck#addCommutes
18-
entryPoint: "jflex.state.StateSetQuickcheck.addCommutes(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
19-
- name: StateSetQuickcheck#addEmpty
20-
entryPoint: "jflex.state.StateSetQuickcheck.addEmpty(Ljflex/state/StateSet;)V"
21-
- name: StateSetQuickcheck#addSelf
22-
entryPoint: "jflex.state.StateSetQuickcheck.addSelf(Ljflex/state/StateSet;)V"
23-
- name: StateSetQuickcheck#addIdemPotent
24-
entryPoint: "jflex.state.StateSetQuickcheck.addIdemPotent(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
25-
- name: StateSetQuickcheck#intersect
26-
entryPoint: "jflex.state.StateSetQuickcheck.intersect(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
27-
- name: StateSetQuickcheck#intersectUnchanged
28-
entryPoint: "jflex.state.StateSetQuickcheck.intersectUnchanged(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
29-
- name: StateSetQuickcheck#intersectCommutes
30-
entryPoint: "jflex.state.StateSetQuickcheck.intersectCommutes(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
31-
- name: StateSetQuickcheck#intersectEmpty
32-
entryPoint: "jflex.state.StateSetQuickcheck.intersectEmpty(Ljflex/state/StateSet;)V"
33-
- name: StateSetQuickcheck#intersectSelf
34-
entryPoint: "jflex.state.StateSetQuickcheck.intersectSelf(Ljflex/state/StateSet;)V"
35-
- name: StateSetQuickcheck#containsItsElements
36-
entryPoint: "jflex.state.StateSetQuickcheck.containsItsElements(Ljflex/state/StateSet;)V"
37-
- name: StateSetQuickcheck#removeRemoves
38-
entryPoint: "jflex.state.StateSetQuickcheck.removeRemoves(Ljflex/state/StateSet;I)V"
11+
# - name: StateSetQuickcheck#size2nbits
12+
# entryPoint: "jflex.state.StateSetQuickcheck.size2nbits(I)V"
13+
# - name: StateSetQuickcheck#containsIsSubset
14+
# entryPoint: "jflex.state.StateSetQuickcheck.containsIsSubset(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
15+
# - name: StateSetQuickcheck#addIsUnion
16+
# entryPoint: "jflex.state.StateSetQuickcheck.addIsUnion(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
17+
# - name: StateSetQuickcheck#addCommutes
18+
# entryPoint: "jflex.state.StateSetQuickcheck.addCommutes(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
19+
# - name: StateSetQuickcheck#addEmpty
20+
# entryPoint: "jflex.state.StateSetQuickcheck.addEmpty(Ljflex/state/StateSet;)V"
21+
# - name: StateSetQuickcheck#addSelf
22+
# entryPoint: "jflex.state.StateSetQuickcheck.addSelf(Ljflex/state/StateSet;)V"
23+
# - name: StateSetQuickcheck#addIdemPotent
24+
# entryPoint: "jflex.state.StateSetQuickcheck.addIdemPotent(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
25+
# - name: StateSetQuickcheck#intersect
26+
# entryPoint: "jflex.state.StateSetQuickcheck.intersect(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
27+
# - name: StateSetQuickcheck#intersectUnchanged
28+
# entryPoint: "jflex.state.StateSetQuickcheck.intersectUnchanged(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
29+
# - name: StateSetQuickcheck#intersectCommutes
30+
# entryPoint: "jflex.state.StateSetQuickcheck.intersectCommutes(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
31+
# - name: StateSetQuickcheck#intersectEmpty
32+
# entryPoint: "jflex.state.StateSetQuickcheck.intersectEmpty(Ljflex/state/StateSet;)V"
33+
# - name: StateSetQuickcheck#intersectSelf
34+
# entryPoint: "jflex.state.StateSetQuickcheck.intersectSelf(Ljflex/state/StateSet;)V"
35+
# - name: StateSetQuickcheck#containsItsElements
36+
# entryPoint: "jflex.state.StateSetQuickcheck.containsItsElements(Ljflex/state/StateSet;)V"
37+
# - name: StateSetQuickcheck#removeRemoves
38+
# entryPoint: "jflex.state.StateSetQuickcheck.removeRemoves(Ljflex/state/StateSet;I)V"
3939
- name: StateSetQuickcheck#removeAdd
4040
entryPoint: "jflex.state.StateSetQuickcheck.removeAdd(Ljflex/state/StateSet;II)V"
41-
- name: StateSetQuickcheck#clearMakesEmpty
42-
entryPoint: "jflex.state.StateSetQuickcheck.clearMakesEmpty(Ljflex/state/StateSet;)V"
43-
- name: StateSetQuickcheck#addStateAdds
44-
entryPoint: "jflex.state.StateSetQuickcheck.addStateAdds(Ljflex/state/StateSet;I)V"
41+
# - name: StateSetQuickcheck#clearMakesEmpty
42+
# entryPoint: "jflex.state.StateSetQuickcheck.clearMakesEmpty(Ljflex/state/StateSet;)V"
43+
# - name: StateSetQuickcheck#addStateAdds
44+
# entryPoint: "jflex.state.StateSetQuickcheck.addStateAdds(Ljflex/state/StateSet;I)V"
4545
- name: StateSetQuickcheck#addStateDoesNotRemove
4646
entryPoint: "jflex.state.StateSetQuickcheck.addStateDoesNotRemove(Ljflex/state/StateSet;I)V"
47-
- name: StateSetQuickcheck#addStateAdd
48-
entryPoint: "jflex.state.StateSetQuickcheck.addStateAdd(Ljflex/state/StateSet;I)V"
49-
- name: StateSetQuickcheck#complementNoOriginalElements
50-
entryPoint: "jflex.state.StateSetQuickcheck.complementNoOriginalElements(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
51-
- name: StateSetQuickcheck#complementElements
52-
entryPoint: "jflex.state.StateSetQuickcheck.complementElements(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
53-
- name: StateSetQuickcheck#complementUnion
54-
entryPoint: "jflex.state.StateSetQuickcheck.complementUnion(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
47+
# - name: StateSetQuickcheck#addStateAdd
48+
# entryPoint: "jflex.state.StateSetQuickcheck.addStateAdd(Ljflex/state/StateSet;I)V"
49+
# - name: StateSetQuickcheck#complementNoOriginalElements
50+
# entryPoint: "jflex.state.StateSetQuickcheck.complementNoOriginalElements(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
51+
# - name: StateSetQuickcheck#complementElements
52+
# entryPoint: "jflex.state.StateSetQuickcheck.complementElements(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
53+
# - name: StateSetQuickcheck#complementUnion
54+
# entryPoint: "jflex.state.StateSetQuickcheck.complementUnion(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
5555
- name: StateSetQuickcheck#containsElements
5656
entryPoint: "jflex.state.StateSetQuickcheck.containsElements(Ljflex/state/StateSet;I)V"
57-
- name: StateSetQuickcheck#containsNoElements
58-
entryPoint: "jflex.state.StateSetQuickcheck.containsNoElements(Ljflex/state/StateSet;)V"
59-
- name: StateSetQuickcheck#copy
60-
entryPoint: "jflex.state.StateSetQuickcheck.copy(Ljflex/state/StateSet;)V"
61-
- name: StateSetQuickcheck#copyInto
62-
entryPoint: "jflex.state.StateSetQuickcheck.copyInto(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
63-
- name: StateSetQuickcheck#hashCode
64-
entryPoint: "jflex.state.StateSetQuickcheck.hashCode(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
65-
- name: StateSetQuickcheck#getAndRemoveRemoves
66-
entryPoint: "jflex.state.StateSetQuickcheck.getAndRemoveRemoves(Ljflex/state/StateSet;)V"
67-
- name: StateSetQuickcheck#getAndRemoveIsElement
68-
entryPoint: "jflex.state.StateSetQuickcheck.getAndRemoveIsElement(Ljflex/state/StateSet;)V"
69-
- name: StateSetQuickcheck#getAndRemoveAdd
70-
entryPoint: "jflex.state.StateSetQuickcheck.getAndRemoveAdd(Ljflex/state/StateSet;)V"
71-
- name: StateSetQuickcheck#enumerator
72-
entryPoint: "jflex.state.StateSetQuickcheck.enumerator(Ljflex/state/StateSet;)V"
73-
- name: CharClassesQuickcheck#invariants
74-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.invariants(Ljflex/core/unicode/CharClasses;)V"
75-
- name: CharClassesQuickcheck#maxCharCode
76-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.maxCharCode(Ljflex/core/unicode/CharClasses;)V"
57+
# - name: StateSetQuickcheck#containsNoElements
58+
# entryPoint: "jflex.state.StateSetQuickcheck.containsNoElements(Ljflex/state/StateSet;)V"
59+
# - name: StateSetQuickcheck#copy
60+
# entryPoint: "jflex.state.StateSetQuickcheck.copy(Ljflex/state/StateSet;)V"
61+
# - name: StateSetQuickcheck#copyInto
62+
# entryPoint: "jflex.state.StateSetQuickcheck.copyInto(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
63+
# - name: StateSetQuickcheck#hashCode
64+
# entryPoint: "jflex.state.StateSetQuickcheck.hashCode(Ljflex/state/StateSet;Ljflex/state/StateSet;)V"
65+
# - name: StateSetQuickcheck#getAndRemoveRemoves
66+
# entryPoint: "jflex.state.StateSetQuickcheck.getAndRemoveRemoves(Ljflex/state/StateSet;)V"
67+
# - name: StateSetQuickcheck#getAndRemoveIsElement
68+
# entryPoint: "jflex.state.StateSetQuickcheck.getAndRemoveIsElement(Ljflex/state/StateSet;)V"
69+
# - name: StateSetQuickcheck#getAndRemoveAdd
70+
# entryPoint: "jflex.state.StateSetQuickcheck.getAndRemoveAdd(Ljflex/state/StateSet;)V"
71+
# - name: StateSetQuickcheck#enumerator
72+
# entryPoint: "jflex.state.StateSetQuickcheck.enumerator(Ljflex/state/StateSet;)V"
73+
# - name: CharClassesQuickcheck#invariants
74+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.invariants(Ljflex/core/unicode/CharClasses;)V"
75+
# - name: CharClassesQuickcheck#maxCharCode
76+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.maxCharCode(Ljflex/core/unicode/CharClasses;)V"
7777
- name: CharClassesQuickcheck#addSingle
7878
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSingle(Ljflex/core/unicode/CharClasses;II)V"
7979
- name: CharClassesQuickcheck#addSingleSingleton
8080
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSingleSingleton(Ljflex/core/unicode/CharClasses;I)V"
8181
- name: CharClassesQuickcheck#addSet
8282
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSet(Ljflex/core/unicode/CharClasses;Ljflex/core/unicode/IntCharSet;I)V"
83-
- name: CharClassesQuickcheck#addSetParts
84-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSetParts(Ljflex/core/unicode/CharClasses;Ljflex/core/unicode/IntCharSet;)V"
85-
- name: CharClassesQuickcheck#addSetComplement
86-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSetComplement(Ljflex/core/unicode/CharClasses;Ljflex/core/unicode/IntCharSet;)V"
83+
# - name: CharClassesQuickcheck#addSetParts
84+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSetParts(Ljflex/core/unicode/CharClasses;Ljflex/core/unicode/IntCharSet;)V"
85+
# - name: CharClassesQuickcheck#addSetComplement
86+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addSetComplement(Ljflex/core/unicode/CharClasses;Ljflex/core/unicode/IntCharSet;)V"
8787
- name: CharClassesQuickcheck#addString
8888
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.addString(Ljflex/core/unicode/CharClasses;Ljava/lang/String;IZ)V"
89-
- name: CharClassesQuickcheck#normaliseSingle
90-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.normaliseSingle(Ljflex/core/unicode/CharClasses;I)V"
91-
- name: CharClassesQuickcheck#computeTablesEq
92-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.computeTablesEq(Ljflex/core/unicode/CharClasses;Ljava/util/ArrayList;)V"
93-
- name: CharClassesQuickcheck#getTablesEq
94-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.getTablesEq(Ljflex/core/unicode/CharClasses;Ljava/util/ArrayList;)V"
95-
- name: CharClassesQuickcheck#classCodesUnion
96-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.classCodesUnion(Ljflex/core/unicode/CharClasses;)V"
97-
- name: CharClassesQuickcheck#classCodesCode
98-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.classCodesCode(Ljflex/core/unicode/CharClasses;)V"
99-
- name: CharClassesQuickcheck#classCodesDisjointOrdered
100-
entryPoint: "jflex.core.unicode.CharClassesQuickcheck.classCodesDisjointOrdered(Ljflex/core/unicode/CharClasses;)V"
89+
# - name: CharClassesQuickcheck#normaliseSingle
90+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.normaliseSingle(Ljflex/core/unicode/CharClasses;I)V"
91+
# - name: CharClassesQuickcheck#computeTablesEq
92+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.computeTablesEq(Ljflex/core/unicode/CharClasses;Ljava/util/ArrayList;)V"
93+
# - name: CharClassesQuickcheck#getTablesEq
94+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.getTablesEq(Ljflex/core/unicode/CharClasses;Ljava/util/ArrayList;)V"
95+
# - name: CharClassesQuickcheck#classCodesUnion
96+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.classCodesUnion(Ljflex/core/unicode/CharClasses;)V"
97+
# - name: CharClassesQuickcheck#classCodesCode
98+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.classCodesCode(Ljflex/core/unicode/CharClasses;)V"
99+
# - name: CharClassesQuickcheck#classCodesDisjointOrdered
100+
# entryPoint: "jflex.core.unicode.CharClassesQuickcheck.classCodesDisjointOrdered(Ljflex/core/unicode/CharClasses;)V"
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import os
2+
import datetime
3+
import re
4+
5+
import numpy as np
6+
import pandas as pd
7+
8+
BASE_RESULT_DIR = "artifacts/results/"
9+
PROJECTS = ["jflex", "convex", "mph-table"]
10+
REPORT_NAME = "artifacts/output/rq4.csv"
11+
TEX_REPORT_NAME = "artifacts/output/rq4.tex"
12+
13+
def obtain_stats_directories(results_directory: str) -> list[str]:
14+
directory_tree = [x for x in os.walk(results_directory)] # os.walk returns a tuple with structure (directory, subdirectories, files)
15+
return directory_tree[0][1]
16+
17+
def filter_for_recent_results(project_name: str, stats_directories: list[str]) -> dict[str, str]:
18+
valid_directories = []
19+
project_string = project_name if project_name != "convex" else project_name + "-core" # edge case
20+
if "mph-table-fixed" in stats_directories[0]: # edge case
21+
project_string = "mph-table-fixed"
22+
time_stamps = [datetime.datetime.strptime(x.replace(project_string, "").replace("_", ":").replace("T", " "), "%Y-%m-%d %H:%M:%S.%f")
23+
for x in stats_directories]
24+
time_stamps.sort()
25+
valid_runs = time_stamps[-10:]
26+
for directory in stats_directories:
27+
val = datetime.datetime.strptime(directory.replace(project_string, "").replace("_", ":").replace("T", " "), "%Y-%m-%d %H:%M:%S.%f")
28+
if val in valid_runs:
29+
valid_directories.append(directory)
30+
return valid_directories
31+
32+
def evaluate_directories(project_name: str, results_directory: str, directories: list[str])-> dict[str, dict]:
33+
final_stats = {}
34+
iteration = 1
35+
for directory in directories:
36+
directory_path = results_directory + directory + "/"
37+
directory_tree = [x[2] for x in os.walk(directory_path)]
38+
valid_htmls = [x for x in directory_tree[0] if 'html' in x]
39+
directory_stats = retrieve_time_elapsed(directory_path=directory_path, valid_htmls=valid_htmls)
40+
project_iteration = project_name + " - " + str(iteration)
41+
final_stats[project_iteration] = directory_stats
42+
iteration += 1
43+
return final_stats
44+
45+
def retrieve_time_elapsed(directory_path: str, valid_htmls: list[str]) -> dict[str, str]:
46+
times_elapsed_dict = {}
47+
for html_file in valid_htmls:
48+
property_name = html_file.replace(".html", "").replace("#", "-")
49+
file_path = directory_path + html_file
50+
with open(file_path) as f:
51+
contents = f.read()
52+
time_elapsed_regrex = re.search('Total Time Elapsed: (.+?) seconds', contents)
53+
if time_elapsed_regrex:
54+
time_elapsed = time_elapsed_regrex.group(1)
55+
times_elapsed_dict[property_name] = round(float(time_elapsed), 2)
56+
return times_elapsed_dict
57+
58+
def generate_report_stats(stat_values: dict[str, dict]) -> dict[str, str]:
59+
first_iteration = stat_values[next(iter(stat_values))]
60+
# stage a dictionary to contain an array of times for ea property
61+
property_dict = {}
62+
for key in first_iteration:
63+
property_dict[key] = []
64+
65+
# populate the dictionary with our results
66+
for key, val in stat_values.items():
67+
for prop, time in val.items():
68+
property_array = property_dict.get(prop)
69+
property_array.append(time)
70+
71+
# generate mean, standard deviation and populate our final object
72+
property_stats_dict = {}
73+
for key, val in property_dict.items():
74+
np_array = np.array(val)
75+
mean = round(np_array.mean(), 2)
76+
standard_dev = round(np_array.std(), 2)
77+
property_stats_dict[key] = str(mean) + " \u00B1 " + str(standard_dev)
78+
return property_stats_dict
79+
80+
81+
def generate_project_report(project_name: str, final_stats: dict[str, str], final_fixed_stats: dict[str, str]) -> dict[str, dict]:
82+
final_report_dict = {project_name: final_stats, project_name + "-fixed": final_fixed_stats}
83+
return final_report_dict
84+
85+
86+
def main():
87+
final_report = {}
88+
df_dict = {}
89+
for project_name in PROJECTS:
90+
print("Starting " + project_name)
91+
fixed_project_name = project_name + "-fixed"
92+
results_directory = BASE_RESULT_DIR + project_name + "/"
93+
fixed_results_directory = BASE_RESULT_DIR + fixed_project_name + "/"
94+
# vanilla
95+
stats_directories = obtain_stats_directories(results_directory=results_directory)
96+
evaluated_runs = filter_for_recent_results(project_name=project_name, stats_directories=stats_directories)
97+
raw_stats = evaluate_directories(project_name=project_name, results_directory=results_directory, directories=evaluated_runs)
98+
99+
# fixed
100+
fixed_stats_directories = obtain_stats_directories(results_directory=fixed_results_directory)
101+
evaluated_fixed_runs = filter_for_recent_results(project_name=project_name, stats_directories=fixed_stats_directories)
102+
fixed_raw_stats = evaluate_directories(project_name=fixed_project_name, results_directory=fixed_results_directory, directories=evaluated_fixed_runs)
103+
104+
# obtain mean/st dev
105+
final_stats = generate_report_stats(stat_values=raw_stats)
106+
final_fixed_stats = generate_report_stats(stat_values=fixed_raw_stats)
107+
report = generate_project_report(project_name=project_name, final_stats=final_stats, final_fixed_stats=final_fixed_stats)
108+
df_dict[project_name] = report
109+
final_report.update(report)
110+
print("Completed " + project_name)
111+
112+
for key, val in df_dict.items():
113+
df = pd.DataFrame(val).reset_index()
114+
df.to_csv(path_or_buf="artifacts/output/" + key + "_rq4.csv")
115+
df.style.to_latex(buf="artifacts/output/" + key + "_rq4.tex")
116+
117+
118+
if __name__ == "__main__":
119+
main()
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import sys
2+
import subprocess
3+
4+
JAR_FILE = "target/javacg-0.1-SNAPSHOT-jar-with-dependencies.jar"
5+
6+
def test_properties(project_name: str):
7+
project_graph = project_name + "_graph" if project_name != "convex" else project_name + "-core_graph"
8+
subprocess.run(["java", "-jar", JAR_FILE, "test", "-c",
9+
project_name, "-f", project_graph])
10+
11+
def test_fixed_properties(project_name: str):
12+
project_fixed_name = project_name + "-fixed"
13+
project_graph = project_fixed_name + "_graph" if project_name != "convex" else project_name + "-core-fixed_graph"
14+
subprocess.run(["java", "-jar", JAR_FILE, "test", "-c",
15+
project_fixed_name, "-f", project_graph])
16+
17+
18+
def main():
19+
if not sys.argv[1]:
20+
raise Exception("Must specify project name through command line param!")
21+
project_name = sys.argv[1]
22+
for index in range(10):
23+
test_properties(project_name)
24+
for index in range(10):
25+
test_fixed_properties(project_name)
26+
27+
if __name__ == "__main__":
28+
main()

run_experiment_rq4.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
GEN_STATS="artifacts/experiments/RQ4/generateStats.py"
2+
GEN_RESULTS="artifacts/experiments/RQ4/generateResults.py"
3+
for PROJECT in mph-table convex jflex
4+
do
5+
echo Generating statistics for $PROJECT
6+
python3 $GEN_STATS $PROJECT
7+
done
8+
echo Generating results for projects
9+
python3 $GEN_RESULTS

0 commit comments

Comments
 (0)