@@ -6,6 +6,7 @@ import kotlinx.cli.default
66import kotlinx.cli.required
77import org.kotgll.cfg.grammar.readCFGFromTXT
88import org.kotgll.graph.readGraphFromCSV
9+ import org.kotgll.graph.readStartNodesFromCSV
910import org.kotgll.rsm.grammar.readRSMFromTXT
1011import java.io.File
1112import kotlin.system.measureNanoTime
@@ -43,11 +44,18 @@ fun main(args: Array<String>) {
4344 parser
4445 .option(ArgType .Choice <SPPFMode >(), fullName = " sppf" , description = " Sppf mode" )
4546 .default(SPPFMode .ON )
46- val pathToInput by
47+ val pathToGraphs by
4748 parser
4849 .option(
49- ArgType .String , fullName = " inputPath " , description = " Path to folder with graphs" )
50+ ArgType .String , fullName = " graphsPath " , description = " Path to folder with graphs" )
5051 .required()
52+ val pathToStartNodes by
53+ parser
54+ .option(
55+ ArgType .String ,
56+ fullName = " startNodesPath" ,
57+ description = " Path to folder with start nodes for each graph" )
58+ .default(" " )
5159 val pathToGrammar by
5260 parser
5361 .option(
@@ -67,30 +75,46 @@ fun main(args: Array<String>) {
6775 .option(
6876 ArgType .Int , fullName = " benchmarkRounds" , description = " Number of benchmark rounds" )
6977 .default(10 )
78+ val chunkSize by
79+ parser
80+ .option(ArgType .Int , fullName = " chunkSize" , description = " Start nodes chunk size" )
81+ .default(10 )
7082
7183 parser.parse(args)
7284
7385 if (grammarMode == GrammarMode .CFG ) {
7486 if (sppfMode == SPPFMode .ON ) {
75- runCFGWithSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
87+ runCFGWithSPPF(pathToGraphs,
88+ pathToStartNodes, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds, chunkSize)
7689 } else if (sppfMode == SPPFMode .OFF ) {
77- runCFGWithoutSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
90+ runCFGWithoutSPPF(
91+ pathToGraphs,
92+ pathToStartNodes,
93+ pathToGrammar,
94+ pathToOutput,
95+ warmUpRounds,
96+ benchmarksRounds,
97+ chunkSize)
7898 }
7999 } else if (grammarMode == GrammarMode .RSM ) {
80100 if (sppfMode == SPPFMode .ON ) {
81- runRSMWithSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
101+ runRSMWithSPPF(pathToGraphs,
102+ pathToStartNodes, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds, chunkSize)
82103 } else if (sppfMode == SPPFMode .OFF ) {
83- runRSMWithoutSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
104+ runRSMWithoutSPPF(pathToGraphs, pathToStartNodes, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds,
105+ chunkSize)
84106 }
85107 }
86108}
87109
88110fun runCFGWithoutSPPF (
89111 pathToGraphs : String ,
112+ pathToStartNodes : String ,
90113 pathToCFG : String ,
91114 pathToOutput : String ,
92115 warmUpRounds : Int ,
93- benchmarkRounds : Int
116+ benchmarkRounds : Int ,
117+ chunkSize : Int
94118) {
95119 val cfg = readCFGFromTXT(pathToCFG)
96120 val cfgName = File (pathToCFG).nameWithoutExtension
@@ -101,45 +125,58 @@ fun runCFGWithoutSPPF(
101125 val graphName = graphPath.nameWithoutExtension
102126 println (" start:: $graphName " )
103127 val graph = readGraphFromCSV(graphPath.path)
128+ val startNodes = readStartNodesFromCSV(" $pathToStartNodes /$graphName .csv" )
104129
105- val resultPath = getResultPath(pathToOutput, graphName, " cfg " , cfgName, " without_sppf " )
106- File (resultPath).writeText( " " )
130+ for (chunkStart in 0 .. < startNodes.size step chunkSize) {
131+ val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size )
107132
108- for (warmUp in 1 .. warmUpRounds) {
109- var result: HashMap <Int , HashSet <Int >>
110- val elapsed = measureNanoTime {
111- result = org.kotgll.cfg.graphinput.withoutsppf.GLL (cfg, graph).parse()
112- }
113- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
133+ val resultPath = getResultPath(pathToOutput, graphName, " cfg" , cfgName, " without_sppf" )
134+ File (resultPath).writeText(" " )
114135
115- var number = 0
116- result.keys.forEach { key -> number + = result[key]!! .size }
136+ for (warmUp in 1 .. warmUpRounds) {
137+ var result: HashMap <Int , HashSet <Int >>
138+ val elapsed = measureNanoTime {
139+ result =
140+ org.kotgll.cfg.graphinput.withoutsppf
141+ .GLL (cfg, graph.subList(chunkStart, chunkEnd))
142+ .parse()
143+ }
144+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
117145
118- println ( " warmup:: $graphName $cfgName ${ number} $elapsedSeconds " )
119- }
146+ var number = 0
147+ result.keys.forEach { key -> number + = result[key] !! .size }
120148
121- for (benchmarkAttempt in 1 .. benchmarkRounds) {
122- var result: HashMap <Int , HashSet <Int >>
123- val elapsed = measureNanoTime {
124- result = org.kotgll.cfg.graphinput.withoutsppf.GLL (cfg, graph).parse()
149+ println (" warmup:: $graphName $cfgName ${number} $elapsedSeconds " )
125150 }
126- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
127151
128- var number = 0
129- result.keys.forEach { key -> number + = result[key]!! .size }
130-
131- println (" benchmark:: $graphName $cfgName ${number} $elapsedSeconds " )
132- File (resultPath).appendText(elapsed.toString() + " \n " )
152+ for (benchmarkAttempt in 1 .. benchmarkRounds) {
153+ var result: HashMap <Int , HashSet <Int >>
154+ val elapsed = measureNanoTime {
155+ result =
156+ org.kotgll.cfg.graphinput.withoutsppf
157+ .GLL (cfg, graph.subList(chunkStart, chunkEnd))
158+ .parse()
159+ }
160+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
161+
162+ var number = 0
163+ result.keys.forEach { key -> number + = result[key]!! .size }
164+
165+ println (" benchmark:: $graphName $cfgName ${number} $elapsedSeconds " )
166+ File (resultPath).appendText(elapsed.toString() + " \n " )
167+ }
133168 }
134169 }
135170}
136171
137172fun runCFGWithSPPF (
138- pathToGraphs : String ,
139- pathToCFG : String ,
140- pathToOutput : String ,
141- warmUpRounds : Int ,
142- benchmarkRounds : Int
173+ pathToGraphs : String ,
174+ pathToStartNodes : String ,
175+ pathToCFG : String ,
176+ pathToOutput : String ,
177+ warmUpRounds : Int ,
178+ benchmarkRounds : Int ,
179+ chunkSize : Int
143180) {
144181 val cfg = readCFGFromTXT(pathToCFG)
145182 val cfgName = File (pathToCFG).nameWithoutExtension
@@ -150,45 +187,52 @@ fun runCFGWithSPPF(
150187 val graphName = graphPath.nameWithoutExtension
151188 println (" start:: $graphName " )
152189 val graph = readGraphFromCSV(graphPath.path)
190+ val startNodes = readStartNodesFromCSV(" $pathToStartNodes /$graphName .csv" )
153191
154- val resultPath = getResultPath(pathToOutput, graphName, " cfg " , cfgName, " with_sppf " )
155- File (resultPath).writeText( " " )
192+ for (chunkStart in 0 .. < startNodes.size step chunkSize) {
193+ val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size )
156194
157- for (warmUp in 1 .. warmUpRounds) {
158- var result: HashMap <Int , HashMap <Int , org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode >>
159- val elapsed = measureNanoTime {
160- result = org.kotgll.cfg.graphinput.withsppf.GLL (cfg, graph).parse()
161- }
162- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
195+ val resultPath = getResultPath(pathToOutput, graphName, " cfg" , cfgName, " with_sppf" )
196+ File (resultPath).writeText(" " )
163197
164- var number = 0
165- result.keys.forEach { key -> number + = result[key]!! .keys.size }
198+ for (warmUp in 1 .. warmUpRounds) {
199+ var result: HashMap <Int , HashMap <Int , org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode >>
200+ val elapsed = measureNanoTime {
201+ result = org.kotgll.cfg.graphinput.withsppf.GLL (cfg, graph.subList(chunkStart, chunkEnd)).parse()
202+ }
203+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
166204
167- println ( " warmup:: $graphName $cfgName ${ number} $elapsedSeconds " )
168- }
205+ var number = 0
206+ result.keys.forEach { key -> number + = result[key] !! .keys.size }
169207
170- for (benchmarkAttempt in 1 .. benchmarkRounds) {
171- var result: HashMap <Int , HashMap <Int , org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode >>
172- val elapsed = measureNanoTime {
173- result = org.kotgll.cfg.graphinput.withsppf.GLL (cfg, graph).parse()
174- }
175- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
208+ println (" warmup:: $graphName $cfgName ${number} $elapsedSeconds " )
209+ }
176210
177- var number = 0
178- result.keys.forEach { key -> number + = result[key]!! .keys.size }
211+ for (benchmarkAttempt in 1 .. benchmarkRounds) {
212+ var result: HashMap <Int , HashMap <Int , org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode >>
213+ val elapsed = measureNanoTime {
214+ result = org.kotgll.cfg.graphinput.withsppf.GLL (cfg, graph.subList(chunkStart, chunkEnd)).parse()
215+ }
216+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
179217
180- println (" benchmark:: $graphName $cfgName ${number} $elapsedSeconds " )
181- File (resultPath).appendText(elapsed.toString() + " \n " )
182- }
218+ var number = 0
219+ result.keys.forEach { key -> number + = result[key]!! .keys.size }
220+
221+ println (" benchmark:: $graphName $cfgName ${number} $elapsedSeconds " )
222+ File (resultPath).appendText(elapsed.toString() + " \n " )
223+ }
224+ }
183225 }
184226}
185227
186228fun runRSMWithoutSPPF (
187229 pathToGraphs : String ,
230+ pathToStartNodes : String ,
188231 pathToRSM : String ,
189232 pathToOutput : String ,
190233 warmUpRounds : Int ,
191- benchmarkRounds : Int
234+ benchmarkRounds : Int ,
235+ chunkSize : Int ,
192236) {
193237 val rsm = readRSMFromTXT(pathToRSM)
194238 val rsmName = File (pathToRSM).nameWithoutExtension
@@ -199,45 +243,52 @@ fun runRSMWithoutSPPF(
199243 val graphName = graphPath.nameWithoutExtension
200244 println (" start:: $graphName " )
201245 val graph = readGraphFromCSV(graphPath.path)
246+ val startNodes = readStartNodesFromCSV(" $pathToStartNodes /$graphName .csv" )
202247
203- val resultPath = getResultPath(pathToOutput, graphName, " rsm " , rsmName, " without_sppf " )
204- File (resultPath).writeText( " " )
248+ for (chunkStart in 0 .. < startNodes.size step chunkSize) {
249+ val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size )
205250
206- for (warmUp in 1 .. warmUpRounds) {
207- var result: HashMap <Int , HashSet <Int >>
208- val elapsed = measureNanoTime {
209- result = org.kotgll.rsm.graphinput.withoutsppf.GLL (rsm, graph).parse()
210- }
211- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
251+ val resultPath = getResultPath(pathToOutput, graphName, " rsm" , rsmName, " without_sppf" )
252+ File (resultPath).writeText(" " )
212253
213- var number = 0
214- result.keys.forEach { key -> number + = result[key]!! .size }
254+ for (warmUp in 1 .. warmUpRounds) {
255+ var result: HashMap <Int , HashSet <Int >>
256+ val elapsed = measureNanoTime {
257+ result = org.kotgll.rsm.graphinput.withoutsppf.GLL (rsm, graph.subList(chunkStart, chunkEnd)).parse()
258+ }
259+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
215260
216- println ( " warmup:: $graphName $rsmName ${ number} $elapsedSeconds " )
217- }
261+ var number = 0
262+ result.keys.forEach { key -> number + = result[key] !! .size }
218263
219- for (benchmarkAttempt in 1 .. benchmarkRounds) {
220- var result: HashMap <Int , HashSet <Int >>
221- val elapsed = measureNanoTime {
222- result = org.kotgll.rsm.graphinput.withoutsppf.GLL (rsm, graph).parse()
264+ println (" warmup:: $graphName $rsmName ${number} $elapsedSeconds " )
223265 }
224- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
225266
226- var number = 0
227- result.keys.forEach { key -> number + = result[key]!! .size }
267+ for (benchmarkAttempt in 1 .. benchmarkRounds) {
268+ var result: HashMap <Int , HashSet <Int >>
269+ val elapsed = measureNanoTime {
270+ result = org.kotgll.rsm.graphinput.withoutsppf.GLL (rsm, graph.subList(chunkStart, chunkEnd)).parse()
271+ }
272+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
228273
229- println (" benchmark:: $graphName $rsmName ${number} $elapsedSeconds " )
230- File (resultPath).appendText(elapsed.toString() + " \n " )
274+ var number = 0
275+ result.keys.forEach { key -> number + = result[key]!! .size }
276+
277+ println (" benchmark:: $graphName $rsmName ${number} $elapsedSeconds " )
278+ File (resultPath).appendText(elapsed.toString() + " \n " )
279+ }
231280 }
232281 }
233282}
234283
235284fun runRSMWithSPPF (
236- pathToGraphs : String ,
237- pathToRSM : String ,
238- pathToOutput : String ,
239- warmUpRounds : Int ,
240- benchmarkRounds : Int
285+ pathToGraphs : String ,
286+ pathToStartNodes : String ,
287+ pathToRSM : String ,
288+ pathToOutput : String ,
289+ warmUpRounds : Int ,
290+ benchmarkRounds : Int ,
291+ chunkSize : Int ,
241292) {
242293 val rsm = readRSMFromTXT(pathToRSM)
243294 val rsmName = File (pathToRSM).nameWithoutExtension
@@ -248,35 +299,40 @@ fun runRSMWithSPPF(
248299 val graphName = graphPath.nameWithoutExtension
249300 println (" start:: $graphName " )
250301 val graph = readGraphFromCSV(graphPath.path)
302+ val startNodes = readStartNodesFromCSV(" $pathToStartNodes /$graphName .csv" )
251303
252- val resultPath = getResultPath(pathToOutput, graphName, " rsm " , rsmName, " with_sppf " )
253- File (resultPath).writeText( " " )
304+ for (chunkStart in 0 .. < startNodes.size step chunkSize) {
305+ val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size )
254306
255- for (warmUp in 1 .. warmUpRounds) {
256- var result: HashMap <Int , HashMap <Int , org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode >>
257- val elapsed = measureNanoTime {
258- result = org.kotgll.rsm.graphinput.withsppf.GLL (rsm, graph).parse()
259- }
260- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
307+ val resultPath = getResultPath(pathToOutput, graphName, " rsm" , rsmName, " with_sppf" )
308+ File (resultPath).writeText(" " )
261309
262- var number = 0
263- result.keys.forEach { key -> number + = result[key]!! .keys.size }
310+ for (warmUp in 1 .. warmUpRounds) {
311+ var result: HashMap <Int , HashMap <Int , org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode >>
312+ val elapsed = measureNanoTime {
313+ result = org.kotgll.rsm.graphinput.withsppf.GLL (rsm, graph.subList(chunkStart, chunkEnd)).parse()
314+ }
315+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
264316
265- println ( " warmup:: $graphName $rsmName ${ number} $elapsedSeconds " )
266- }
317+ var number = 0
318+ result.keys.forEach { key -> number + = result[key] !! .keys.size }
267319
268- for (benchmarkAttempt in 1 .. benchmarkRounds) {
269- var result: HashMap <Int , HashMap <Int , org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode >>
270- val elapsed = measureNanoTime {
271- result = org.kotgll.rsm.graphinput.withsppf.GLL (rsm, graph).parse()
272- }
273- val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
320+ println (" warmup:: $graphName $rsmName ${number} $elapsedSeconds " )
321+ }
274322
275- var number = 0
276- result.keys.forEach { key -> number + = result[key]!! .keys.size }
323+ for (benchmarkAttempt in 1 .. benchmarkRounds) {
324+ var result: HashMap <Int , HashMap <Int , org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode >>
325+ val elapsed = measureNanoTime {
326+ result = org.kotgll.rsm.graphinput.withsppf.GLL (rsm, graph.subList(chunkStart, chunkEnd)).parse()
327+ }
328+ val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
277329
278- println (" benchmark:: $graphName $rsmName ${number} $elapsedSeconds " )
279- File (resultPath).appendText(elapsed.toString() + " \n " )
280- }
330+ var number = 0
331+ result.keys.forEach { key -> number + = result[key]!! .keys.size }
332+
333+ println (" benchmark:: $graphName $rsmName ${number} $elapsedSeconds " )
334+ File (resultPath).appendText(elapsed.toString() + " \n " )
335+ }
336+ }
281337 }
282338}
0 commit comments