-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathInterleavedSearcher.fs
More file actions
50 lines (38 loc) · 2.01 KB
/
InterleavedSearcher.fs
File metadata and controls
50 lines (38 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
namespace VSharp.Interpreter.IL
open System.Linq
type InterleavedSearcher(searchersWithStepCount: (IForwardSearcher * int) list) =
let searchers = seq { while true do yield! searchersWithStepCount |> Seq.collect Enumerable.Repeat }
let searchersEnumerator = searchers.GetEnumerator()
let getCurrentSearcher() =
searchersEnumerator.MoveNext() |> ignore
searchersEnumerator.Current
let init states = for searcher, _ in searchersWithStepCount do searcher.Init states
let pick selectorOpt =
let pickInternal (searcher : IForwardSearcher) =
match selectorOpt with
| Some selector -> searcher.Pick selector
| None -> searcher.Pick()
let currentSearcher = getCurrentSearcher()
match pickInternal currentSearcher with
| Some _ as pickedFromCurrent -> pickedFromCurrent
| None ->
searchersWithStepCount
|> Seq.filter (fun (s, _) -> s <> currentSearcher)
|> Seq.tryPick (fun (s, _) -> pickInternal s)
let update (parent, newStates) =
for searcher, _ in searchersWithStepCount do
searcher.Update(parent, newStates)
let states() = searchersWithStepCount |> Seq.collect (fun (s, _) -> s.States()) |> Seq.distinct
let refresh() = for searcher, _ in searchersWithStepCount do searcher.Refresh()
let reset() = for searcher, _ in searchersWithStepCount do searcher.Reset()
let remove cilState = for searcher, _ in searchersWithStepCount do searcher.Remove cilState
interface IForwardSearcher with
override x.Init states = init states
override x.Pick() = pick None
override x.Pick selector = pick (Some selector)
override x.Update (parent, newStates) = update (parent, newStates)
override x.States() = states()
override x.Refresh() = refresh()
override x.Reset() = reset()
override x.Remove cilState = remove cilState
override x.StatesCount with get() = searchersEnumerator.Current.StatesCount