never executed always true always false
1 {-# LANGUAGE DuplicateRecordFields #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 {-# LANGUAGE NoMonomorphismRestriction #-}
4
5 {-# OPTIONS -fno-warn-orphans #-}
6
7 module NITTA.Model.Problems.ViewHelper (
8 DecisionView (..),
9 IntervalView (..),
10 ) where
11
12 import Data.Aeson
13 import Data.Bifunctor (Bifunctor (bimap))
14 import Data.HashMap.Strict qualified as HM
15 import Data.Map.Strict qualified as M
16 import Data.Set qualified as S
17 import Data.Text qualified as T
18 import GHC.Generics
19 import NITTA.Intermediate.Types
20 import NITTA.Model.Problems
21 import NITTA.Model.ProcessorUnits
22 import NITTA.UIBackend.ViewHelperCls
23 import NITTA.Utils
24 import Numeric.Interval.NonEmpty
25
26 newtype IntervalView = IntervalView T.Text
27 deriving (Generic)
28
29 instance Time t => Viewable (Interval t) IntervalView where
30 view = IntervalView . T.replace (showText (maxBound :: t)) "INF" . showText
31
32 instance ToJSON IntervalView
33
34 data DecisionView
35 = RootView
36 | SingleBindView
37 { function :: FView
38 , pu :: T.Text
39 }
40 | GroupBindView
41 { bindGroup :: HM.HashMap T.Text [FView]
42 }
43 | AllocationView
44 { networkTag :: T.Text
45 , processUnitTag :: T.Text
46 }
47 | DataflowDecisionView
48 { source :: (T.Text, EndpointSt T.Text (Interval Int))
49 , targets :: [(T.Text, EndpointSt T.Text (Interval Int))]
50 }
51 | BreakLoopView
52 { value :: T.Text
53 , outputs :: [T.Text]
54 , input :: T.Text
55 }
56 | ConstantFoldingView
57 { cRefOld :: [FView]
58 , cRefNew :: [FView]
59 }
60 | OptimizeAccumView
61 { old :: [FView]
62 , new :: [FView]
63 }
64 | OptimizeLogicalUnitView
65 { lOld :: [FView]
66 , lNew :: [FView]
67 }
68 | ResolveDeadlockView
69 { newBuffer :: T.Text
70 , changeset :: T.Text
71 }
72 deriving (Generic)
73
74 instance UnitTag tag => Viewable (Bind tag v x) DecisionView where
75 view (SingleBind uTag f) =
76 SingleBindView
77 { function = view f
78 , pu = toText uTag
79 }
80 view GroupBind{bindGroup} = GroupBindView $ HM.fromList $ map (bimap toText (map view)) $ M.assocs bindGroup
81
82 instance UnitTag tag => Viewable (Allocation tag) DecisionView where
83 view Allocation{networkTag, processUnitTag} =
84 AllocationView
85 { networkTag = toText networkTag
86 , processUnitTag = toText processUnitTag
87 }
88
89 instance (UnitTag tag, Var v, Time t) => Viewable (DataflowSt tag v (Interval t)) DecisionView where
90 view DataflowSt{dfSource, dfTargets} =
91 DataflowDecisionView
92 { source = view' dfSource
93 , targets = map view' dfTargets
94 }
95 where
96 view' = bimap toText epdView
97 epdView EndpointSt{epRole, epAt} =
98 EndpointSt
99 { epRole = case epRole of
100 Source vs -> Source $ S.map toText vs
101 Target v -> Target $ toText v
102 , epAt = fromEnum (sup epAt) ... fromEnum (inf epAt)
103 }
104
105 instance (Var v, Val x) => Viewable (BreakLoop v x) DecisionView where
106 view BreakLoop{loopX, loopO, loopI} =
107 BreakLoopView
108 { value = showText loopX
109 , outputs = map toText $ S.elems loopO
110 , input = toText loopI
111 }
112
113 instance Viewable (ConstantFolding v x) DecisionView where
114 view ConstantFolding{cRefOld, cRefNew} =
115 ConstantFoldingView
116 { cRefOld = map view cRefOld
117 , cRefNew = map view cRefNew
118 }
119
120 instance Viewable (OptimizeAccum v x) DecisionView where
121 view OptimizeAccum{refOld, refNew} =
122 OptimizeAccumView
123 { old = map view refOld
124 , new = map view refNew
125 }
126
127 instance Viewable (OptimizeLogicalUnit v x) DecisionView where
128 view OptimizeLogicalUnit{rOld, rNew} =
129 OptimizeLogicalUnitView
130 { lOld = map view rOld
131 , lNew = map view rNew
132 }
133 instance Var v => Viewable (ResolveDeadlock v x) DecisionView where
134 view ResolveDeadlock{newBuffer, changeset} =
135 ResolveDeadlockView
136 { newBuffer = showText newBuffer
137 , changeset = showText changeset
138 }
139
140 instance ToJSON DecisionView