11open System.Collections .Generic
2+ open System.Xml .Schema
23open Argu
34open CFPQ_GLL
45open CFPQ_GLL.GLL
@@ -23,6 +24,7 @@ type ArgQuery =
2324 | Geo = 2
2425 | Andersen = 3
2526 | Java = 4
27+ | VSharp = 5
2628
2729type Arguments =
2830 | [<Mandatory>] Graph of string
@@ -116,7 +118,7 @@ let example10_go_hierarchy () =
116118 let nodes = loadNodesFormCSV " /home/gsv/Downloads/go_hierarchy_nodes.csv"
117119 nodes
118120 |> Array.iter ( fun n ->
119- let reachable = GLL.eval graph [| n|] g1
121+ let reachable = GLL.eval graph ( HashSet [| n|]) g1
120122 printfn $" Reachable: %A {reachable}" )
121123
122124type LoadStorePairsInfo =
@@ -131,6 +133,80 @@ type LoadStorePairsInfo =
131133 StoreTerminalId = fst storeTerminalInfo
132134 StoreTerminalReversedId = snd storeTerminalInfo
133135 }
136+
137+ let vSharRSM maxCallSymbol =
138+ let firstFreeCallTerminalId = maxCallSymbol + 1 < terminalSymbol>
139+ let terminalForCFGEdge = 0 < terminalSymbol>
140+ let startBox =
141+ RSMBox(
142+ 0 < rsmState>,
143+ HashSet [| 0 < rsmState>; 1 < rsmState>|],
144+ [|
145+ yield RSMEdges.NonTerminalEdge( 0 < rsmState>, 2 < rsmState>, 1 < rsmState>)
146+ for callSymbol in 2 < terminalSymbol> .. 2 < terminalSymbol> .. firstFreeCallTerminalId - 1 < terminalSymbol> do
147+ yield RSMEdges.TerminalEdge( 1 < rsmState>, callSymbol, 0 < rsmState>)
148+ |]
149+ )
150+ let balancedBracketsBox =
151+ let mutable firstFreeRsmState = 3 < rsmState>
152+ RSMBox(
153+ 2 < rsmState>,
154+ HashSet [| 2 < rsmState>|],
155+ [|
156+ yield RSMEdges.TerminalEdge ( 2 < rsmState>, terminalForCFGEdge, 2 < rsmState>)
157+ for callSymbol in 1 < terminalSymbol> .. 2 < terminalSymbol> .. firstFreeCallTerminalId - 1 < terminalSymbol> do
158+ yield RSMEdges.TerminalEdge( 2 < rsmState>, callSymbol, firstFreeRsmState)
159+ yield RSMEdges.NonTerminalEdge( firstFreeRsmState, 2 < rsmState>, firstFreeRsmState + 1 < rsmState>)
160+ yield RSMEdges.TerminalEdge( firstFreeRsmState + 1 < rsmState>, callSymbol + 1 < terminalSymbol>, 2 < rsmState>)
161+ firstFreeRsmState <- firstFreeRsmState + 2 < rsmState>
162+ |])
163+ (* let startBox =
164+ RSMBox(
165+ 0<rsmState>,
166+ HashSet [|0<rsmState>|],
167+ [|
168+ yield RSMEdges.TerminalEdge(0<rsmState>, terminalForCFGEdge, 0<rsmState>)
169+ yield RSMEdges.NonTerminalEdge(0<rsmState>, 1<rsmState>, 0<rsmState>)
170+ //for callSymbol in 1<terminalSymbol> .. 2<terminalSymbol> .. firstFreeCallTerminalId - 1<terminalSymbol> do
171+ for callSymbol in 2<terminalSymbol> .. 2<terminalSymbol> .. firstFreeCallTerminalId - 1<terminalSymbol> do
172+ yield RSMEdges.TerminalEdge(0<rsmState>, callSymbol, 0<rsmState>)
173+ |]
174+ )
175+ let balancedBracketsBox =
176+ let mutable firstFreeRsmState = 3<rsmState>
177+ RSMBox(
178+ 1<rsmState>,
179+ HashSet [|1<rsmState>; 2<rsmState>|],
180+ [|
181+ for callSymbol in 1<terminalSymbol> .. 2<terminalSymbol> .. firstFreeCallTerminalId - 1<terminalSymbol> do
182+ yield RSMEdges.TerminalEdge(1<rsmState>, callSymbol, firstFreeRsmState)
183+ yield RSMEdges.NonTerminalEdge(firstFreeRsmState, 0<rsmState>, firstFreeRsmState + 1<rsmState>)
184+ yield RSMEdges.TerminalEdge(firstFreeRsmState + 1<rsmState>, callSymbol + 1<terminalSymbol>, 2<rsmState>)
185+ yield RSMEdges.TerminalEdge(firstFreeRsmState, terminalForCFGEdge, firstFreeRsmState)
186+ yield RSMEdges.TerminalEdge(firstFreeRsmState + 1<rsmState>, terminalForCFGEdge, firstFreeRsmState + 1<rsmState>)
187+ firstFreeRsmState <- firstFreeRsmState + 2<rsmState>
188+ |])
189+ *)
190+ RSM([| startBox; balancedBracketsBox|], startBox)
191+
192+ let loadVSharpGraphFromCSV filePath =
193+ let mutable maxTerminal = 0 < terminalSymbol>
194+ let edges = ResizeArray<_>()
195+ System.IO.File.ReadLines filePath
196+ |> Seq.map ( fun s -> s.Split " " )
197+ |> Seq.iter ( fun a ->
198+ let terminal = int a.[ 2 ] * 1 < terminalSymbol>
199+
200+ if terminal > maxTerminal then maxTerminal <- terminal
201+
202+ edges.Add ( Tests.InputGraph.TerminalEdge( a.[ 0 ] |> int |> LanguagePrimitives.Int32WithMeasure
203+ , terminal
204+ , a.[ 1 ] |> int |> LanguagePrimitives.Int32WithMeasure))
205+
206+ )
207+ InputGraph <| edges.ToArray()
208+ , maxTerminal
209+
134210let javaRsm ( terminalSymbolsMapping : SortedDictionary < string , _ >) =
135211
136212 let alloc = fst terminalSymbolsMapping.[ " alloc" ]
@@ -197,7 +273,7 @@ let javaRsm (terminalSymbolsMapping:SortedDictionary<string,_>) =
197273let runAllPairs parallelBlocks ( graph : InputGraph ) q mode =
198274 let start = System.DateTime.Now
199275 match parallelBlocks with
200- | None -> eval graph ( graph.AllVertices()) q mode
276+ | None -> eval graph ( HashSet ( graph.AllVertices() )) q mode
201277 | Some blockSize -> evalParallel blockSize graph ( graph.AllVertices()) q mode
202278 |> ignore
203279 printfn $" Total processing time: %A {(System.DateTime.Now - start).TotalMilliseconds} milliseconds"
@@ -216,16 +292,16 @@ let singleSourceForAllContinuously (graph:InputGraph) q mode =
216292 startVertices
217293 |> Array.iter ( fun v -> d.Add( v, HashSet<_>()))
218294 d
219- let res , newGss = evalFromState reachableVertices gss matchedRanges graph startVertices q mode
220- gss <- newGss
295+ let res = evalFromState reachableVertices gss matchedRanges graph ( HashSet startVertices) q mode
221296 match res with
222297 | QueryResult.MatchedRanges ranges -> matchedRanges <- ranges
223298 | _ -> ()
224299
225300let singleSourceForAll ( graph : InputGraph ) q mode =
226301 for n in graph.AllVertices() do
227- let startVertices = [| n|]
228- eval graph startVertices q mode |> ignore
302+ let startVertices = HashSet [| n|]
303+ let res = eval graph startVertices q mode |> ignore
304+ printfn $" %A {res}"
229305
230306[<EntryPoint>]
231307let main argv =
@@ -240,6 +316,9 @@ let main argv =
240316 | ArgQuery.Java ->
241317 let graph , mapping = loadJavaGraphFromCSV ( args.GetResult Graph)
242318 graph, javaRsm mapping
319+ | ArgQuery.VSharp ->
320+ let graph , maxTerminal = loadVSharpGraphFromCSV ( args.GetResult Graph)
321+ graph, vSharRSM maxTerminal
243322 | x -> failwithf $" Unexpected query: %A {x}."
244323
245324 printfn " Data loaded."
0 commit comments