aivika-transformers 5.9.1 → 6.0.0
raw patch · 16 files changed
+158/−75 lines, 16 filesdep ~aivikaPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aivika
API changes (from Hackage documentation)
- Simulation.Aivika.Trans.Event: data family EventQueue m :: *;
- Simulation.Aivika.Trans.Generator: data family Generator m :: *;
- Simulation.Aivika.Trans.Internal.Event: data family EventQueue m :: *;
- Simulation.Aivika.Trans.Internal.Types: data family EventQueue m :: *;
- Simulation.Aivika.Trans.QueueStrategy: data family StrategyQueue m s :: * -> *;
- Simulation.Aivika.Trans.Ref.Base.Lazy: data family Ref m a;
- Simulation.Aivika.Trans.Ref.Base.Strict: data family Ref m a;
- Simulation.Aivika.Trans.Resource.Preemption: data family Resource m;
- Simulation.Aivika.Trans.Resource.Preemption.Base: data family Resource m;
- Simulation.Aivika.Trans.Var: data family Var m a;
- Simulation.Aivika.Trans.Var.Unboxed: data family Var m a;
+ Simulation.Aivika.Trans.Event: data EventQueue m :: *;
+ Simulation.Aivika.Trans.Event: enqueueEventWithPriority :: EventQueueing m => Double -> EventPriority -> Event m () -> Event m ()
+ Simulation.Aivika.Trans.Event: eventPriority :: MonadDES m => Event m EventPriority
+ Simulation.Aivika.Trans.Event: type EventPriority = Int
+ Simulation.Aivika.Trans.Generator: data Generator m :: *;
+ Simulation.Aivika.Trans.Internal.Cont: substituteContPriority :: MonadDES m => ContParams m a -> EventPriority -> ContParams m a
+ Simulation.Aivika.Trans.Internal.Event: data EventQueue m :: *;
+ Simulation.Aivika.Trans.Internal.Event: enqueueEventWithPriority :: EventQueueing m => Double -> EventPriority -> Event m () -> Event m ()
+ Simulation.Aivika.Trans.Internal.Event: eventPriority :: MonadDES m => Event m EventPriority
+ Simulation.Aivika.Trans.Internal.Event: type EventPriority = Int
+ Simulation.Aivika.Trans.Internal.Process: processWithPriority :: MonadDES m => EventPriority -> Process m ()
+ Simulation.Aivika.Trans.Internal.Specs: [pointPriority] :: Point m -> EventPriority
+ Simulation.Aivika.Trans.Internal.Types: [pointPriority] :: Point m -> EventPriority
+ Simulation.Aivika.Trans.Internal.Types: data EventQueue m :: *;
+ Simulation.Aivika.Trans.Internal.Types: enqueueEventWithPriority :: EventQueueing m => Double -> EventPriority -> Event m () -> Event m ()
+ Simulation.Aivika.Trans.Internal.Types: type EventPriority = Int
+ Simulation.Aivika.Trans.Process: processWithPriority :: MonadDES m => EventPriority -> Process m ()
+ Simulation.Aivika.Trans.QueueStrategy: data StrategyQueue m s :: * -> *;
+ Simulation.Aivika.Trans.Ref.Base.Lazy: data Ref m a;
+ Simulation.Aivika.Trans.Ref.Base.Strict: data Ref m a;
+ Simulation.Aivika.Trans.Resource.Preemption: data Resource m;
+ Simulation.Aivika.Trans.Resource.Preemption.Base: data Resource m;
+ Simulation.Aivika.Trans.Var: data Var m a;
+ Simulation.Aivika.Trans.Var.Unboxed: data Var m a;
- Simulation.Aivika.Trans.Internal.Specs: Point :: Specs m -> Run m -> Double -> Int -> Int -> Point m
+ Simulation.Aivika.Trans.Internal.Specs: Point :: Specs m -> Run m -> Double -> EventPriority -> Int -> Int -> Point m
- Simulation.Aivika.Trans.Internal.Specs: pointAt :: Run m -> Double -> Point m
+ Simulation.Aivika.Trans.Internal.Specs: pointAt :: Run m -> Double -> EventPriority -> Point m
- Simulation.Aivika.Trans.Internal.Types: Point :: Specs m -> Run m -> Double -> Int -> Int -> Point m
+ Simulation.Aivika.Trans.Internal.Types: Point :: Specs m -> Run m -> Double -> EventPriority -> Int -> Int -> Point m
Files
- CHANGELOG.md +5/−0
- Simulation/Aivika/IO/Event.hs +6/−5
- Simulation/Aivika/Trans/Circuit.hs +8/−8
- Simulation/Aivika/Trans/Composite.hs +1/−4
- Simulation/Aivika/Trans/Event.hs +2/−0
- Simulation/Aivika/Trans/Internal/Cont.hs +40/−12
- Simulation/Aivika/Trans/Internal/Dynamics.hs +2/−5
- Simulation/Aivika/Trans/Internal/Event.hs +8/−3
- Simulation/Aivika/Trans/Internal/Parameter.hs +0/−3
- Simulation/Aivika/Trans/Internal/Process.hs +54/−18
- Simulation/Aivika/Trans/Internal/Simulation.hs +0/−3
- Simulation/Aivika/Trans/Internal/Specs.hs +9/−4
- Simulation/Aivika/Trans/Internal/Types.hs +14/−0
- Simulation/Aivika/Trans/Process.hs +2/−0
- Simulation/Aivika/Trans/Results.hs +1/−1
- aivika-transformers.cabal +6/−9
CHANGELOG.md view
@@ -1,4 +1,9 @@ +Version 6.0+-----++* Introduced the discrete event priorities.+ Version 5.9 -----
Simulation/Aivika/IO/Event.hs view
@@ -19,7 +19,7 @@ import Data.IORef -import qualified Simulation.Aivika.PriorityQueue as PQ+import qualified Simulation.Aivika.PriorityQueue.EventQueue as PQ import Simulation.Aivika.Trans.Ref.Base import Simulation.Aivika.Trans.DES@@ -52,11 +52,11 @@ queueBusy = f, queueTime = t } - {-# INLINE enqueueEvent #-}- enqueueEvent t (Event m) =+ {-# INLINE enqueueEventWithPriority #-}+ enqueueEventWithPriority t priority (Event m) = Event $ \p -> let pq = queuePQ $ runEventQueue $ pointRun p- in liftIO $ PQ.enqueue pq t m+ in liftIO $ PQ.enqueue pq t priority m {-# INLINE runEventWith #-} runEventWith processing (Event e) =@@ -87,7 +87,7 @@ r = pointRun p f <- liftIO $ PQ.queueNull pq unless f $- do (t2, c2) <- liftIO $ PQ.queueFront pq+ do (t2, priority2, c2) <- liftIO $ PQ.queueFront pq let t = queueTime q t' <- liftIO $ readIORef t when (t2 < t') $ @@ -102,6 +102,7 @@ n2 = fromIntegral $ floor ((t2 - t0) / dt) c2 $ p { pointTime = t2, pointIteration = n2,+ pointPriority = priority2, pointPhase = -1 } call q p
Simulation/Aivika/Trans/Circuit.hs view
@@ -480,7 +480,7 @@ {-# INLINABLE iterateCircuitInPoints_ #-} iterateCircuitInPoints_ [] cir a = return () iterateCircuitInPoints_ (p : ps) cir a =- enqueueEvent (pointTime p) $+ enqueueEventWithPriority (pointTime p) (pointPriority p) $ Event $ \p' -> do (a', cir') <- invokeEvent p $ runCircuit cir a invokeEvent p $ iterateCircuitInPoints_ ps cir' a'@@ -492,7 +492,7 @@ iterateCircuitInPoints ps cir a = do let loop [] cir a source = triggerSignal source a loop (p : ps) cir a source =- enqueueEvent (pointTime p) $+ enqueueEventWithPriority (pointTime p) (pointPriority p) $ Event $ \p' -> do (a', cir') <- invokeEvent p $ runCircuit cir a invokeEvent p $ loop ps cir' a' source@@ -515,7 +515,7 @@ {-# INLINABLE iterateCircuitInTimes_ #-} iterateCircuitInTimes_ ts cir a = Event $ \p ->- do let ps = map (pointAt $ pointRun p) ts+ do let ps = map (\t -> pointAt (pointRun p) t 0) ts invokeEvent p $ iterateCircuitInPoints_ ps cir a @@ -535,7 +535,7 @@ {-# INLINABLE iterateCircuitInTimes #-} iterateCircuitInTimes ts cir a = Event $ \p ->- do let ps = map (pointAt $ pointRun p) ts+ do let ps = map (\t -> pointAt (pointRun p) t 0) ts invokeEvent p $ iterateCircuitInPoints ps cir a @@ -545,7 +545,7 @@ {-# INLINABLE iterateCircuitInPointsMaybe #-} iterateCircuitInPointsMaybe [] cir a = return () iterateCircuitInPointsMaybe (p : ps) cir a =- enqueueEvent (pointTime p) $+ enqueueEventWithPriority (pointTime p) (pointPriority p) $ Event $ \p' -> do (a', cir') <- invokeEvent p $ runCircuit cir a case a' of@@ -569,7 +569,7 @@ {-# INLINABLE iterateCircuitInTimesMaybe #-} iterateCircuitInTimesMaybe ts cir a = Event $ \p ->- do let ps = map (pointAt $ pointRun p) ts+ do let ps = map (\t -> pointAt (pointRun p) t 0) ts invokeEvent p $ iterateCircuitInPointsMaybe ps cir a @@ -583,7 +583,7 @@ do let loop [] cir ba source = triggerSignal source ba loop ps cir ba@(Left b) source = triggerSignal source ba loop (p : ps) cir (Right a) source =- enqueueEvent (pointTime p) $+ enqueueEventWithPriority (pointTime p) (pointPriority p) $ Event $ \p' -> do (ba', cir') <- invokeEvent p $ runCircuit cir a invokeEvent p $ loop ps cir' ba' source@@ -612,7 +612,7 @@ {-# INLINABLE iterateCircuitInTimesEither #-} iterateCircuitInTimesEither ts cir a = Event $ \p ->- do let ps = map (pointAt $ pointRun p) ts+ do let ps = map (\t -> pointAt (pointRun p) t 0) ts invokeEvent p $ iterateCircuitInPointsEither ps cir a
Simulation/Aivika/Trans/Composite.hs view
@@ -80,15 +80,12 @@ instance Monad m => Applicative (Composite m) where {-# INLINE pure #-}- pure = return+ pure a = Composite $ \h0 -> pure (a, h0) {-# INLINE (<*>) #-} (<*>) = ap instance Monad m => Monad (Composite m) where-- {-# INLINE return #-}- return a = Composite $ \h0 -> return (a, h0) {-# INLINE (>>=) #-} (Composite m) >>= k =
Simulation/Aivika/Trans/Event.hs view
@@ -18,6 +18,7 @@ runEventInStartTime, runEventInStopTime, -- * Event Queue+ EventPriority(..), EventQueueing(..), enqueueEventWithCancellation, enqueueEventWithStartTime,@@ -25,6 +26,7 @@ enqueueEventWithTimes, enqueueEventWithIntegTimes, yieldEvent,+ eventPriority, -- * Cancelling Event EventCancellation, cancelEvent,
Simulation/Aivika/Trans/Internal/Cont.hs view
@@ -49,6 +49,7 @@ freezeContReentering, unfreezeCont, substituteCont,+ substituteContPriority, contCanceled, contAwait, transferCont,@@ -277,15 +278,6 @@ instance MonadDES m => Monad (Cont m) where - {-# INLINE return #-}- return a = - Cont $ \c ->- Event $ \p ->- do z <- invokeEvent p $ contCanceled c- if z - then invokeEvent p $ cancelCont c- else invokeEvent p $ contCont c a- {-# INLINE (>>=) #-} (Cont m) >>= k = Cont $ \c ->@@ -365,7 +357,13 @@ instance MonadDES m => Applicative (Cont m) where {-# INLINE pure #-}- pure = return+ pure a = + Cont $ \c ->+ Event $ \p ->+ do z <- invokeEvent p $ contCanceled c+ if z + then invokeEvent p $ cancelCont c+ else invokeEvent p $ contCont c a {-# INLINE (<*>) #-} (<*>) = ap@@ -753,7 +751,8 @@ Event $ \p -> do let r = pointRun p rh <- invokeSimulation r $ newRef Nothing- rc <- invokeSimulation r $ newRef $ Just c+ rc <- invokeSimulation r $ newRef $+ Just $ substituteContPriority c (pointPriority p) h <- invokeEvent p $ handleSignal (contCancellationInitiating $ contId $@@ -791,7 +790,8 @@ Event $ \p -> do let r = pointRun p rh <- invokeSimulation r $ newRef Nothing- rc <- invokeSimulation r $ newRef $ Just c+ rc <- invokeSimulation r $ newRef $+ Just $ substituteContPriority c (pointPriority p) h <- invokeEvent p $ handleSignal (contCancellationInitiating $ contId $ contAux c) $ \e ->@@ -890,6 +890,34 @@ substituteCont :: MonadDES m => ContParams m a -> (a -> Event m ()) -> ContParams m a {-# INLINE substituteCont #-} substituteCont c m = c { contCont = m }++-- | Substitute the continuation priority.+substituteContPriority :: MonadDES m => ContParams m a -> EventPriority -> ContParams m a+{-# INLINABLE substituteContPriority #-}+substituteContPriority c priority = c { contCont = cont,+ contAux = (contAux c) { contECont = econt,+ contCCont = ccont } }+ where cont a =+ Event $ \p ->+ if priority == pointPriority p+ then invokeEvent p $ contCont c a+ else invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ resumeCont c a+ econt e =+ Event $ \p ->+ if priority == pointPriority p+ then invokeEvent p $ contECont (contAux c) e+ else invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ resumeECont c e+ ccont e =+ Event $ \p ->+ if priority == pointPriority p+ then invokeEvent p $ contCCont (contAux c) e+ else invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ contCCont (contAux c) e -- | Await the signal. contAwait :: MonadDES m => Signal m a -> Cont m a
Simulation/Aivika/Trans/Internal/Dynamics.hs view
@@ -52,9 +52,6 @@ instance Monad m => Monad (Dynamics m) where - {-# INLINE return #-}- return a = Dynamics $ \p -> return a- {-# INLINE (>>=) #-} (Dynamics m) >>= k = Dynamics $ \p -> @@ -84,13 +81,13 @@ runDynamicsInTime :: Double -> Dynamics m a -> Simulation m a {-# INLINABLE runDynamicsInTime #-} runDynamicsInTime t (Dynamics m) =- Simulation $ \r -> m $ pointAt r t+ Simulation $ \r -> m $ pointAt r t 0 -- | Run the 'Dynamics' computation in the specified time points. runDynamicsInTimes :: Monad m => [Double] -> Dynamics m a -> Simulation m [m a] {-# INLINABLE runDynamicsInTimes #-} runDynamicsInTimes ts (Dynamics m) =- Simulation $ \r -> return $ map (m . pointAt r) ts + Simulation $ \r -> return $ map (\t -> m $ pointAt r t 0) ts instance Functor m => Functor (Dynamics m) where
Simulation/Aivika/Trans/Internal/Event.hs view
@@ -21,6 +21,7 @@ runEventInStartTime, runEventInStopTime, -- * Event Queue+ EventPriority(..), EventQueueing(..), enqueueEventWithCancellation, enqueueEventWithStartTime,@@ -29,6 +30,7 @@ enqueueEventWithPoints, enqueueEventWithIntegTimes, yieldEvent,+ eventPriority, -- * Cancelling Event EventCancellation, cancelEvent,@@ -80,9 +82,6 @@ instance Monad m => Monad (Event m) where - {-# INLINE return #-}- return a = Event $ \p -> return a- {-# INLINE (>>=) #-} (Event m) >>= k = Event $ \p -> @@ -242,6 +241,12 @@ runEventInStopTime :: MonadDES m => Event m a -> Simulation m a {-# INLINE runEventInStopTime #-} runEventInStopTime = runDynamicsInStopTime . runEvent++-- | Return the current event priority.+eventPriority :: MonadDES m => Event m EventPriority+{-# INLINE eventPriority #-}+eventPriority =+ Event $ return . pointPriority -- | Actuate the event handler in the specified time points. enqueueEventWithTimes :: MonadDES m => [Double] -> Event m () -> Event m ()
Simulation/Aivika/Trans/Internal/Parameter.hs view
@@ -63,9 +63,6 @@ instance Monad m => Monad (Parameter m) where - {-# INLINE return #-}- return a = Parameter $ \r -> return a- {-# INLINE (>>=) #-} (Parameter m) >>= k = Parameter $ \r ->
Simulation/Aivika/Trans/Internal/Process.hs view
@@ -80,6 +80,8 @@ catchProcess, finallyProcess, throwProcess,+ -- * Process Priority+ processWithPriority, -- * Utilities zipProcessParallel, zip3ProcessParallel,@@ -118,12 +120,14 @@ -- | Represents a process identifier. data ProcessId m = ProcessId { processStarted :: Ref m Bool,- processReactCont :: Ref m (Maybe (ContParams m ())), + processReactCont :: Ref m (Maybe (ContParams m ())),+ processReactPriority :: Ref m Int, processContId :: ContId m, processInterruptRef :: Ref m Bool, processInterruptCont :: Ref m (Maybe (ContParams m ())), processInterruptTime :: Ref m Double,- processInterruptVersion :: Ref m Int }+ processInterruptVersion :: Ref m Int,+ processInterruptPriority :: Ref m Int } -- | Specifies a discontinuous process that can suspend at any time -- and then resume later.@@ -154,6 +158,7 @@ invokeEvent p $ writeRef x $ Just c invokeEvent p $ writeRef (processInterruptRef pid) False invokeEvent p $ writeRef (processInterruptTime pid) t+ invokeEvent p $ writeRef (processInterruptPriority pid) (pointPriority p) v <- invokeEvent p $ readRef (processInterruptVersion pid) invokeEvent p $ enqueueEvent t $@@ -174,10 +179,13 @@ case a of Nothing -> return () Just c ->- do invokeEvent p $ writeRef x Nothing+ do priority <- invokeEvent p $ readRef (processInterruptPriority pid)+ invokeEvent p $ writeRef x Nothing invokeEvent p $ writeRef (processInterruptRef pid) True invokeEvent p $ modifyRef (processInterruptVersion pid) $ (+) 1- invokeEvent p $ enqueueEvent (pointTime p) $ resumeCont c ()+ invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ resumeCont c () -- | Test whether the process with the specified identifier was interrupted. processInterrupted :: MonadDES m => ProcessId m -> Event m Bool@@ -210,7 +218,8 @@ a <- invokeEvent p $ readRef x case a of Just c ->- do invokeEvent p $ writeRef x Nothing+ do priority <- invokeEvent p $ readRef (processInterruptPriority pid)+ invokeEvent p $ writeRef x Nothing invokeEvent p $ writeRef (processInterruptRef pid) True invokeEvent p $ modifyRef (processInterruptVersion pid) $ (+) 1 t <- invokeEvent p $ readRef (processInterruptTime pid)@@ -220,7 +229,7 @@ invokeEvent p $ invokeCont c $ invokeProcess pid $- holdProcess dt+ processWithPriority priority >> holdProcess dt invokeEvent p $ reenterCont c' () Nothing ->@@ -243,8 +252,11 @@ do let x = processReactCont pid a <- invokeEvent p $ readRef x case a of- Nothing -> invokeEvent p $ writeRef x $ Just c- Just _ -> error "Cannot passivate the process twice: passivateProcess"+ Nothing ->+ do invokeEvent p $ writeRef x $ Just c+ invokeEvent p $ writeRef (processReactPriority pid) (pointPriority p)+ Just _ ->+ error "Cannot passivate the process twice: passivateProcess" -- | Passivate the process before performing some action. passivateProcessBefore :: MonadDES m => Event m () -> Process m ()@@ -258,8 +270,10 @@ case a of Nothing -> do invokeEvent p $ writeRef x $ Just c+ invokeEvent p $ writeRef (processReactPriority pid) (pointPriority p) invokeEvent p m- Just _ -> error "Cannot passivate the process twice: passivateProcessBefore"+ Just _ ->+ error "Cannot passivate the process twice: passivateProcessBefore" -- | Test whether the process with the specified identifier is passivated. processPassive :: MonadDES m => ProcessId m -> Event m Bool@@ -281,8 +295,11 @@ Nothing -> return () Just c ->- do invokeEvent p $ writeRef x Nothing- invokeEvent p $ enqueueEvent (pointTime p) $ resumeCont c ()+ do priority <- invokeEvent p $ readRef (processReactPriority pid)+ invokeEvent p $ writeRef x Nothing+ invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ resumeCont c () -- | Reactivate a process with the specified identifier immediately. reactivateProcessImmediately :: MonadDES m => ProcessId m -> Event m ()@@ -295,8 +312,13 @@ Nothing -> return () Just c ->- do invokeEvent p $ writeRef x Nothing- invokeEvent p $ resumeCont c ()+ do priority <- invokeEvent p $ readRef (processReactPriority pid)+ invokeEvent p $ writeRef x Nothing+ if priority == pointPriority p+ then invokeEvent p $ resumeCont c ()+ else invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ resumeCont c () -- | Prepare the processes identifier for running. processIdPrepare :: MonadDES m => ProcessId m -> Event m ()@@ -409,13 +431,17 @@ z <- invokeSimulation r $ newRef Nothing t <- invokeSimulation r $ newRef 0 v <- invokeSimulation r $ newRef 0+ priority1 <- invokeSimulation r $ newRef 0+ priority2 <- invokeSimulation r $ newRef 0 return ProcessId { processStarted = y,- processReactCont = x, + processReactCont = x,+ processReactPriority = priority1, processContId = c, processInterruptRef = i, processInterruptCont = z, processInterruptTime = t,- processInterruptVersion = v }+ processInterruptVersion = v,+ processInterruptPriority = priority2 } -- | Cancel a process with the specified identifier, interrupting it if needed. cancelProcessWithId :: MonadDES m => ProcessId m -> Event m ()@@ -473,9 +499,6 @@ instance MonadDES m => Monad (Process m) where - {-# INLINE return #-}- return a = Process $ \pid -> return a- {-# INLINE (>>=) #-} (Process m) >>= k = Process $ \pid -> @@ -571,6 +594,19 @@ throwProcess :: (MonadDES m, Exception e) => e -> Process m a {-# INLINABLE throwProcess #-} throwProcess = liftEvent . throwEvent++-- | Proceed with the process that would use the specified event priority.+processWithPriority :: MonadDES m => EventPriority -> Process m ()+{-# INLINABLE processWithPriority #-}+processWithPriority priority =+ Process $ \pid ->+ Cont $ \c ->+ Event $ \p ->+ if priority == pointPriority p+ then invokeEvent p $ resumeCont c ()+ else invokeEvent p $+ enqueueEventWithPriority (pointTime p) priority $+ resumeCont c () -- | Execute the specified computations in parallel within -- the current computation and return their results. The cancellation
Simulation/Aivika/Trans/Internal/Simulation.hs view
@@ -49,9 +49,6 @@ instance Monad m => Monad (Simulation m) where - {-# INLINE return #-}- return a = Simulation $ \r -> return a- {-# INLINE (>>=) #-} (Simulation m) >>= k = Simulation $ \r ->
Simulation/Aivika/Trans/Internal/Specs.hs view
@@ -131,6 +131,7 @@ point n = Point { pointSpecs = sc, pointRun = r, pointTime = basicTime sc n 0,+ pointPriority = 0, pointIteration = n, pointPhase = 0 } @@ -142,6 +143,7 @@ point n = Point { pointSpecs = sc, pointRun = r, pointTime = basicTime sc n 0,+ pointPriority = 0, pointIteration = n, pointPhase = 0 } @@ -153,17 +155,18 @@ point n = Point { pointSpecs = sc, pointRun = r, pointTime = basicTime sc n 0,+ pointPriority = 0, pointIteration = n, pointPhase = 0 } -- | Return the simulation stop time point. simulationStopPoint :: Run m -> Point m-simulationStopPoint r = pointAt r (spcStopTime $ runSpecs r)+simulationStopPoint r = pointAt r (spcStopTime $ runSpecs r) 0 -- | Return the point at the specified time.-pointAt :: Run m -> Double -> Point m+pointAt :: Run m -> Double -> EventPriority -> Point m {-# INLINABLE pointAt #-}-pointAt r t = p+pointAt r t priority = p where sc = runSpecs r t0 = spcStartTime sc dt = spcDT sc@@ -171,10 +174,11 @@ p = Point { pointSpecs = sc, pointRun = r, pointTime = t,+ pointPriority = priority, pointIteration = n, pointPhase = -1 } --- | Return the integration time points startin from the specified iteration.+-- | Return the integration time points starting from the specified iteration. integPointsStartingFrom :: Point m -> [Point m] integPointsStartingFrom p = points where r = pointRun p@@ -187,6 +191,7 @@ point n = Point { pointSpecs = sc, pointRun = r, pointTime = basicTime sc n 0,+ pointPriority = 0, pointIteration = n, pointPhase = 0 }
Simulation/Aivika/Trans/Internal/Types.hs view
@@ -23,6 +23,7 @@ Dynamics(..), Event(..), EventProcessing(..),+ EventPriority(..), EventQueueing(..), invokeParameter, invokeSimulation,@@ -59,6 +60,7 @@ data Point m = Point { pointSpecs :: Specs m, -- ^ the simulation specs pointRun :: Run m, -- ^ the simulation run pointTime :: Double, -- ^ the current time+ pointPriority :: EventPriority, -- ^ the current priority pointIteration :: Int, -- ^ the current iteration pointPhase :: Int -- ^ the current phase }@@ -127,6 +129,9 @@ -- (do not use unless the documentation states the opposite) deriving (Eq, Ord, Show) +-- | The event priority (greater is higher).+type EventPriority = Int+ -- | A type class of monads that allow enqueueing the events. class EventQueueing m where @@ -136,8 +141,17 @@ -- | Create a new event queue by the specified specs with simulation session. newEventQueue :: Specs m -> m (EventQueue m) + -- | Enqueue the event which must be actuated at the specified time+ -- given the priority.+ enqueueEventWithPriority :: Double -> EventPriority -> Event m () -> Event m ()+ -- | Enqueue the event which must be actuated at the specified time. enqueueEvent :: Double -> Event m () -> Event m ()+ {-# INLINE enqueueEvent #-}+ enqueueEvent t m =+ Event $ \p ->+ invokeEvent p $+ enqueueEventWithPriority t (pointPriority p) m -- | Run the 'EventT' computation in the current simulation time -- within the 'DynamicsT' computation involving all pending
Simulation/Aivika/Trans/Process.hs view
@@ -78,6 +78,8 @@ catchProcess, finallyProcess, throwProcess,+ -- * Process Priority+ processWithPriority, -- * Utilities zipProcessParallel, zip3ProcessParallel,
Simulation/Aivika/Trans/Results.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances, ExistentialQuantification, MultiParamTypeClasses, FunctionalDependencies, OverlappingInstances #-}+{-# LANGUAGE FlexibleContexts, FlexibleInstances, UndecidableInstances, ExistentialQuantification, MultiParamTypeClasses, FunctionalDependencies #-} -- | -- Module : Simulation.Aivika.Trans.Results
aivika-transformers.cabal view
@@ -1,5 +1,5 @@ name: aivika-transformers-version: 5.9.1+version: 6.0.0 synopsis: Transformers for the Aivika simulation library description: This package is a generalization of the aivika [1] simulation library@@ -14,7 +14,6 @@ . This method can be used not only for the parallel distributed simulation, but also for other simulation models created with help of the generalized version of the Aivika simulation library.- Please consult the AivikaSoft [4] website for more details. . \[1] <http://hackage.haskell.org/package/aivika> .@@ -22,15 +21,13 @@ . \[3] <http://hackage.haskell.org/package/aivika-distributed> .- \[4] <http://www.aivikasoft.com>- . category: Simulation license: BSD3 license-file: LICENSE-copyright: (c) 2009-2018. David Sorokin <david.sorokin@gmail.com>+copyright: (c) 2009-2023. David Sorokin <davsor@mail.ru> author: David Sorokin-maintainer: David Sorokin <david.sorokin@gmail.com>-homepage: http://www.aivikasoft.com+maintainer: David Sorokin <davsor@mail.ru>+homepage: https://gitflic.ru/project/dsorokin/aivika-transformers cabal-version: >= 1.10 build-type: Simple tested-with: GHC == 8.0.1@@ -177,7 +174,7 @@ vector >= 0.10.0.1, semigroups >= 0.10, exceptions >= 0.9.0,- aivika >= 5.9.1+ aivika >= 6.0.0 other-extensions: FlexibleContexts, FlexibleInstances,@@ -203,4 +200,4 @@ source-repository head type: git- location: https://github.com/dsorokin/aivika-transformers+ location: https://gitflic.ru/project/dsorokin/aivika-transformers