From 8d0bee37e44d3136f80dc4a59a155b0518cc6356 Mon Sep 17 00:00:00 2001 From: Valentin Reis Date: Fri, 7 Feb 2020 12:48:00 -0600 Subject: [PATCH 01/40] Completes the Meta-controller draft --- hsnrm/hie.yaml | 1 + hsnrm/nrm/CPD/Integrated.hs | 1 + hsnrm/nrm/LMap/Map.hs | 4 + hsnrm/nrm/NRM/Control.hs | 168 +++++++++++++++++------------- hsnrm/nrm/NRM/Optparse/Client.hs | 1 - hsnrm/nrm/NRM/State.hs | 2 +- hsnrm/nrm/NRM/Types/Controller.hs | 30 ++++-- 7 files changed, 124 insertions(+), 83 deletions(-) create mode 100644 hsnrm/hie.yaml diff --git a/hsnrm/hie.yaml b/hsnrm/hie.yaml new file mode 100644 index 0000000..1ce7589 --- /dev/null +++ b/hsnrm/hie.yaml @@ -0,0 +1 @@ +cradle: {cabal: {component: "lib:nrmlib"}} diff --git a/hsnrm/nrm/CPD/Integrated.hs b/hsnrm/nrm/CPD/Integrated.hs index e569dec..9bbd278 100644 --- a/hsnrm/nrm/CPD/Integrated.hs +++ b/hsnrm/nrm/CPD/Integrated.hs @@ -9,6 +9,7 @@ module CPD.Integrated ( Integrator (..), IntegratorAction (..), + MeasurementState (..), initIntegrator, measureValue, squeeze, diff --git a/hsnrm/nrm/LMap/Map.hs b/hsnrm/nrm/LMap/Map.hs index 12310e4..43212bd 100644 --- a/hsnrm/nrm/LMap/Map.hs +++ b/hsnrm/nrm/LMap/Map.hs @@ -23,6 +23,7 @@ module LMap.Map elems, keys, mapKV, + mapWithKey, filterWithKey, ) where @@ -89,6 +90,9 @@ keys (Map m) = DM.keys (DM.fromList m) map :: (Ord k) => (a -> b) -> Map k a -> Map k b map f (Map m) = DM.map f (DM.fromList m) & DM.toList & fromList +mapWithKey :: (Ord k) => (k -> a -> b) -> Map k a -> Map k b +mapWithKey f (Map m) = DM.mapWithKey f (DM.fromList m) & DM.toList & fromList + filterWithKey :: Ord k => (k -> a -> Bool) -> Map k a -> Map k a filterWithKey kf m = fromDataMap $ DM.filterWithKey kf (toDataMap m) diff --git a/hsnrm/nrm/NRM/Control.hs b/hsnrm/nrm/NRM/Control.hs index b63d33b..852e794 100644 --- a/hsnrm/nrm/NRM/Control.hs +++ b/hsnrm/nrm/NRM/Control.hs @@ -116,84 +116,104 @@ type CStep = ControlM Decision wrappedCStep :: CStep -wrappedCStep ccfg stepObjectives stepConstraints sensors t = do - counter <- use $ field @"referenceMeasurementCounter" - let maxCounter = referenceMeasurementRoundInterval ccfg - if unrefine counter < unrefine maxCounter - then use (field @"bufferedMeasurements") >>= \case - Nothing -> - refine (unrefine counter + 1) & \case - Left _ -> logError "refinement failed in wrappedCStep" >> doNothing - Right value -> do - field @"referenceMeasurementCounter" .= value - cStep ccfg stepObjectives stepConstraints sensors t - Just buffered -> undefined -- feed the buffered objective to the bandit and remove the buffered value. - else undefined -- do the reference measurement - -cStep :: CStep -cStep _ stepObjectives stepConstraints sensors t = do - i <- use (field @"integrator") - refMeasurements <- use (field @"referenceMeasurements") +wrappedCStep cc stepObjectives stepConstraints sensors t = use (field @"integrator" . field @"measured") <&> squeeze t >>= \case Nothing -> doNothing Just (measurements, newMeasured) -> do field @"integrator" . field @"measured" .= newMeasured - let evaluatedObjectives :: [(Double, Maybe Double, Maybe (Interval Double))] - evaluatedObjectives = stepObjectives <&> \(w, v) -> - (w, eval measurements v, evalRange (DM.fromList $ (,0 ... 1) <$> sensors) v) - refinedObjectives :: Maybe [(Double, ZeroOne Double)] - refinedObjectives = - sequence - ( evaluatedObjectives <&> \case - (w, Just v, Just r) -> normalize v (sup r) <&> (w,) - _ -> Nothing - ) - evaluatedConstraints :: [(Interval Double, Maybe Double, Maybe Double)] - evaluatedConstraints = stepConstraints <&> \(interv, c) -> - ( interv, - eval measurements c, - eval (refMeasurements <&> MemBuffer.avgBuffer) c - ) - refinedConstraints :: Maybe [(Interval Double, Double)] - refinedConstraints = - sequence - ( evaluatedConstraints <&> \case - (interv, Just v, Just ref) -> Just (interv, v / ref) - _ -> Nothing - ) - (refinedObjectives, refinedConstraints) & \case - (Just robjs, Just rconstr) -> do - logInfo - ( "aggregated measurement computed with: \n sensors:" - <> show sensors - <> "\n sensor values:" - <> show measurements - <> "\n refined constraints:" - <> show robjs - <> "\n refined objectives:" - <> show rconstr - <> "\n full integrator data structure:" - <> show i - ) - Decision - <$> zoom - (field @"bandit" . _Just) - ( do - g <- liftIO getStdGen - (a, g') <- - get >>= \case - KnapsackConstraints b -> do - let ((a, g'), s') = runState (stepBwCR g ((snd <$> robjs) <> undefined)) b - put (KnapsackConstraints s') - return (a, g') - LagrangeConstraints b -> do - let ((a, g'), s') = runState (stepPFMAB g (hardConstrainedObjective robjs rconstr)) b - put (LagrangeConstraints s') - return (a, g') - liftIO $ setStdGen g' - return a - ) - _ -> logError "objectives/constraints computation returned `Nothing`." >> doNothing + counter <- use $ field @"referenceMeasurementCounter" + mRefActions <- use $ field @"referenceActionList" + bufM <- use (field @"bufferedMeasurements") + let maxCounter = referenceMeasurementRoundInterval cc + let action = stepFromSqueezed stepObjectives stepConstraints sensors + let normalAction = action measurements + refine (unrefine counter + 1) & \case + Left _ -> do + logError "refinement failed in wrappedCStep" + doNothing + Right counterValue -> case mRefActions of + Nothing -> normalAction + Just refActions -> do + field @"referenceMeasurementCounter" .= counterValue + if unrefine counterValue <= unrefine maxCounter + then case bufM of + Nothing -> normalAction + Just buffered -> do + -- we need to conclude this reference measurement mechanism + -- put the measurements that were just done in referenceMeasurements + field @"referenceMeasurements" %= enqueueAll measurements + -- feed the buffered measurement to the bandit + field @"bufferedMeasurements" .= Nothing + action buffered + else do + -- we need to start this reference measurement mechanism: + -- put the current measurements in "bufferedMeasurements" + field @"bufferedMeasurements" ?= measurements + -- take the reference actions + return $ Decision refActions + +stepFromSqueezed :: + [(Double, OExpr)] -> + [(Interval Double, OExpr)] -> + [SensorID] -> + Map SensorID Double -> + ControlM Decision +stepFromSqueezed stepObjectives stepConstraints sensors measurements = do + refMeasurements <- use (field @"referenceMeasurements") + let evaluatedObjectives :: [(Double, Maybe Double, Maybe (Interval Double))] + evaluatedObjectives = stepObjectives <&> \(w, v) -> + (w, eval measurements v, evalRange (DM.fromList $ (,0 ... 1) <$> sensors) v) + refinedObjectives :: Maybe [(Double, ZeroOne Double)] + refinedObjectives = + sequence + ( evaluatedObjectives <&> \case + (w, Just v, Just r) -> normalize v (sup r) <&> (w,) + _ -> Nothing + ) + evaluatedConstraints :: [(Interval Double, Maybe Double, Maybe Double)] + evaluatedConstraints = stepConstraints <&> \(interv, c) -> + ( interv, + eval measurements c, + eval (refMeasurements <&> MemBuffer.avgBuffer) c + ) + refinedConstraints :: Maybe [(Interval Double, Double)] + refinedConstraints = + sequence + ( evaluatedConstraints <&> \case + (interv, Just v, Just ref) -> Just (interv, v / ref) + _ -> Nothing + ) + (refinedObjectives, refinedConstraints) & \case + (Just robjs, Just rconstr) -> do + logInfo + ( "aggregated measurement computed with: \n sensors:" + <> show sensors + <> "\n sensor values:" + <> show measurements + <> "\n refined constraints:" + <> show robjs + <> "\n refined objectives:" + <> show rconstr + ) + Decision + <$> zoom + (field @"bandit" . _Just) + ( do + g <- liftIO getStdGen + (a, g') <- + get >>= \case + KnapsackConstraints b -> do + let ((a, g'), s') = runState (stepBwCR g ((snd <$> robjs) <> undefined)) b + put (KnapsackConstraints s') + return (a, g') + LagrangeConstraints b -> do + let ((a, g'), s') = runState (stepPFMAB g (hardConstrainedObjective robjs rconstr)) b + put (LagrangeConstraints s') + return (a, g') + liftIO $ setStdGen g' + return a + ) + _ -> logError "objectives/constraints computation returned `Nothing`." >> doNothing hardConstrainedObjective :: [(Double, ZeroOne Double)] -> diff --git a/hsnrm/nrm/NRM/Optparse/Client.hs b/hsnrm/nrm/NRM/Optparse/Client.hs index a5d032f..9e1d1c7 100644 --- a/hsnrm/nrm/NRM/Optparse/Client.hs +++ b/hsnrm/nrm/NRM/Optparse/Client.hs @@ -28,7 +28,6 @@ import qualified NRM.Types.Configuration as Cfg import NRM.Types.Manifest import NRM.Types.Messaging.UpstreamReq import NRM.Types.Slice -import qualified NRM.Types.Units as U import Options.Applicative import Protolude hiding (All) import System.Directory diff --git a/hsnrm/nrm/NRM/State.hs b/hsnrm/nrm/NRM/State.hs index baff409..522db3b 100644 --- a/hsnrm/nrm/NRM/State.hs +++ b/hsnrm/nrm/NRM/State.hs @@ -58,7 +58,7 @@ initialState c time = do Just (RAPLDirs rapldirs) -> Protolude.foldl goRAPL packages' (LM.toList rapldirs) Nothing -> packages' return NRMState - { controller = controlCfg c <&> \ccfg -> initialController time (minimumControlInterval ccfg) [], + { controller = controlCfg c <&> \ccfg -> initialController time (minimumControlInterval ccfg) [] Nothing, slices = LM.fromList [], pus = LM.fromList $ (,PU) <$> selectPUIDs hwl, cores = LM.fromList $ (,Core) <$> selectCoreIDs hwl, diff --git a/hsnrm/nrm/NRM/Types/Controller.hs b/hsnrm/nrm/NRM/Types/Controller.hs index 2ade7f7..9bbd44f 100644 --- a/hsnrm/nrm/NRM/Types/Controller.hs +++ b/hsnrm/nrm/NRM/Types/Controller.hs @@ -15,6 +15,7 @@ module NRM.Types.Controller LearnConfig, LagrangeMultiplier (..), initialController, + enqueueAll, ) where @@ -35,7 +36,7 @@ import NRM.Orphans.NonEmpty () import NRM.Orphans.ZeroOne () import NRM.Types.MemBuffer as MemBuffer import NRM.Types.Units -import Protolude +import Protolude hiding (Map) import Refined import Refined.Unsafe @@ -67,21 +68,36 @@ data Controller = Controller { integrator :: C.Integrator, bandit :: Maybe (Learn (Exp3 [V.Action]) (BwCR [V.Action] [ZeroOne Double])), - referenceActionList :: [V.Action], - bufferedMeasurements :: Maybe (LMap.Map SensorID (ZeroOne Double)), - referenceMeasurements :: LMap.Map SensorID (MemBuffer Double), + referenceActionList :: Maybe [V.Action], + bufferedMeasurements :: Maybe (Map SensorID Double), + referenceMeasurements :: Map SensorID (MemBuffer Double), referenceMeasurementCounter :: Refined NonNegative Int } deriving (JSONSchema, A.ToJSON, A.FromJSON) via GenericJSON Controller deriving (Show, Generic, MessagePack, Interpret, Inject) -initialController :: Time -> Time -> [SensorID] -> Controller -initialController time minTime sensorIDs = Controller +enqueueAll :: (Ord k) => Map k a -> Map k (MemBuffer a) -> Map k (MemBuffer a) +enqueueAll m mm = + mapWithKey + ( \k abuffer -> lookup k m & \case + Nothing -> abuffer + Just a -> enqueue a abuffer + ) + mm + +initialController :: + Time -> + Time -> + [SensorID] -> + Maybe [V.Action] -> + Controller +initialController time minTime sensorIDs refActions = Controller { integrator = initIntegrator time minTime sensorIDs, bandit = Nothing, bufferedMeasurements = Nothing, referenceMeasurements = LMap.fromList $ sensorIDs <&> (,MemBuffer.empty), - referenceMeasurementCounter = unsafeRefine 0 + referenceMeasurementCounter = unsafeRefine 0, + referenceActionList = refActions } -- Instances to serialize the bandit state. -- GitLab From fada6eed36c64bfb78c2b34ad31129aea20290b6 Mon Sep 17 00:00:00 2001 From: Valentin Reis Date: Fri, 7 Feb 2020 14:16:20 -0600 Subject: [PATCH 02/40] [feature] Implements reference measurement activation upon existence of constraints --- hsnrm/nrm/NRM/Behavior.hs | 35 ++++++++++++++++++++----------- hsnrm/nrm/NRM/Control.hs | 26 +++++++++++------------ hsnrm/nrm/NRM/State.hs | 2 +- hsnrm/nrm/NRM/Types/Actuator.hs | 1 + hsnrm/nrm/NRM/Types/Controller.hs | 7 ++----- 5 files changed, 40 insertions(+), 31 deletions(-) diff --git a/hsnrm/nrm/NRM/Behavior.hs b/hsnrm/nrm/NRM/Behavior.hs index 1288701..b0cf5af 100644 --- a/hsnrm/nrm/NRM/Behavior.hs +++ b/hsnrm/nrm/NRM/Behavior.hs @@ -36,7 +36,7 @@ import NRM.Control import NRM.Messaging import NRM.Sensors as Sensors import NRM.State -import NRM.Types.Actuator +import NRM.Types.Actuator as A import NRM.Types.Behavior import NRM.Types.Cmd import NRM.Types.CmdID as CmdID @@ -241,17 +241,28 @@ doControl input = do logInfo ("Control input:" <> show input) mccfg & \case Nothing -> return () - Just ccfg -> banditCartesianProductControl ccfg (NRMCPD.toCPD (Just ccfg) st) input >>= \case - DoNothing -> return () - Decision d -> forM_ d $ \(Action actuatorID (CPD.DiscreteDouble discreteValue)) -> - fromCPDKey actuatorID & \case - Nothing -> log "couldn't decode actuatorID" - Just aKey -> - LM.lookup aKey (lenses st) & \case - Nothing -> log "NRM internal error: actuator not found." - Just (ScopedLens l) -> do - liftIO $ go (st ^. l) discreteValue - log $ "NRM controller takes action:" <> show discreteValue <> " for actuator" <> show actuatorID + Just ccfg -> + let cpd = (NRMCPD.toCPD (Just ccfg) st) + mRefActions = + if [] /= (CPD.constraints cpd) + then Just $ + (LM.toList (lenses st) :: [(ActuatorKey, ScopedLens NRMState A.Actuator)]) + <&> \(k, ScopedLens l) -> CPD.Action + { actuatorID = toS k, + actuatorValue = CPD.DiscreteDouble $ st ^. (l . field @"referenceAction") + } + else Nothing + in banditCartesianProductControl ccfg cpd input mRefActions >>= \case + DoNothing -> return () + Decision d -> forM_ d $ \(Action actuatorID (CPD.DiscreteDouble discreteValue)) -> + fromCPDKey actuatorID & \case + Nothing -> log "couldn't decode actuatorID" + Just aKey -> + LM.lookup aKey (lenses st) & \case + Nothing -> log "NRM internal error: actuator not found." + Just (ScopedLens l) -> do + liftIO $ go (st ^. l) discreteValue + log $ "NRM controller takes action:" <> show discreteValue <> " for actuator" <> show actuatorID -- | Downstream event handler. nrmDownstreamEvent :: diff --git a/hsnrm/nrm/NRM/Control.hs b/hsnrm/nrm/NRM/Control.hs index 852e794..bed0b85 100644 --- a/hsnrm/nrm/NRM/Control.hs +++ b/hsnrm/nrm/NRM/Control.hs @@ -43,8 +43,9 @@ banditCartesianProductControl :: ControlCfg -> Problem -> Input -> + Maybe [Action] -> ControlM Decision -banditCartesianProductControl ccfg cpd (Reconfigure t) = do +banditCartesianProductControl ccfg cpd (Reconfigure t) _ = do minTime <- use $ field @"integrator" . field @"minimumControlInterval" field @"integrator" .= initIntegrator t minTime (DM.keys $ sensors cpd) case objectives cpd of @@ -83,8 +84,8 @@ banditCartesianProductControl ccfg cpd (Reconfigure t) = do nonEmpty . cartesianProduct $ DM.toList (actuators cpd) <&> \(actuatorID, a) -> Action actuatorID <$> actions a -banditCartesianProductControl ccfg cpd (NoEvent t) = tryControlStep ccfg cpd t -banditCartesianProductControl ccfg cpd (Event t ms) = do +banditCartesianProductControl ccfg cpd (NoEvent t) mRefActions = tryControlStep ccfg cpd t mRefActions +banditCartesianProductControl ccfg cpd (Event t ms) mRefActions = do forM_ ms $ \(Measurement sensorID sensorValue sensorTime) -> do let s = DM.lookup sensorID (sensors cpd) s & \case @@ -96,36 +97,35 @@ banditCartesianProductControl ccfg cpd (Event t ms) = do tlast delta (measuredM & ix sensorID %~ measureValue (tlast + delta) v) - tryControlStep ccfg cpd t + tryControlStep ccfg cpd t mRefActions tryControlStep :: ControlCfg -> Problem -> Time -> + Maybe [Action] -> ControlM Decision -tryControlStep ccfg cpd t = case objectives cpd of +tryControlStep ccfg cpd t mRefActions = case objectives cpd of [] -> doNothing - os -> wrappedCStep ccfg os (CPD.Core.constraints cpd) (DM.keys $ sensors cpd) t + os -> wrappedCStep ccfg os (CPD.Core.constraints cpd) (DM.keys $ sensors cpd) t mRefActions -type CStep = +wrappedCStep :: ControlCfg -> [(Double, OExpr)] -> [(Interval Double, OExpr)] -> [SensorID] -> Time -> + Maybe [Action] -> ControlM Decision - -wrappedCStep :: CStep -wrappedCStep cc stepObjectives stepConstraints sensors t = +wrappedCStep cc stepObjectives stepConstraints sensors t mRefActions = use (field @"integrator" . field @"measured") <&> squeeze t >>= \case Nothing -> doNothing Just (measurements, newMeasured) -> do field @"integrator" . field @"measured" .= newMeasured counter <- use $ field @"referenceMeasurementCounter" - mRefActions <- use $ field @"referenceActionList" bufM <- use (field @"bufferedMeasurements") let maxCounter = referenceMeasurementRoundInterval cc - let action = stepFromSqueezed stepObjectives stepConstraints sensors + let action = stepFromSqueezed stepObjectives stepConstraints sensors let normalAction = action measurements refine (unrefine counter + 1) & \case Left _ -> do @@ -158,7 +158,7 @@ stepFromSqueezed :: [SensorID] -> Map SensorID Double -> ControlM Decision -stepFromSqueezed stepObjectives stepConstraints sensors measurements = do +stepFromSqueezed stepObjectives stepConstraints sensors measurements = do refMeasurements <- use (field @"referenceMeasurements") let evaluatedObjectives :: [(Double, Maybe Double, Maybe (Interval Double))] evaluatedObjectives = stepObjectives <&> \(w, v) -> diff --git a/hsnrm/nrm/NRM/State.hs b/hsnrm/nrm/NRM/State.hs index 522db3b..baff409 100644 --- a/hsnrm/nrm/NRM/State.hs +++ b/hsnrm/nrm/NRM/State.hs @@ -58,7 +58,7 @@ initialState c time = do Just (RAPLDirs rapldirs) -> Protolude.foldl goRAPL packages' (LM.toList rapldirs) Nothing -> packages' return NRMState - { controller = controlCfg c <&> \ccfg -> initialController time (minimumControlInterval ccfg) [] Nothing, + { controller = controlCfg c <&> \ccfg -> initialController time (minimumControlInterval ccfg) [], slices = LM.fromList [], pus = LM.fromList $ (,PU) <$> selectPUIDs hwl, cores = LM.fromList $ (,Core) <$> selectCoreIDs hwl, diff --git a/hsnrm/nrm/NRM/Types/Actuator.hs b/hsnrm/nrm/NRM/Types/Actuator.hs index f4a951d..03d2a3f 100644 --- a/hsnrm/nrm/NRM/Types/Actuator.hs +++ b/hsnrm/nrm/NRM/Types/Actuator.hs @@ -23,6 +23,7 @@ data Actuator referenceAction :: Double, go :: Double -> IO () } + deriving (Generic) newtype ActuatorKey = RaplKey PackageID deriving (Show, Read, Eq, Ord) diff --git a/hsnrm/nrm/NRM/Types/Controller.hs b/hsnrm/nrm/NRM/Types/Controller.hs index 9bbd44f..90e9541 100644 --- a/hsnrm/nrm/NRM/Types/Controller.hs +++ b/hsnrm/nrm/NRM/Types/Controller.hs @@ -68,7 +68,6 @@ data Controller = Controller { integrator :: C.Integrator, bandit :: Maybe (Learn (Exp3 [V.Action]) (BwCR [V.Action] [ZeroOne Double])), - referenceActionList :: Maybe [V.Action], bufferedMeasurements :: Maybe (Map SensorID Double), referenceMeasurements :: Map SensorID (MemBuffer Double), referenceMeasurementCounter :: Refined NonNegative Int @@ -89,15 +88,13 @@ initialController :: Time -> Time -> [SensorID] -> - Maybe [V.Action] -> Controller -initialController time minTime sensorIDs refActions = Controller +initialController time minTime sensorIDs = Controller { integrator = initIntegrator time minTime sensorIDs, bandit = Nothing, bufferedMeasurements = Nothing, referenceMeasurements = LMap.fromList $ sensorIDs <&> (,MemBuffer.empty), - referenceMeasurementCounter = unsafeRefine 0, - referenceActionList = refActions + referenceMeasurementCounter = unsafeRefine 0 } -- Instances to serialize the bandit state. -- GitLab From 1c10458114c5cbf38bf15b9bdec87d7b7b75fbd2 Mon Sep 17 00:00:00 2001 From: Valentin Reis Date: Fri, 7 Feb 2020 14:18:02 -0600 Subject: [PATCH 03/40] [ci] fixes gitlab-ci file. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de9357b..a455746 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -339,4 +339,4 @@ readthedocs: - nix script: - echo "token=$RTD_TOKEN" - - nix nixpkgs.curl -c curl --fail -X POST -d "token=$RTD_TOKEN" readthedocs.org/api/v2/webhook/hnrm/104604/ + - nix run nixpkgs.curl -c curl --fail -X POST -d "token=$RTD_TOKEN" readthedocs.org/api/v2/webhook/hnrm/104604/ -- GitLab From 84c406290c629b2487dc5399a96a0778e6f3ba29 Mon Sep 17 00:00:00 2001 From: Valentin Reis Date: Fri, 7 Feb 2020 16:04:01 -0600 Subject: [PATCH 04/40] [doc] fixes for doc --- .gitignore | 1 + doc/notebooks/notebooks/configuration.html | 32 +- doc/notebooks/notebooks/tutorial.html | 508 ++++++------- doc/notebooks/notebooks/tutorial.ipynb | 398 ++++------ doc/nrm.so/haddocks/CPD-Core.html | 2 +- doc/nrm.so/haddocks/CPD-Integrated.html | 2 +- doc/nrm.so/haddocks/CPD-Values.html | 2 +- doc/nrm.so/haddocks/HBandit-BwCR.html | 6 +- doc/nrm.so/haddocks/HBandit-Class.html | 2 +- doc/nrm.so/haddocks/HBandit-Exp3.html | 4 +- doc/nrm.so/haddocks/LMap-Map.html | 4 +- .../haddocks/NRM-Classes-Actuators.html | 2 +- .../haddocks/NRM-Classes-Messaging.html | 2 +- doc/nrm.so/haddocks/NRM-Control.html | 2 +- doc/nrm.so/haddocks/NRM-Optparse-Client.html | 2 +- doc/nrm.so/haddocks/NRM-Types-Actuator.html | 2 +- doc/nrm.so/haddocks/NRM-Types-Controller.html | 2 +- doc/nrm.so/haddocks/doc-index-A.html | 2 +- doc/nrm.so/haddocks/doc-index-All.html | 2 +- doc/nrm.so/haddocks/doc-index-D.html | 2 +- doc/nrm.so/haddocks/doc-index-E.html | 2 +- doc/nrm.so/haddocks/doc-index-F.html | 2 +- doc/nrm.so/haddocks/doc-index-L.html | 2 +- doc/nrm.so/haddocks/doc-index-M.html | 2 +- doc/nrm.so/haddocks/doc-index-N.html | 2 +- doc/nrm.so/haddocks/doc-index-R.html | 2 +- doc/nrm.so/haddocks/doc-index-T.html | 2 +- doc/nrm.so/haddocks/hsnrm.haddock | Bin 285818 -> 286452 bytes doc/nrm.so/haddocks/src/CPD.Core.html | 28 +- doc/nrm.so/haddocks/src/CPD.Integrated.html | 213 +++--- doc/nrm.so/haddocks/src/CPD.Text.html | 4 +- doc/nrm.so/haddocks/src/CPD.Utils.html | 48 +- doc/nrm.so/haddocks/src/Codegen.CHeader.html | 20 +- doc/nrm.so/haddocks/src/Codegen.Schema.html | 52 +- doc/nrm.so/haddocks/src/LMap.Map.html | 174 ++--- doc/nrm.so/haddocks/src/LMap.NonEmpty.html | 66 +- doc/nrm.so/haddocks/src/LensMap.Core.html | 80 +- doc/nrm.so/haddocks/src/NRM.Actuators.html | 6 +- doc/nrm.so/haddocks/src/NRM.Behavior.html | 699 +++++++++--------- doc/nrm.so/haddocks/src/NRM.CPD.html | 40 +- .../haddocks/src/NRM.Classes.Actuators.html | 4 +- .../haddocks/src/NRM.Classes.Examples.html | 4 +- .../haddocks/src/NRM.Classes.Messaging.html | 78 +- .../haddocks/src/NRM.Classes.Sensors.html | 4 +- .../haddocks/src/NRM.Classes.Topology.html | 8 +- doc/nrm.so/haddocks/src/NRM.Client.html | 228 +++--- doc/nrm.so/haddocks/src/NRM.Codegen.html | 84 +-- .../src/NRM.Configuration.Examples.html | 2 +- doc/nrm.so/haddocks/src/NRM.Control.html | 368 ++++----- doc/nrm.so/haddocks/src/NRM.Daemon.html | 4 +- doc/nrm.so/haddocks/src/NRM.Export.html | 76 +- .../haddocks/src/NRM.Manifest.Examples.html | 2 +- doc/nrm.so/haddocks/src/NRM.Messaging.html | 10 +- doc/nrm.so/haddocks/src/NRM.Node.Hwloc.html | 10 +- .../haddocks/src/NRM.Node.Sysfs.Internal.html | 92 +-- doc/nrm.so/haddocks/src/NRM.Node.Sysfs.html | 2 +- .../haddocks/src/NRM.Optparse.Client.html | 585 ++++++++------- .../haddocks/src/NRM.Optparse.Daemon.html | 90 +-- doc/nrm.so/haddocks/src/NRM.Optparse.html | 18 +- .../haddocks/src/NRM.Orphans.Dhall.html | 10 +- .../haddocks/src/NRM.Orphans.ExitCode.html | 4 +- .../haddocks/src/NRM.Orphans.NonEmpty.html | 18 +- .../haddocks/src/NRM.Orphans.Refined.html | 26 +- doc/nrm.so/haddocks/src/NRM.Orphans.UUID.html | 8 +- .../haddocks/src/NRM.Orphans.ZeroOne.html | 12 +- doc/nrm.so/haddocks/src/NRM.Processes.html | 2 +- doc/nrm.so/haddocks/src/NRM.Sensors.html | 58 +- doc/nrm.so/haddocks/src/NRM.Slices.Class.html | 36 +- doc/nrm.so/haddocks/src/NRM.Slices.Dummy.html | 66 +- doc/nrm.so/haddocks/src/NRM.State.html | 146 ++-- .../haddocks/src/NRM.Types.Actuator.html | 37 +- .../haddocks/src/NRM.Types.Behavior.html | 30 +- doc/nrm.so/haddocks/src/NRM.Types.Cmd.html | 50 +- doc/nrm.so/haddocks/src/NRM.Types.CmdID.html | 4 +- .../haddocks/src/NRM.Types.Configuration.html | 6 +- .../haddocks/src/NRM.Types.Controller.html | 523 ++++++------- .../src/NRM.Types.DownstreamClient.html | 2 +- .../haddocks/src/NRM.Types.DownstreamCmd.html | 22 +- .../src/NRM.Types.DownstreamCmdID.html | 18 +- .../src/NRM.Types.DownstreamThread.html | 22 +- .../haddocks/src/NRM.Types.Manifest.html | 2 +- .../haddocks/src/NRM.Types.MemBuffer.html | 12 +- .../src/NRM.Types.Messaging.Protocols.html | 4 +- doc/nrm.so/haddocks/src/NRM.Types.NRM.html | 24 +- .../haddocks/src/NRM.Types.Process.html | 10 +- doc/nrm.so/haddocks/src/NRM.Types.Sensor.html | 24 +- doc/nrm.so/haddocks/src/NRM.Types.Slice.html | 16 +- doc/nrm.so/haddocks/src/NRM.Types.State.html | 122 +-- .../src/NRM.Types.Topology.CoreID.html | 4 +- .../haddocks/src/NRM.Types.Topology.PUID.html | 4 +- .../src/NRM.Types.Topology.Package.html | 50 +- .../src/NRM.Types.Topology.PackageID.html | 4 +- doc/nrm.so/haddocks/src/NRM.Types.Units.html | 2 +- .../src/NRM.Types.UpstreamClient.html | 14 +- 94 files changed, 2670 insertions(+), 2814 deletions(-) diff --git a/.gitignore b/.gitignore index ac522f0..93fb7dc 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,4 @@ pynrm/docs/manifest.rst */.ipynb_checkpoints .ipynb_checkpoints **/notebook_cookie_secret +.build* diff --git a/doc/notebooks/notebooks/configuration.html b/doc/notebooks/notebooks/configuration.html index 4dc7436..a93ed4b 100644 --- a/doc/notebooks/notebooks/configuration.html +++ b/doc/notebooks/notebooks/configuration.html @@ -13162,10 +13162,10 @@ div#notebook { -
+
-
- - - - - -
-

Setup

This notebook uses nrm's python library bindings and needs the nrmd daemon in the $PATH.

-

Assuming the project is cloned with submodules updated (and the code unmodified), one needs to run the following from the root of the project before running it:

+

The next cell builds the shared libraries. This should take about a minute on a modern laptop.

-
In [3]:
+
In [2]:
%%capture
@@ -13219,46 +13168,6 @@ var element = $('#998a5903-cc80-4929-b514-303c7d00378f');
 
-
-
- - -
- -
- - - - - -
-
- -
- -
- -
-
-
@@ -13270,7 +13179,7 @@ var element = $('#9b88b56b-2ecd-4095-8e32-cc258241d70f');
-
In [4]:
+
In [3]:
%%bash
@@ -13304,51 +13213,17 @@ Available options:
   -y,--yaml                Assume configuration to be yaml(json is valid yaml)
                            instead of dhall.
   -h,--help                Show this help text
-0 ExitSuccess
 
-
- -
- - - - - -
-
- -
- -
-
-
In [5]:
+
In [4]:
%%bash 
@@ -13419,6 +13294,39 @@ Available options:
 
+
+
+ +
+
+
+
+

Defining experiments

Now that the daemon is properly set-up, we will configure and run some experiments using the python interface.

+ +
+
+
+
+
+
In [5]:
+
+
+
%load_ext nb_black
+import nrm.tooling as nrm
+import time
+import json
+import pandas as pd
+import matplotlib.pyplot as plt
+
+ +
+
+
+ +
+
+ +
@@ -13427,15 +13335,15 @@ Available options: -
+
-
-
+
+
+
In [ ]:
+
+
+
 
+
+
diff --git a/doc/notebooks/notebooks/tutorial.ipynb b/doc/notebooks/notebooks/tutorial.ipynb index 61302fa..9900605 100644 --- a/doc/notebooks/notebooks/tutorial.ipynb +++ b/doc/notebooks/notebooks/tutorial.ipynb @@ -7,106 +7,42 @@ "# NRM python upstream client library tutorial\n", "\n", "This tutorial covers the use of NRM's python upstream client library, in the context of running an external resource management strategy. Its cell's output are deterministic, and the executed version that is vendored in the source tree is checked by the project's CI, so its behavior should always be up-to-date with the latest version of the software, and no cells should be throwing exceptions. \n", - "\n", - "The next few cells are for setup purposes." + "\n" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "%%capture\n", - "cd .." + "## Setup\n", + "\n", + "This notebook uses `nrm`'s python library bindings and needs the `nrmd` daemon in the `$PATH`. \n", + "\n", + "Assuming the project is cloned **with submodules updated** (and the code unmodified), one needs to run the following from the root of the project before running it:" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "\n", - " setTimeout(function() {\n", - " var nbb_cell_id = 2;\n", - " var nbb_unformatted_code = \"%load_ext nb_black\\nimport nrm.tooling as nrm\\nimport time\\nimport json\\nimport pandas as pd\\nimport matplotlib.pyplot as plt\";\n", - " var nbb_formatted_code = \"%load_ext nb_black\\nimport nrm.tooling as nrm\\nimport time\\nimport json\\nimport pandas as pd\\nimport matplotlib.pyplot as plt\";\n", - " var nbb_cells = Jupyter.notebook.get_cells();\n", - " for (var i = 0; i < nbb_cells.length; ++i) {\n", - " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", - " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", - " nbb_cells[i].set_text(nbb_formatted_code);\n", - " }\n", - " break;\n", - " }\n", - " }\n", - " }, 500);\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "%load_ext nb_black\n", - "import nrm.tooling as nrm\n", - "import time\n", - "import json\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt" + "%%capture\n", + "cd .." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Setup\n", - "\n", - "This notebook uses `nrm`'s python library bindings and needs the `nrmd` daemon in the `$PATH`. \n", - "\n", - "Assuming the project is cloned **with submodules updated** (and the code unmodified), one needs to run the following from the root of the project before running it:" + "The next cell builds the shared libraries. This should take about a minute on a modern laptop." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "\n", - " setTimeout(function() {\n", - " var nbb_cell_id = 3;\n", - " var nbb_unformatted_code = \"%%capture\\n%%bash\\n./shake.sh build # for the daemon \\n./shake.sh client # for the upstream client\\n./shake.sh pyclient # for the shared client library\";\n", - " var nbb_formatted_code = \"%%capture\\n%%bash\\n./shake.sh build # for the daemon \\n./shake.sh client # for the upstream client\\n./shake.sh pyclient # for the shared client library\";\n", - " var nbb_cells = Jupyter.notebook.get_cells();\n", - " for (var i = 0; i < nbb_cells.length; ++i) {\n", - " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", - " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", - " nbb_cells[i].set_text(nbb_formatted_code);\n", - " }\n", - " break;\n", - " }\n", - " }\n", - " }, 500);\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%%capture\n", "%%bash\n", @@ -124,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -143,36 +79,8 @@ " extension. Leave void for stdin (dhall) input.\n", " -y,--yaml Assume configuration to be yaml(json is valid yaml)\n", " instead of dhall.\n", - " -h,--help Show this help text\n", - "0 ExitSuccess\n" + " -h,--help Show this help text\n" ] - }, - { - "data": { - "application/javascript": [ - "\n", - " setTimeout(function() {\n", - " var nbb_cell_id = 4;\n", - " var nbb_unformatted_code = \"%%bash\\nnrmd --help\";\n", - " var nbb_formatted_code = \"%%bash\\nnrmd --help\";\n", - " var nbb_cells = Jupyter.notebook.get_cells();\n", - " for (var i = 0; i < nbb_cells.length; ++i) {\n", - " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", - " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", - " nbb_cells[i].set_text(nbb_formatted_code);\n", - " }\n", - " break;\n", - " }\n", - " }\n", - " }, 500);\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -182,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -234,15 +142,38 @@ " --bind_address ADDRESS upstream bind address (default localhost).\n", " -h,--help Show this help text\n" ] - }, + } + ], + "source": [ + "%%bash \n", + "nrm --help\n", + "echo \"\"\n", + "nrm run --help" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining experiments\n", + "\n", + "Now that the daemon is properly set-up, we will configure and run some experiments using the python interface.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { "data": { "application/javascript": [ "\n", " setTimeout(function() {\n", " var nbb_cell_id = 5;\n", - " var nbb_unformatted_code = \"%%bash \\nnrm --help\\necho \\\"\\\"\\nnrm run --help\";\n", - " var nbb_formatted_code = \"%%bash \\nnrm --help\\necho \\\"\\\"\\nnrm run --help\";\n", + " var nbb_unformatted_code = \"%load_ext nb_black\\nimport nrm.tooling as nrm\\nimport time\\nimport json\\nimport pandas as pd\\nimport matplotlib.pyplot as plt\";\n", + " var nbb_formatted_code = \"%load_ext nb_black\\nimport nrm.tooling as nrm\\nimport time\\nimport json\\nimport pandas as pd\\nimport matplotlib.pyplot as plt\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", " for (var i = 0; i < nbb_cells.length; ++i) {\n", " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", @@ -264,26 +195,24 @@ } ], "source": [ - "%%bash \n", - "nrm --help\n", - "echo \"\"\n", - "nrm run --help" + "%load_ext nb_black\n", + "import nrm.tooling as nrm\n", + "import time\n", + "import json\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Defining experiments\n", - "\n", - "Now that the daemon is properly set-up, we will configure and run some experiments using the python interface.\n", - "\n", "This notebook will start `nrmd` on the same machine as the notebok, but the same interface should be available for remote execution:" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -291,7 +220,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 3;\n", + " var nbb_cell_id = 6;\n", " var nbb_unformatted_code = \"host = nrm.Local()\\n# host=Remote( target=\\\"cc@129.114.108.201\\\")\";\n", " var nbb_formatted_code = \"host = nrm.Local()\\n# host=Remote( target=\\\"cc@129.114.108.201\\\")\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -328,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": { "jupyter": { "source_hidden": true @@ -357,7 +286,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 4;\n", + " var nbb_cell_id = 7;\n", " var nbb_unformatted_code = \"import inspect\\n\\nfor a, x in inspect.getmembers(host, predicate=inspect.ismethod):\\n print(\\\"%s: %s\\\" % (a, x.__doc__))\";\n", " var nbb_formatted_code = \"import inspect\\n\\nfor a, x in inspect.getmembers(host, predicate=inspect.ismethod):\\n print(\\\"%s: %s\\\" % (a, x.__doc__))\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -396,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -404,8 +333,8 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 5;\n", - " var nbb_unformatted_code = \"daemonCfgs = {\\n \\\"redirected_log\\\": {\\\"logfile\\\": \\\"/tmp/logfile_experiment2\\\", \\\"verbose\\\": \\\"Info\\\"},\\n # \\\"other\\\":your code\\n}\\n\\nworkloads = {\\n \\\"dummy\\\":[{\\\"cmd\\\":\\\"sleep\\\",\\n \\\"args\\\": [\\\"10\\\"] , # running the sleep command for 10 seconds.\\n \\\"sliceID\\\": \\\"toto\\\",\\n \\\"manifest\\\":{\\n \\\"app\\\": { \\\"slice\\\": {\\n \\\"cpus\\\": 1,\\n \\\"mems\\\": 1 \\n }, \\n \\\"perfwrapper\\\":{\\\"perfLimit\\\":{\\\"fromOps\\\":100000},\\\"perfFreq\\\":{\\\"fromHz\\\":1}}\\n },\\n \\\"name\\\": \\\"perfwrap\\\",\\n }\\n }\\n ],\\n #\\\"other\\\":your code\\n}\";\n", + " var nbb_cell_id = 8;\n", + " var nbb_unformatted_code = \"daemonCfgs = {\\n \\\"redirected_log\\\": {\\\"logfile\\\": \\\"/tmp/logfile_experiment2\\\", \\\"verbose\\\": \\\"Info\\\"},\\n # \\\"other\\\":your code\\n}\\n\\nworkloads = {\\n \\\"dummy\\\": [\\n {\\n \\\"cmd\\\": \\\"sleep\\\",\\n \\\"args\\\": [\\\"10\\\"], # running the sleep command for 10 seconds.\\n \\\"sliceID\\\": \\\"toto\\\",\\n \\\"manifest\\\": {\\n \\\"app\\\": {\\n \\\"slice\\\": {\\\"cpus\\\": 1, \\\"mems\\\": 1},\\n \\\"perfwrapper\\\": {\\n \\\"perfLimit\\\": {\\\"fromOps\\\": 100000},\\n \\\"perfFreq\\\": {\\\"fromHz\\\": 1},\\n },\\n },\\n \\\"name\\\": \\\"perfwrap\\\",\\n },\\n }\\n ],\\n # \\\"other\\\":your code\\n}\";\n", " var nbb_formatted_code = \"daemonCfgs = {\\n \\\"redirected_log\\\": {\\\"logfile\\\": \\\"/tmp/logfile_experiment2\\\", \\\"verbose\\\": \\\"Info\\\"},\\n # \\\"other\\\":your code\\n}\\n\\nworkloads = {\\n \\\"dummy\\\": [\\n {\\n \\\"cmd\\\": \\\"sleep\\\",\\n \\\"args\\\": [\\\"10\\\"], # running the sleep command for 10 seconds.\\n \\\"sliceID\\\": \\\"toto\\\",\\n \\\"manifest\\\": {\\n \\\"app\\\": {\\n \\\"slice\\\": {\\\"cpus\\\": 1, \\\"mems\\\": 1},\\n \\\"perfwrapper\\\": {\\n \\\"perfLimit\\\": {\\\"fromOps\\\": 100000},\\n \\\"perfFreq\\\": {\\\"fromHz\\\": 1},\\n },\\n },\\n \\\"name\\\": \\\"perfwrap\\\",\\n },\\n }\\n ],\\n # \\\"other\\\":your code\\n}\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", " for (var i = 0; i < nbb_cells.length; ++i) {\n", @@ -434,21 +363,24 @@ "}\n", "\n", "workloads = {\n", - " \"dummy\":[{\"cmd\":\"sleep\",\n", - " \"args\": [\"10\"] , # running the sleep command for 10 seconds.\n", - " \"sliceID\": \"toto\",\n", - " \"manifest\":{\n", - " \"app\": { \"slice\": {\n", - " \"cpus\": 1,\n", - " \"mems\": 1 \n", - " }, \n", - " \"perfwrapper\":{\"perfLimit\":{\"fromOps\":100000},\"perfFreq\":{\"fromHz\":1}}\n", - " },\n", - " \"name\": \"perfwrap\",\n", - " }\n", - " }\n", - " ],\n", - " #\"other\":your code\n", + " \"dummy\": [\n", + " {\n", + " \"cmd\": \"sleep\",\n", + " \"args\": [\"10\"], # running the sleep command for 10 seconds.\n", + " \"sliceID\": \"toto\",\n", + " \"manifest\": {\n", + " \"app\": {\n", + " \"slice\": {\"cpus\": 1, \"mems\": 1},\n", + " \"perfwrapper\": {\n", + " \"perfLimit\": {\"fromOps\": 100000},\n", + " \"perfFreq\": {\"fromHz\": 1},\n", + " },\n", + " },\n", + " \"name\": \"perfwrap\",\n", + " },\n", + " }\n", + " ],\n", + " # \"other\":your code\n", "}" ] }, @@ -461,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -469,7 +401,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 6;\n", + " var nbb_cell_id = 9;\n", " var nbb_unformatted_code = \"experiments = {\\n \\\"example\\\": (daemonCfgs[\\\"redirected_log\\\"], workloads[\\\"dummy\\\"]),\\n # \\\"other\\\": your code\\n}\";\n", " var nbb_formatted_code = \"experiments = {\\n \\\"example\\\": (daemonCfgs[\\\"redirected_log\\\"], workloads[\\\"dummy\\\"]),\\n # \\\"other\\\": your code\\n}\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -509,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -525,7 +457,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 7;\n", + " var nbb_cell_id = 10;\n", " var nbb_unformatted_code = \"host.start_daemon(daemonCfgs[\\\"redirected_log\\\"])\\nassert host.check_daemon()\";\n", " var nbb_formatted_code = \"host.start_daemon(daemonCfgs[\\\"redirected_log\\\"])\\nassert host.check_daemon()\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -562,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -602,8 +534,8 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 8;\n", - " var nbb_unformatted_code = \"cpd=host.get_cpd()\\nprint(\\\"Pretty-printing the control problem description:\\\\n %s\\\" % cpd)\\ncpdd = dict(cpd)\\nprint(\\\"Python dictionary version: %s\\\" %cpdd)\";\n", + " var nbb_cell_id = 11;\n", + " var nbb_unformatted_code = \"cpd = host.get_cpd()\\nprint(\\\"Pretty-printing the control problem description:\\\\n %s\\\" % cpd)\\ncpdd = dict(cpd)\\nprint(\\\"Python dictionary version: %s\\\" % cpdd)\";\n", " var nbb_formatted_code = \"cpd = host.get_cpd()\\nprint(\\\"Pretty-printing the control problem description:\\\\n %s\\\" % cpd)\\ncpdd = dict(cpd)\\nprint(\\\"Python dictionary version: %s\\\" % cpdd)\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", " for (var i = 0; i < nbb_cells.length; ++i) {\n", @@ -626,10 +558,10 @@ } ], "source": [ - "cpd=host.get_cpd()\n", + "cpd = host.get_cpd()\n", "print(\"Pretty-printing the control problem description:\\n %s\" % cpd)\n", "cpdd = dict(cpd)\n", - "print(\"Python dictionary version: %s\" %cpdd)" + "print(\"Python dictionary version: %s\" % cpdd)" ] }, { @@ -641,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -651,13 +583,26 @@ "We take the first available action (180000000) for the first actuator (RaplKey (PackageID 0)).\n" ] }, + { + "ename": "Exception", + "evalue": ".so library call raised exception: FatalError {fatalErrorMessage = \"daemon threw exception: /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw: openFile: permission denied (Permission denied)\"}", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mactuator0FirstAction\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactuator0ID\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m )\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mhost\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mworkload_action\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnrm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"RaplKey (PackageID 0)\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2.0e8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/workspace/hnrm/pynrm/nrm/tooling.py\u001b[0m in \u001b[0;36mworkload_action\u001b[0;34m(self, actionList)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;34m\"\"\" Send a message to NRM's upstream API. \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0mactionList\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactuatorID\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactuatorValue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mactionList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 191\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommonOpts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactionList\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 192\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/workspace/hnrm/pynrm/nrm/sharedlib.py\u001b[0m in \u001b[0;36meitherwrap\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSystemError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 57\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\".so library call raised exception: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 58\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0meitherwrap\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mException\u001b[0m: .so library call raised exception: FatalError {fatalErrorMessage = \"daemon threw exception: /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw: openFile: permission denied (Permission denied)\"}" + ] + }, { "data": { "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 9;\n", - " var nbb_unformatted_code = \"actuator0 = cpdd['actuators'][0]\\nactuator0ID = actuator0[0]\\nactuator0FirstAction = actuator0[1][\\\"actions\\\"][0]\\nprint(\\\"We take the first available action (%s) for the first actuator (%s).\\\" %(actuator0FirstAction ,actuator0ID))\\nhost.workload_action([nrm.Action(\\\"RaplKey (PackageID 0)\\\",2.0e8)])\";\n", + " var nbb_cell_id = 12;\n", + " var nbb_unformatted_code = \"actuator0 = cpdd[\\\"actuators\\\"][0]\\nactuator0ID = actuator0[0]\\nactuator0FirstAction = actuator0[1][\\\"actions\\\"][0]\\nprint(\\n \\\"We take the first available action (%s) for the first actuator (%s).\\\"\\n % (actuator0FirstAction, actuator0ID)\\n)\\nhost.workload_action([nrm.Action(\\\"RaplKey (PackageID 0)\\\", 2.0e8)])\";\n", " var nbb_formatted_code = \"actuator0 = cpdd[\\\"actuators\\\"][0]\\nactuator0ID = actuator0[0]\\nactuator0FirstAction = actuator0[1][\\\"actions\\\"][0]\\nprint(\\n \\\"We take the first available action (%s) for the first actuator (%s).\\\"\\n % (actuator0FirstAction, actuator0ID)\\n)\\nhost.workload_action([nrm.Action(\\\"RaplKey (PackageID 0)\\\", 2.0e8)])\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", " for (var i = 0; i < nbb_cells.length; ++i) {\n", @@ -680,11 +625,14 @@ } ], "source": [ - "actuator0 = cpdd['actuators'][0]\n", + "actuator0 = cpdd[\"actuators\"][0]\n", "actuator0ID = actuator0[0]\n", "actuator0FirstAction = actuator0[1][\"actions\"][0]\n", - "print(\"We take the first available action (%s) for the first actuator (%s).\" %(actuator0FirstAction ,actuator0ID))\n", - "host.workload_action([nrm.Action(\"RaplKey (PackageID 0)\",2.0e8)])" + "print(\n", + " \"We take the first available action (%s) for the first actuator (%s).\"\n", + " % (actuator0FirstAction, actuator0ID)\n", + ")\n", + "host.workload_action([nrm.Action(\"RaplKey (PackageID 0)\", 2.0e8)])" ] }, { @@ -696,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -792,7 +740,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 10;\n", + " var nbb_cell_id = 13;\n", " var nbb_unformatted_code = \"s=host.get_state()\\nprint(s)\\nprint(dict(s))\";\n", " var nbb_formatted_code = \"s = host.get_state()\\nprint(s)\\nprint(dict(s))\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -816,7 +764,7 @@ } ], "source": [ - "s=host.get_state()\n", + "s = host.get_state()\n", "print(s)\n", "print(dict(s))" ] @@ -830,7 +778,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -838,7 +786,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 11;\n", + " var nbb_cell_id = 14;\n", " var nbb_unformatted_code = \"host.stop_daemon()\\nassert host.check_daemon() == False\";\n", " var nbb_formatted_code = \"host.stop_daemon()\\nassert host.check_daemon() == False\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -877,7 +825,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -888,29 +836,23 @@ "connected to tcp://localhost:2345\n", "Starting the workload\n", "Sensor identifier list:\n", - "- DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b)\n", "- RaplKey (PackageID 0)\n", "Actuator identifier list:\n", "- RaplKey (PackageID 0)\n", - "Received measurement originating at time 1580142815283332.5 for sensor RaplKey (PackageID 0) of value 65528920136\n", - "Received measurement originating at time 1580142816283626.8 for sensor RaplKey (PackageID 0) of value 65536811961\n", - "Received measurement originating at time 1580142817018380 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142817283471.5 for sensor RaplKey (PackageID 0) of value 65546773239\n", - "Received measurement originating at time 1580142818018595.2 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142818282989.5 for sensor RaplKey (PackageID 0) of value 65555524621\n", - "Received measurement originating at time 1580142819018999.2 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142819283585 for sensor RaplKey (PackageID 0) of value 65564011415\n", - "Received measurement originating at time 1580142820019300 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142820283497.8 for sensor RaplKey (PackageID 0) of value 65574161231\n", - "Received measurement originating at time 1580142821019686.5 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142821283599.5 for sensor RaplKey (PackageID 0) of value 65582606705\n", - "Received measurement originating at time 1580142822020131.2 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142822283586.5 for sensor RaplKey (PackageID 0) of value 65591142022\n", - "Received measurement originating at time 1580142823021169 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142823283595.2 for sensor RaplKey (PackageID 0) of value 65600608062\n", - "Received measurement originating at time 1580142824021145.8 for sensor DownstreamCmdKey (DownstreamCmdID 18c6b005-f7fe-4e05-a2d6-0f15d019906b) of value 0\n", - "Received measurement originating at time 1580142824283436.8 for sensor RaplKey (PackageID 0) of value 65610440801\n", - "Received measurement originating at time 1580142825283122 for sensor RaplKey (PackageID 0) of value 65626178371\n" + "Received measurement originating at time 1580500825712347 for sensor RaplKey (PackageID 0) of value 200341177799\n" + ] + }, + { + "ename": "Exception", + "evalue": ".so library call raised exception: FatalError {fatalErrorMessage = \"daemon threw exception: /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw: openFile: permission denied (Permission denied)\"}", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0mhistory\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0msensorID\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 31\u001b[0;31m \u001b[0mhost\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mworkload_action\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnrm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"RaplKey (PackageID 0)\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1.8e8\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 32\u001b[0m \u001b[0mhost\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcheck_daemon\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/workspace/hnrm/pynrm/nrm/tooling.py\u001b[0m in \u001b[0;36mworkload_action\u001b[0;34m(self, actionList)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;34m\"\"\" Send a message to NRM's upstream API. \"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0mactionList\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactuatorID\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactuatorValue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mactionList\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 191\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommonOpts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactionList\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 192\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/workspace/hnrm/pynrm/nrm/sharedlib.py\u001b[0m in \u001b[0;36meitherwrap\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mSystemError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 57\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\".so library call raised exception: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mcontent\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 58\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0meitherwrap\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mException\u001b[0m: .so library call raised exception: FatalError {fatalErrorMessage = \"daemon threw exception: /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/constraint_0_power_limit_uw: openFile: permission denied (Permission denied)\"}" ] }, { @@ -918,7 +860,7 @@ "application/javascript": [ "\n", " setTimeout(function() {\n", - " var nbb_cell_id = 16;\n", + " var nbb_cell_id = 15;\n", " var nbb_unformatted_code = \"for name, (daemonCfg, workload) in experiments.items():\\n host.start_daemon(daemonCfg)\\n print(\\\"Starting the workload\\\")\\n host.run_workload(workload)\\n history = {}\\n getCPD=True\\n while host.check_daemon() and not host.workload_finished():\\n measurement_message = host.workload_recv()\\n msg=json.loads(measurement_message)\\n #print(\\\"received raw message: %s\\\" %msg)\\n if \\\"pubMeasurements\\\" in msg:\\n if getCPD:\\n getCPD=False\\n time.sleep(1)\\n cpd=dict(host.get_cpd())\\n print(\\\"Sensor identifier list:\\\")\\n for sensorID in [sensor[0] for sensor in cpd[\\\"sensors\\\"]]:\\n print(\\\"- %s\\\" % sensorID)\\n print(\\\"Actuator identifier list:\\\")\\n for sensorID in [sensor[0] for sensor in cpd[\\\"actuators\\\"]]:\\n print(\\\"- %s\\\" % sensorID)\\n content = msg[\\\"pubMeasurements\\\"][1][0]\\n t = content[\\\"time\\\"]\\n sensorID = content[\\\"sensorID\\\"]\\n x = content[\\\"sensorValue\\\"]\\n print(\\\"Received measurement originating at time %s for sensor %s of value %s\\\" % (content[\\\"time\\\"],content[\\\"sensorID\\\"],content[\\\"sensorValue\\\"]))\\n if sensorID in history:\\n history[sensorID].append((t,x))\\n else:\\n history[sensorID]= [(t,x)]\\n host.workload_action([nrm.Action(\\\"RaplKey (PackageID 0)\\\",1.8e8)])\\n host.check_daemon()\\n\\nhost.stop_daemon()\";\n", " var nbb_formatted_code = \"for name, (daemonCfg, workload) in experiments.items():\\n host.start_daemon(daemonCfg)\\n print(\\\"Starting the workload\\\")\\n host.run_workload(workload)\\n history = {}\\n getCPD = True\\n while host.check_daemon() and not host.workload_finished():\\n measurement_message = host.workload_recv()\\n msg = json.loads(measurement_message)\\n # print(\\\"received raw message: %s\\\" %msg)\\n if \\\"pubMeasurements\\\" in msg:\\n if getCPD:\\n getCPD = False\\n time.sleep(1)\\n cpd = dict(host.get_cpd())\\n print(\\\"Sensor identifier list:\\\")\\n for sensorID in [sensor[0] for sensor in cpd[\\\"sensors\\\"]]:\\n print(\\\"- %s\\\" % sensorID)\\n print(\\\"Actuator identifier list:\\\")\\n for sensorID in [sensor[0] for sensor in cpd[\\\"actuators\\\"]]:\\n print(\\\"- %s\\\" % sensorID)\\n content = msg[\\\"pubMeasurements\\\"][1][0]\\n t = content[\\\"time\\\"]\\n sensorID = content[\\\"sensorID\\\"]\\n x = content[\\\"sensorValue\\\"]\\n print(\\n \\\"Received measurement originating at time %s for sensor %s of value %s\\\"\\n % (content[\\\"time\\\"], content[\\\"sensorID\\\"], content[\\\"sensorValue\\\"])\\n )\\n if sensorID in history:\\n history[sensorID].append((t, x))\\n else:\\n history[sensorID] = [(t, x)]\\n host.workload_action([nrm.Action(\\\"RaplKey (PackageID 0)\\\", 1.8e8)])\\n host.check_daemon()\\n\\nhost.stop_daemon()\";\n", " var nbb_cells = Jupyter.notebook.get_cells();\n", @@ -947,16 +889,16 @@ " print(\"Starting the workload\")\n", " host.run_workload(workload)\n", " history = {}\n", - " getCPD=True\n", + " getCPD = True\n", " while host.check_daemon() and not host.workload_finished():\n", " measurement_message = host.workload_recv()\n", - " msg=json.loads(measurement_message)\n", - " #print(\"received raw message: %s\" %msg)\n", + " msg = json.loads(measurement_message)\n", + " # print(\"received raw message: %s\" %msg)\n", " if \"pubMeasurements\" in msg:\n", " if getCPD:\n", - " getCPD=False\n", + " getCPD = False\n", " time.sleep(1)\n", - " cpd=dict(host.get_cpd())\n", + " cpd = dict(host.get_cpd())\n", " print(\"Sensor identifier list:\")\n", " for sensorID in [sensor[0] for sensor in cpd[\"sensors\"]]:\n", " print(\"- %s\" % sensorID)\n", @@ -967,12 +909,15 @@ " t = content[\"time\"]\n", " sensorID = content[\"sensorID\"]\n", " x = content[\"sensorValue\"]\n", - " print(\"Received measurement originating at time %s for sensor %s of value %s\" % (content[\"time\"],content[\"sensorID\"],content[\"sensorValue\"]))\n", + " print(\n", + " \"Received measurement originating at time %s for sensor %s of value %s\"\n", + " % (content[\"time\"], content[\"sensorID\"], content[\"sensorValue\"])\n", + " )\n", " if sensorID in history:\n", - " history[sensorID].append((t,x))\n", + " history[sensorID].append((t, x))\n", " else:\n", - " history[sensorID]= [(t,x)]\n", - " host.workload_action([nrm.Action(\"RaplKey (PackageID 0)\",1.8e8)])\n", + " history[sensorID] = [(t, x)]\n", + " host.workload_action([nrm.Action(\"RaplKey (PackageID 0)\", 1.8e8)])\n", " host.check_daemon()\n", "\n", "host.stop_daemon()" @@ -987,61 +932,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "\n", - " setTimeout(function() {\n", - " var nbb_cell_id = 17;\n", - " var nbb_unformatted_code = \"for sensorID,measurements in history.items():\\n dataframe = pd.DataFrame(data=[(pd.Timestamp(t, unit='us'), m) \\n for t,m \\n in measurements])\\n dataframe.columns=[\\\"time\\\",\\\"value\\\"]\\n dataframe = dataframe.set_index(\\\"time\\\")\\n ax = dataframe.plot(marker='o', \\n linestyle='-',\\n title='values for sensor \\\"%s[..]\\\"' % sensorID[:20])\";\n", - " var nbb_formatted_code = \"for sensorID, measurements in history.items():\\n dataframe = pd.DataFrame(\\n data=[(pd.Timestamp(t, unit=\\\"us\\\"), m) for t, m in measurements]\\n )\\n dataframe.columns = [\\\"time\\\", \\\"value\\\"]\\n dataframe = dataframe.set_index(\\\"time\\\")\\n ax = dataframe.plot(\\n marker=\\\"o\\\", linestyle=\\\"-\\\", title='values for sensor \\\"%s[..]\\\"' % sensorID[:20]\\n )\";\n", - " var nbb_cells = Jupyter.notebook.get_cells();\n", - " for (var i = 0; i < nbb_cells.length; ++i) {\n", - " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", - " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", - " nbb_cells[i].set_text(nbb_formatted_code);\n", - " }\n", - " break;\n", - " }\n", - " }\n", - " }, 500);\n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "for sensorID,measurements in history.items():\n", " dataframe = pd.DataFrame(data=[(pd.Timestamp(t, unit='us'), m) \n", @@ -1053,13 +946,20 @@ " linestyle='-',\n", " title='values for sensor \"%s[..]\"' % sensorID[:20])" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python3 - Nix", + "display_name": "Python 3", "language": "python", - "name": "ipython_nix" + "name": "python3" }, "language_info": { "codemirror_mode": { diff --git a/doc/nrm.so/haddocks/CPD-Core.html b/doc/nrm.so/haddocks/CPD-Core.html index c2da106..e7f6b47 100644 --- a/doc/nrm.so/haddocks/CPD-Core.html +++ b/doc/nrm.so/haddocks/CPD-Core.html @@ -1,2 +1,2 @@ CPD.Core
Copyright(c) UChicago Argonne 2019
LicenseBSD3
Maintainerfre@freux.fr
Safe HaskellNone
LanguageHaskell2010

CPD.Core

Description

 

Metadata

data Problem Source #

Instances
Show Problem Source # 
Instance details

Defined in CPD.Core

Generic Problem Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Problem :: Type -> Type #

Methods

from :: Problem -> Rep Problem x #

to :: Rep Problem x -> Problem #

ToJSON Problem Source # 
Instance details

Defined in CPD.Core

FromJSON Problem Source # 
Instance details

Defined in CPD.Core

MessagePack Problem Source # 
Instance details

Defined in CPD.Core

Interpret Problem Source # 
Instance details

Defined in CPD.Core

Inject Problem Source # 
Instance details

Defined in CPD.Core

JSONSchema Problem Source # 
Instance details

Defined in CPD.Core

Methods

schema :: Proxy Problem -> Schema #

type Rep Problem Source # 
Instance details

Defined in CPD.Core

data Interval a #

Instances
Foldable Interval 
Instance details

Defined in Numeric.Interval.Internal

Methods

fold :: Monoid m => Interval m -> m #

foldMap :: Monoid m => (a -> m) -> Interval a -> m #

foldr :: (a -> b -> b) -> b -> Interval a -> b #

foldr' :: (a -> b -> b) -> b -> Interval a -> b #

foldl :: (b -> a -> b) -> b -> Interval a -> b #

foldl' :: (b -> a -> b) -> b -> Interval a -> b #

foldr1 :: (a -> a -> a) -> Interval a -> a #

foldl1 :: (a -> a -> a) -> Interval a -> a #

toList :: Interval a -> [a] #

null :: Interval a -> Bool #

length :: Interval a -> Int #

elem :: Eq a => a -> Interval a -> Bool #

maximum :: Ord a => Interval a -> a #

minimum :: Ord a => Interval a -> a #

sum :: Num a => Interval a -> a #

product :: Num a => Interval a -> a #

Eq a => Eq (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

(==) :: Interval a -> Interval a -> Bool #

(/=) :: Interval a -> Interval a -> Bool #

(RealFloat a, Ord a) => Floating (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

(Fractional a, Ord a) => Fractional (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Data a => Data (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Interval a -> c (Interval a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Interval a) #

toConstr :: Interval a -> Constr #

dataTypeOf :: Interval a -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Interval a)) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Interval a)) #

gmapT :: (forall b. Data b => b -> b) -> Interval a -> Interval a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Interval a -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Interval a -> r #

gmapQ :: (forall d. Data d => d -> u) -> Interval a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Interval a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Interval a -> m (Interval a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Interval a -> m (Interval a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Interval a -> m (Interval a) #

(Num a, Ord a) => Num (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Ord a => Ord (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

compare :: Interval a -> Interval a -> Ordering #

(<) :: Interval a -> Interval a -> Bool #

(<=) :: Interval a -> Interval a -> Bool #

(>) :: Interval a -> Interval a -> Bool #

(>=) :: Interval a -> Interval a -> Bool #

max :: Interval a -> Interval a -> Interval a #

min :: Interval a -> Interval a -> Interval a #

Real a => Real (Interval a)

realToFrac will use the midpoint

Instance details

Defined in Numeric.Interval.Internal

Methods

toRational :: Interval a -> Rational #

RealFloat a => RealFloat (Interval a)

We have to play some semantic games to make these methods make sense. - Most compute with the midpoint of the interval.

Instance details

Defined in Numeric.Interval.Internal

RealFrac a => RealFrac (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

properFraction :: Integral b => Interval a -> (b, Interval a) #

truncate :: Integral b => Interval a -> b #

round :: Integral b => Interval a -> b #

ceiling :: Integral b => Interval a -> b #

floor :: Integral b => Interval a -> b #

Show a => Show (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

showsPrec :: Int -> Interval a -> ShowS #

show :: Interval a -> String #

showList :: [Interval a] -> ShowS #

Generic (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Associated Types

type Rep (Interval a) :: Type -> Type #

Methods

from :: Interval a -> Rep (Interval a) x #

to :: Rep (Interval a) x -> Interval a #

ToJSON (Interval Double) Source # 
Instance details

Defined in CPD.Core

ToJSON (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(ToJSON a, Ord a, Num a) => ToJSON (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

FromJSON (Interval Double) Source # 
Instance details

Defined in CPD.Core

FromJSON (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(FromJSON a, Ord a, Num a) => FromJSON (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

MessagePack (Interval Double) Source # 
Instance details

Defined in CPD.Core

MessagePack (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(MessagePack a, Ord a, Num a) => MessagePack (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

Interpret (Interval Double) Source # 
Instance details

Defined in CPD.Core

Interpret (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(Interpret a, Ord a, Num a) => Interpret (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

Inject (Interval Double) Source # 
Instance details

Defined in CPD.Core

Inject (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(Inject a, Ord a, Num a) => Inject (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

JSONSchema (Interval Double) Source # 
Instance details

Defined in CPD.Core

JSONSchema (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema a => JSONSchema (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

Methods

schema :: Proxy (Interval (ZeroOne a)) -> Schema #

Generic1 Interval 
Instance details

Defined in Numeric.Interval.Internal

Associated Types

type Rep1 Interval :: k -> Type #

Methods

from1 :: Interval a -> Rep1 Interval a #

to1 :: Rep1 Interval a -> Interval a #

type Rep (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

type Rep (Interval a) = D1 (MetaData "Interval" "Numeric.Interval.Internal" "intervals-0.8.1-KFlZQjtQphP8MinNYJeR7d" False) (C1 (MetaCons "I" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a)) :+: C1 (MetaCons "Empty" PrefixI False) (U1 :: Type -> Type))
type Rep1 Interval 
Instance details

Defined in Numeric.Interval.Internal

type Rep1 Interval = D1 (MetaData "Interval" "Numeric.Interval.Internal" "intervals-0.8.1-KFlZQjtQphP8MinNYJeR7d" False) (C1 (MetaCons "I" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1 :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1) :+: C1 (MetaCons "Empty" PrefixI False) (U1 :: Type -> Type))

newtype Admissible Source #

Constructors

Admissible 
Instances
Show Admissible Source # 
Instance details

Defined in CPD.Core

Generic Admissible Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Admissible :: Type -> Type #

ToJSON Admissible Source # 
Instance details

Defined in CPD.Core

FromJSON Admissible Source # 
Instance details

Defined in CPD.Core

MessagePack Admissible Source # 
Instance details

Defined in CPD.Core

Interpret Admissible Source # 
Instance details

Defined in CPD.Core

Inject Admissible Source # 
Instance details

Defined in CPD.Core

JSONSchema Admissible Source # 
Instance details

Defined in CPD.Core

type Rep Admissible Source # 
Instance details

Defined in CPD.Core

type Rep Admissible = D1 (MetaData "Admissible" "CPD.Core" "main" True) (C1 (MetaCons "Admissible" PrefixI True) (S1 (MetaSel (Just "admissibleValues") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 [Discrete])))

newtype Discrete Source #

Constructors

DiscreteDouble Double 
Instances
Eq Discrete Source # 
Instance details

Defined in CPD.Core

Show Discrete Source # 
Instance details

Defined in CPD.Core

Generic Discrete Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Discrete :: Type -> Type #

Methods

from :: Discrete -> Rep Discrete x #

to :: Rep Discrete x -> Discrete #

ToJSON Discrete Source # 
Instance details

Defined in CPD.Core

FromJSON Discrete Source # 
Instance details

Defined in CPD.Core

MessagePack Discrete Source # 
Instance details

Defined in CPD.Core

Interpret Discrete Source # 
Instance details

Defined in CPD.Core

Inject Discrete Source # 
Instance details

Defined in CPD.Core

JSONSchema Discrete Source # 
Instance details

Defined in CPD.Core

type Rep Discrete Source # 
Instance details

Defined in CPD.Core

Sensors

Definitions

newtype SensorID Source #

Constructors

SensorID 

Fields

Instances
Eq SensorID Source # 
Instance details

Defined in CPD.Core

Ord SensorID Source # 
Instance details

Defined in CPD.Core

Show SensorID Source # 
Instance details

Defined in CPD.Core

IsString SensorID Source # 
Instance details

Defined in CPD.Core

Generic SensorID Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep SensorID :: Type -> Type #

Methods

from :: SensorID -> Rep SensorID x #

to :: Rep SensorID x -> SensorID #

ToJSON SensorID Source # 
Instance details

Defined in CPD.Core

ToJSONKey SensorID Source # 
Instance details

Defined in CPD.Core

FromJSON SensorID Source # 
Instance details

Defined in CPD.Core

FromJSONKey SensorID Source # 
Instance details

Defined in CPD.Core

MessagePack SensorID Source # 
Instance details

Defined in CPD.Core

Interpret SensorID Source # 
Instance details

Defined in CPD.Core

Inject SensorID Source # 
Instance details

Defined in CPD.Core

JSONSchema SensorID Source # 
Instance details

Defined in CPD.Core

StringConv PassiveSensorKey SensorID Source # 
Instance details

Defined in NRM.Types.Sensor

StringConv ActiveSensorKey SensorID Source # 
Instance details

Defined in NRM.Types.Sensor

type Rep SensorID Source # 
Instance details

Defined in CPD.Core

type Rep SensorID = D1 (MetaData "SensorID" "CPD.Core" "main" True) (C1 (MetaCons "SensorID" PrefixI True) (S1 (MetaSel (Just "sensorID") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Text)))

data Sensor Source #

Constructors

Sensor 
Instances
Show Sensor Source # 
Instance details

Defined in CPD.Core

Generic Sensor Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Sensor :: Type -> Type #

Methods

from :: Sensor -> Rep Sensor x #

to :: Rep Sensor x -> Sensor #

ToJSON Sensor Source # 
Instance details

Defined in CPD.Core

FromJSON Sensor Source # 
Instance details

Defined in CPD.Core

MessagePack Sensor Source # 
Instance details

Defined in CPD.Core

Interpret Sensor Source # 
Instance details

Defined in CPD.Core

Inject Sensor Source # 
Instance details

Defined in CPD.Core

JSONSchema Sensor Source # 
Instance details

Defined in CPD.Core

Methods

schema :: Proxy Sensor -> Schema #

type Rep Sensor Source # 
Instance details

Defined in CPD.Core

Actuators

Classes

newtype ActuatorID Source #

Constructors

ActuatorID 

Fields

Instances
Eq ActuatorID Source # 
Instance details

Defined in CPD.Core

Ord ActuatorID Source # 
Instance details

Defined in CPD.Core

Read ActuatorID Source # 
Instance details

Defined in CPD.Core

Show ActuatorID Source # 
Instance details

Defined in CPD.Core

Generic ActuatorID Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep ActuatorID :: Type -> Type #

ToJSON ActuatorID Source # 
Instance details

Defined in CPD.Core

ToJSONKey ActuatorID Source # 
Instance details

Defined in CPD.Core

FromJSON ActuatorID Source # 
Instance details

Defined in CPD.Core

FromJSONKey ActuatorID Source # 
Instance details

Defined in CPD.Core

MessagePack ActuatorID Source # 
Instance details

Defined in CPD.Core

Interpret ActuatorID Source # 
Instance details

Defined in CPD.Core

Inject ActuatorID Source # 
Instance details

Defined in CPD.Core

JSONSchema ActuatorID Source # 
Instance details

Defined in CPD.Core

StringConv ActuatorKey ActuatorID Source # 
Instance details

Defined in NRM.Types.Actuator

type Rep ActuatorID Source # 
Instance details

Defined in CPD.Core

type Rep ActuatorID = D1 (MetaData "ActuatorID" "CPD.Core" "main" True) (C1 (MetaCons "ActuatorID" PrefixI True) (S1 (MetaSel (Just "actuatorID") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Text)))

class CPDLActuator a where Source #

Methods

toActuator :: a -> Actuator Source #

Definitions

newtype Actuator Source #

Constructors

Actuator 

Fields

Instances
Show Actuator Source # 
Instance details

Defined in CPD.Core

Generic Actuator Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Actuator :: Type -> Type #

Methods

from :: Actuator -> Rep Actuator x #

to :: Rep Actuator x -> Actuator #

ToJSON Actuator Source # 
Instance details

Defined in CPD.Core

FromJSON Actuator Source # 
Instance details

Defined in CPD.Core

MessagePack Actuator Source # 
Instance details

Defined in CPD.Core

Interpret Actuator Source # 
Instance details

Defined in CPD.Core

Inject Actuator Source # 
Instance details

Defined in CPD.Core

JSONSchema Actuator Source # 
Instance details

Defined in CPD.Core

type Rep Actuator Source # 
Instance details

Defined in CPD.Core

type Rep Actuator = D1 (MetaData "Actuator" "CPD.Core" "main" True) (C1 (MetaCons "Actuator" PrefixI True) (S1 (MetaSel (Just "actions") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 [Discrete])))

Objective/Constraint Epxression language

data OExpr Source #

Instances
Eq OExpr Source # 
Instance details

Defined in CPD.Core

Methods

(==) :: OExpr -> OExpr -> Bool #

(/=) :: OExpr -> OExpr -> Bool #

Show OExpr Source # 
Instance details

Defined in CPD.Core

Methods

showsPrec :: Int -> OExpr -> ShowS #

show :: OExpr -> String #

showList :: [OExpr] -> ShowS #

Generic OExpr Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep OExpr :: Type -> Type #

Methods

from :: OExpr -> Rep OExpr x #

to :: Rep OExpr x -> OExpr #

ToJSON OExpr Source # 
Instance details

Defined in CPD.Core

FromJSON OExpr Source # 
Instance details

Defined in CPD.Core

MessagePack OExpr Source # 
Instance details

Defined in CPD.Core

Methods

toObject :: OExpr -> Object #

fromObject :: (Applicative m, Monad m) => Object -> m OExpr #

Interpret OExpr Source # 
Instance details

Defined in CPD.Core

Inject OExpr Source # 
Instance details

Defined in CPD.Core

JSONSchema OExpr Source # 
Instance details

Defined in CPD.Core

Methods

schema :: Proxy OExpr -> Schema #

type Rep OExpr Source # 
Instance details

Defined in CPD.Core

Objective contstructor helpers

Pretty printers

Orphan instances

\ No newline at end of file + Most compute with the midpoint of the interval.

Instance details

Defined in Numeric.Interval.Internal

RealFrac a => RealFrac (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

properFraction :: Integral b => Interval a -> (b, Interval a) #

truncate :: Integral b => Interval a -> b #

round :: Integral b => Interval a -> b #

ceiling :: Integral b => Interval a -> b #

floor :: Integral b => Interval a -> b #

Show a => Show (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Methods

showsPrec :: Int -> Interval a -> ShowS #

show :: Interval a -> String #

showList :: [Interval a] -> ShowS #

Generic (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

Associated Types

type Rep (Interval a) :: Type -> Type #

Methods

from :: Interval a -> Rep (Interval a) x #

to :: Rep (Interval a) x -> Interval a #

ToJSON (Interval Double) Source # 
Instance details

Defined in CPD.Core

ToJSON (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(ToJSON a, Ord a, Num a) => ToJSON (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

FromJSON (Interval Double) Source # 
Instance details

Defined in CPD.Core

FromJSON (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(FromJSON a, Ord a, Num a) => FromJSON (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

MessagePack (Interval Double) Source # 
Instance details

Defined in CPD.Core

MessagePack (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(MessagePack a, Ord a, Num a) => MessagePack (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

Interpret (Interval Double) Source # 
Instance details

Defined in CPD.Core

Interpret (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(Interpret a, Ord a, Num a) => Interpret (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

Inject (Interval Double) Source # 
Instance details

Defined in CPD.Core

Inject (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

(Inject a, Ord a, Num a) => Inject (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

JSONSchema (Interval Double) Source # 
Instance details

Defined in CPD.Core

JSONSchema (Interval [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema a => JSONSchema (Interval (ZeroOne a)) Source # 
Instance details

Defined in NRM.Orphans.ZeroOne

Methods

schema :: Proxy (Interval (ZeroOne a)) -> Schema #

Generic1 Interval 
Instance details

Defined in Numeric.Interval.Internal

Associated Types

type Rep1 Interval :: k -> Type #

Methods

from1 :: Interval a -> Rep1 Interval a #

to1 :: Rep1 Interval a -> Interval a #

type Rep (Interval a) 
Instance details

Defined in Numeric.Interval.Internal

type Rep (Interval a) = D1 (MetaData "Interval" "Numeric.Interval.Internal" "intervals-0.8.1-KFlZQjtQphP8MinNYJeR7d" False) (C1 (MetaCons "I" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a)) :+: C1 (MetaCons "Empty" PrefixI False) (U1 :: Type -> Type))
type Rep1 Interval 
Instance details

Defined in Numeric.Interval.Internal

type Rep1 Interval = D1 (MetaData "Interval" "Numeric.Interval.Internal" "intervals-0.8.1-KFlZQjtQphP8MinNYJeR7d" False) (C1 (MetaCons "I" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1 :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1) :+: C1 (MetaCons "Empty" PrefixI False) (U1 :: Type -> Type))

newtype Admissible Source #

Constructors

Admissible 
Instances
Show Admissible Source # 
Instance details

Defined in CPD.Core

Generic Admissible Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Admissible :: Type -> Type #

ToJSON Admissible Source # 
Instance details

Defined in CPD.Core

FromJSON Admissible Source # 
Instance details

Defined in CPD.Core

MessagePack Admissible Source # 
Instance details

Defined in CPD.Core

Interpret Admissible Source # 
Instance details

Defined in CPD.Core

Inject Admissible Source # 
Instance details

Defined in CPD.Core

JSONSchema Admissible Source # 
Instance details

Defined in CPD.Core

type Rep Admissible Source # 
Instance details

Defined in CPD.Core

type Rep Admissible = D1 (MetaData "Admissible" "CPD.Core" "main" True) (C1 (MetaCons "Admissible" PrefixI True) (S1 (MetaSel (Just "admissibleValues") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 [Discrete])))

newtype Discrete Source #

Constructors

DiscreteDouble Double 
Instances
Eq Discrete Source # 
Instance details

Defined in CPD.Core

Show Discrete Source # 
Instance details

Defined in CPD.Core

Generic Discrete Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Discrete :: Type -> Type #

Methods

from :: Discrete -> Rep Discrete x #

to :: Rep Discrete x -> Discrete #

ToJSON Discrete Source # 
Instance details

Defined in CPD.Core

FromJSON Discrete Source # 
Instance details

Defined in CPD.Core

MessagePack Discrete Source # 
Instance details

Defined in CPD.Core

Interpret Discrete Source # 
Instance details

Defined in CPD.Core

Inject Discrete Source # 
Instance details

Defined in CPD.Core

JSONSchema Discrete Source # 
Instance details

Defined in CPD.Core

type Rep Discrete Source # 
Instance details

Defined in CPD.Core

Sensors

Definitions

newtype SensorID Source #

Constructors

SensorID 

Fields

Instances
Eq SensorID Source # 
Instance details

Defined in CPD.Core

Ord SensorID Source # 
Instance details

Defined in CPD.Core

Show SensorID Source # 
Instance details

Defined in CPD.Core

IsString SensorID Source # 
Instance details

Defined in CPD.Core

Generic SensorID Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep SensorID :: Type -> Type #

Methods

from :: SensorID -> Rep SensorID x #

to :: Rep SensorID x -> SensorID #

ToJSON SensorID Source # 
Instance details

Defined in CPD.Core

ToJSONKey SensorID Source # 
Instance details

Defined in CPD.Core

FromJSON SensorID Source # 
Instance details

Defined in CPD.Core

FromJSONKey SensorID Source # 
Instance details

Defined in CPD.Core

MessagePack SensorID Source # 
Instance details

Defined in CPD.Core

Interpret SensorID Source # 
Instance details

Defined in CPD.Core

Inject SensorID Source # 
Instance details

Defined in CPD.Core

JSONSchema SensorID Source # 
Instance details

Defined in CPD.Core

StringConv PassiveSensorKey SensorID Source # 
Instance details

Defined in NRM.Types.Sensor

StringConv ActiveSensorKey SensorID Source # 
Instance details

Defined in NRM.Types.Sensor

type Rep SensorID Source # 
Instance details

Defined in CPD.Core

type Rep SensorID = D1 (MetaData "SensorID" "CPD.Core" "main" True) (C1 (MetaCons "SensorID" PrefixI True) (S1 (MetaSel (Just "sensorID") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Text)))

data Sensor Source #

Constructors

Sensor 
Instances
Show Sensor Source # 
Instance details

Defined in CPD.Core

Generic Sensor Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Sensor :: Type -> Type #

Methods

from :: Sensor -> Rep Sensor x #

to :: Rep Sensor x -> Sensor #

ToJSON Sensor Source # 
Instance details

Defined in CPD.Core

FromJSON Sensor Source # 
Instance details

Defined in CPD.Core

MessagePack Sensor Source # 
Instance details

Defined in CPD.Core

Interpret Sensor Source # 
Instance details

Defined in CPD.Core

Inject Sensor Source # 
Instance details

Defined in CPD.Core

JSONSchema Sensor Source # 
Instance details

Defined in CPD.Core

Methods

schema :: Proxy Sensor -> Schema #

type Rep Sensor Source # 
Instance details

Defined in CPD.Core

Actuators

Classes

newtype ActuatorID Source #

Constructors

ActuatorID 

Fields

Instances
Eq ActuatorID Source # 
Instance details

Defined in CPD.Core

Ord ActuatorID Source # 
Instance details

Defined in CPD.Core

Read ActuatorID Source # 
Instance details

Defined in CPD.Core

Show ActuatorID Source # 
Instance details

Defined in CPD.Core

Generic ActuatorID Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep ActuatorID :: Type -> Type #

ToJSON ActuatorID Source # 
Instance details

Defined in CPD.Core

ToJSONKey ActuatorID Source # 
Instance details

Defined in CPD.Core

FromJSON ActuatorID Source # 
Instance details

Defined in CPD.Core

FromJSONKey ActuatorID Source # 
Instance details

Defined in CPD.Core

MessagePack ActuatorID Source # 
Instance details

Defined in CPD.Core

Interpret ActuatorID Source # 
Instance details

Defined in CPD.Core

Inject ActuatorID Source # 
Instance details

Defined in CPD.Core

JSONSchema ActuatorID Source # 
Instance details

Defined in CPD.Core

StringConv ActuatorKey ActuatorID Source # 
Instance details

Defined in NRM.Types.Actuator

type Rep ActuatorID Source # 
Instance details

Defined in CPD.Core

type Rep ActuatorID = D1 (MetaData "ActuatorID" "CPD.Core" "main" True) (C1 (MetaCons "ActuatorID" PrefixI True) (S1 (MetaSel (Just "actuatorID") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Text)))

class CPDLActuator a where Source #

Methods

toActuator :: a -> Actuator Source #

Definitions

newtype Actuator Source #

Constructors

Actuator 

Fields

Instances
Show Actuator Source # 
Instance details

Defined in CPD.Core

Generic Actuator Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep Actuator :: Type -> Type #

Methods

from :: Actuator -> Rep Actuator x #

to :: Rep Actuator x -> Actuator #

ToJSON Actuator Source # 
Instance details

Defined in CPD.Core

FromJSON Actuator Source # 
Instance details

Defined in CPD.Core

MessagePack Actuator Source # 
Instance details

Defined in CPD.Core

Interpret Actuator Source # 
Instance details

Defined in CPD.Core

Inject Actuator Source # 
Instance details

Defined in CPD.Core

JSONSchema Actuator Source # 
Instance details

Defined in CPD.Core

type Rep Actuator Source # 
Instance details

Defined in CPD.Core

type Rep Actuator = D1 (MetaData "Actuator" "CPD.Core" "main" True) (C1 (MetaCons "Actuator" PrefixI True) (S1 (MetaSel (Just "actions") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 [Discrete])))

Objective/Constraint Epxression language

data OExpr Source #

Instances
Eq OExpr Source # 
Instance details

Defined in CPD.Core

Methods

(==) :: OExpr -> OExpr -> Bool #

(/=) :: OExpr -> OExpr -> Bool #

Show OExpr Source # 
Instance details

Defined in CPD.Core

Methods

showsPrec :: Int -> OExpr -> ShowS #

show :: OExpr -> String #

showList :: [OExpr] -> ShowS #

Generic OExpr Source # 
Instance details

Defined in CPD.Core

Associated Types

type Rep OExpr :: Type -> Type #

Methods

from :: OExpr -> Rep OExpr x #

to :: Rep OExpr x -> OExpr #

ToJSON OExpr Source # 
Instance details

Defined in CPD.Core

FromJSON OExpr Source # 
Instance details

Defined in CPD.Core

MessagePack OExpr Source # 
Instance details

Defined in CPD.Core

Methods

toObject :: OExpr -> Object #

fromObject :: (Applicative m, Monad m) => Object -> m OExpr #

Interpret OExpr Source # 
Instance details

Defined in CPD.Core

Inject OExpr Source # 
Instance details

Defined in CPD.Core

JSONSchema OExpr Source # 
Instance details

Defined in CPD.Core

Methods

schema :: Proxy OExpr -> Schema #

type Rep OExpr Source # 
Instance details

Defined in CPD.Core

Objective contstructor helpers

Pretty printers

Orphan instances

\ No newline at end of file diff --git a/doc/nrm.so/haddocks/CPD-Integrated.html b/doc/nrm.so/haddocks/CPD-Integrated.html index b948fdc..ba127a9 100644 --- a/doc/nrm.so/haddocks/CPD-Integrated.html +++ b/doc/nrm.so/haddocks/CPD-Integrated.html @@ -1 +1 @@ -CPD.Integrated
Copyright(c) UChicago Argonne 2019
LicenseBSD3
Maintainerfre@freux.fr
Safe HaskellNone
LanguageHaskell2010

CPD.Integrated

Description

 

Documentation

data Integrator Source #

Constructors

Integrator 

Fields

measureValue :: Time -> (Time, Double) -> MeasurementState -> MeasurementState Source #

squeeze :: Time -> Map SensorID MeasurementState -> Maybe (Map SensorID Double, Map SensorID MeasurementState) Source #

\ No newline at end of file +CPD.Integrated
Copyright(c) UChicago Argonne 2019
LicenseBSD3
Maintainerfre@freux.fr
Safe HaskellNone
LanguageHaskell2010

CPD.Integrated

Description

 

Documentation

data Integrator Source #

Instances
Show Integrator Source # 
Instance details

Defined in NRM.Types.Controller

Generic Integrator Source # 
Instance details

Defined in CPD.Integrated

Associated Types

type Rep Integrator :: Type -> Type #

ToJSON Integrator Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON Integrator Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack Integrator Source # 
Instance details

Defined in NRM.Types.Controller

Interpret Integrator Source # 
Instance details

Defined in NRM.Types.Controller

Inject Integrator Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema Integrator Source # 
Instance details

Defined in NRM.Types.Controller

type Rep Integrator Source # 
Instance details

Defined in CPD.Integrated

data MeasurementState Source #

Instances
Data MeasurementState Source # 
Instance details

Defined in CPD.Integrated

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> MeasurementState -> c MeasurementState #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c MeasurementState #

toConstr :: MeasurementState -> Constr #

dataTypeOf :: MeasurementState -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c MeasurementState) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c MeasurementState) #

gmapT :: (forall b. Data b => b -> b) -> MeasurementState -> MeasurementState #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> MeasurementState -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> MeasurementState -> r #

gmapQ :: (forall d. Data d => d -> u) -> MeasurementState -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> MeasurementState -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> MeasurementState -> m MeasurementState #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> MeasurementState -> m MeasurementState #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> MeasurementState -> m MeasurementState #

Show MeasurementState Source # 
Instance details

Defined in CPD.Integrated

Generic MeasurementState Source # 
Instance details

Defined in CPD.Integrated

Associated Types

type Rep MeasurementState :: Type -> Type #

ToJSON MeasurementState Source # 
Instance details

Defined in CPD.Integrated

FromJSON MeasurementState Source # 
Instance details

Defined in CPD.Integrated

MessagePack MeasurementState Source # 
Instance details

Defined in CPD.Integrated

Interpret MeasurementState Source # 
Instance details

Defined in CPD.Integrated

Inject MeasurementState Source # 
Instance details

Defined in CPD.Integrated

JSONSchema MeasurementState Source # 
Instance details

Defined in CPD.Integrated

type Rep MeasurementState Source # 
Instance details

Defined in CPD.Integrated

\ No newline at end of file diff --git a/doc/nrm.so/haddocks/CPD-Values.html b/doc/nrm.so/haddocks/CPD-Values.html index 9104535..189ddeb 100644 --- a/doc/nrm.so/haddocks/CPD-Values.html +++ b/doc/nrm.so/haddocks/CPD-Values.html @@ -1 +1 @@ -CPD.Values
Copyright(c) UChicago Argonne 2019
LicenseBSD3
Maintainerfre@freux.fr
Safe HaskellNone
LanguageHaskell2010

CPD.Values

Description

 

Documentation

data Measurement Source #

Constructors

Measurement 
Instances
Show Measurement Source # 
Instance details

Defined in CPD.Values

Generic Measurement Source # 
Instance details

Defined in CPD.Values

Associated Types

type Rep Measurement :: Type -> Type #

ToJSON Measurement Source # 
Instance details

Defined in CPD.Values

FromJSON Measurement Source # 
Instance details

Defined in CPD.Values

MessagePack Measurement Source # 
Instance details

Defined in CPD.Values

Interpret Measurement Source # 
Instance details

Defined in CPD.Values

Inject Measurement Source # 
Instance details

Defined in CPD.Values

JSONSchema Measurement Source # 
Instance details

Defined in CPD.Values

type Rep Measurement Source # 
Instance details

Defined in CPD.Values

data Action Source #

Constructors

Action 
Instances
Eq Action Source # 
Instance details

Defined in CPD.Values

Methods

(==) :: Action -> Action -> Bool #

(/=) :: Action -> Action -> Bool #

Show Action Source # 
Instance details

Defined in CPD.Values

Generic Action Source # 
Instance details

Defined in CPD.Values

Associated Types

type Rep Action :: Type -> Type #

Methods

from :: Action -> Rep Action x #

to :: Rep Action x -> Action #

ToJSON Action Source # 
Instance details

Defined in CPD.Values

FromJSON Action Source # 
Instance details

Defined in CPD.Values

MessagePack Action Source # 
Instance details

Defined in CPD.Values

Interpret Action Source # 
Instance details

Defined in CPD.Values

Inject Action Source # 
Instance details

Defined in CPD.Values

JSONSchema Action Source # 
Instance details

Defined in CPD.Values

Methods

schema :: Proxy Action -> Schema #

Show (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Show (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Show (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

showsPrec :: Int -> Exp3 [Action] -> ShowS #

show :: Exp3 [Action] -> String #

showList :: [Exp3 [Action]] -> ShowS #

ToJSON (Arms [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (Arms [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (Arms [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

toObject :: Arms [Action] -> Object #

fromObject :: (Applicative m, Monad m) => Object -> m (Arms [Action]) #

MessagePack (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

toObject :: Exp3 [Action] -> Object #

fromObject :: (Applicative m, Monad m) => Object -> m (Exp3 [Action]) #

Interpret (Arms [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (Arms [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema (Arms [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

schema :: Proxy (Arms [Action]) -> Schema #

JSONSchema (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

schema :: Proxy (Weight [Action]) -> Schema #

JSONSchema (Weight [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

schema :: Proxy (Weight [Action]) -> Schema #

JSONSchema (Exp3 [Action]) Source # 
Instance details

Defined in NRM.Types.Controller

Methods

schema :: Proxy (Exp3 [Action]) -> Schema #

Show (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Show (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Show (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Show (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

ToJSON (Learn (Exp3 [Action]) (BwCR [Action] [ZeroOne Double])) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

FromJSON (Learn (Exp3 [Action]) (BwCR [Action] [ZeroOne Double])) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

MessagePack (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Interpret (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

Inject (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema (BwCRHyper [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema (UCBBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema (ScreeningBwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema (BwCR [Action] [ZeroOne Double]) Source # 
Instance details

Defined in NRM.Types.Controller

JSONSchema (Learn (Exp3 [Action]) (BwCR [Action] [ZeroOne Double])) Source # 
Instance details

Defined in NRM.Types.Controller

type Rep Action Source # 
Instance details

Defined in CPD.Values

\ No newline at end of file +CPD.Values
Copyright(c) UChicago Argonne 2019
LicenseBSD3
Maintainerfre@freux.fr
Safe HaskellNone
LanguageHaskell2010

CPD.Values

Description

 

Documentation

data Measurement Source #

Constructors

Measurement 
Instances
Show Measurement Source # 
Instance details

Defined in CPD.Values

Generic Measurement Source # 
Instance details

Defined in CPD.Values

Associated Types

type Rep Measurement :: Type -> Type #

ToJSON Measurement Source # 
Instance details

Defined in CPD.Values

FromJSON Measurement Source # 
Instance details

Defined in CPD.Values

MessagePack Measurement Source # 
Instance details

Defined in CPD.Values

Interpret Measurement Source # 
Instance details

Defined in CPD.Values

Inject Measurement Source # 
Instance details

Defined in CPD.Values

JSONSchema Measurement Source # 
Instance details

Defined in CPD.Values

type Rep Measurement Source # 
Instance details

Defined in CPD.Values

data Action Source #

Constructors

Action 
Instances
Eq Action Source # 
Instance details

Defined in CPD.Values

Methods

(==) :: Action -> Action -> Bool #

(/=) :: Action -> Action -> Bool #

Show Action Source # 
Instance details

Defined in CPD.Values

Generic Action Source # 
Instance details

Defined in CPD.Values

Associated Types

type Rep Action :: Type -> Type #

Methods

from :: Action -> Rep Action x #

to :: Rep Action x -> Action #

ToJSON Action Source # 
Instance details

Defined in CPD.Values

FromJSON Action Source # 
Instance details

Defined in CPD.Values