summaryrefslogtreecommitdiff
path: root/Assignment2/src/DTMC.icl
diff options
context:
space:
mode:
authorCamil Staps2018-07-05 13:27:14 +0200
committerCamil Staps2018-07-05 13:29:28 +0200
commitfe72c41c75c3e4abd62b29b3e86b3d72590faf94 (patch)
tree7bcd66414df45b1ba31542153f4f7f7a25f42c3e /Assignment2/src/DTMC.icl
parentBootstrap report (diff)
Add DTMC parser
Diffstat (limited to 'Assignment2/src/DTMC.icl')
-rw-r--r--Assignment2/src/DTMC.icl51
1 files changed, 51 insertions, 0 deletions
diff --git a/Assignment2/src/DTMC.icl b/Assignment2/src/DTMC.icl
new file mode 100644
index 0000000..7c712e0
--- /dev/null
+++ b/Assignment2/src/DTMC.icl
@@ -0,0 +1,51 @@
+implementation module DTMC
+
+import StdArray
+import StdClass
+import StdFile
+import StdInt
+import StdList
+import StdString
+
+import Data.Error
+from Data.Func import $
+import System.File
+import System.FilePath
+import Text
+
+parseDTMC :: !FilePath !*World -> *(!DTMC, !*World)
+parseDTMC fp w
+# (lines,w) = readFileLines fp w
+= (parseDTMCFromLines [s % (0,size s-2) \\ s <- fromOk lines], w)
+
+parseDTMCFromLines :: ![String] -> DTMC
+parseDTMCFromLines lines
+# [nr_states:_:lines] = tl $ dropWhile ((<>) "@nr_states") lines
+# states = map parseState $ groupLines "\t" [] lines
+=
+ { nr_states = toInt nr_states
+ , states = {s \\ s <- states}
+ }
+where
+ parseState :: ![String] -> State
+ parseState [head:actions] =
+ { actions = map parseAction $ groupLines "\t\t" [] actions
+ , init = endsWith "init" head
+ }
+ where
+ parseAction :: ![String] -> Action
+ parseAction [head:transitions] =
+ { action_id = toInt (head % (8, size head-1))
+ , transitions = map parseTransition transitions
+ }
+ where
+ parseTransition :: !String -> Transition
+ parseTransition s = case split " : " (trim s) of
+ [id:prob:_] -> {to_state=toInt id, probability=prob}
+
+ groupLines :: !String ![String] ![String] -> [[String]]
+ groupLines head current [] = [reverse current]
+ groupLines head current [line:lines]
+ | startsWith head line = groupLines head [line:current] lines
+ | isEmpty current = groupLines head [line] lines
+ | otherwise = [reverse current:groupLines head [line] lines]