packages feed

CSPM-cspm-0.1.0.0: src/CSPM/LTS/MkLtsPar.hs

----------------------------------------------------------------------------
-- |
-- Module      :  CSPM.LTS.mkLtsPar
-- Copyright   :  (c) Fontaine 2010
-- License     :  BSD
-- 
-- Maintainer  :  Fontaine@cs.uni-duesseldorf.de
-- Stability   :  experimental
-- Portability :  GHC-only
--
-- Compute the labled transition system of a process.
----------------------------------------------------------------------------
module CSPM.LTS.MkLtsPar
(
  mkLtsPar
)
where

import CSPM.CoreLanguage
import CSPM.FiringRules.Rules
import CSPM.FiringRules.Verifier (viewProcAfter)
import CSPM.FiringRules.FieldConstraints (computeTransitions)

--import CSPM.Interpreter as Interpreter
import CSPM.Interpreter (INT)

import CSPM.LTS.LTS

import Control.Parallel.Strategies
import qualified Data.Map as Map
import qualified Data.Set as Set
import Data.Set (Set)
import Data.List as List

-- | Compute the
mkLtsPar :: Sigma INT-> Process INT -> LTS
mkLtsPar events process
  = wave [mkLtsNode process] Map.empty
  where
    wave :: [LtsNode] -> LTS -> LTS
    wave [] lts = lts
    wave w lts = wave (Set.toList uniqueProcesses) newLts
      where
        !transitions = parRules $ map processNext w
        processes = concatMap (\(_,_,r) -> r) transitions

        processNext :: LtsNode -> (LtsNode, [Rule INT], [LtsNode])
        processNext p = (p, rules, map (mkLtsNode . viewProcAfter) rules)
          where rules =  computeTransitions events $ nodeProcess p
      
        !newLts = List.foldl' insertTransition lts transitions
          where
            insertTransition :: LTS -> (LtsNode, [Rule INT], [LtsNode]) -> LTS
            insertTransition l (p, rules, _) = Map.insert p rules l

        uniqueProcesses :: Set LtsNode
        !uniqueProcesses = List.foldl' insertProcess Set.empty processes
           where
             insertProcess :: Set LtsNode -> LtsNode -> Set LtsNode
             insertProcess s p = if Map.member p newLts
               then s
               else p `Set.insert` s

    parRules ::
          [(LtsNode, [Rule INT], [LtsNode ])]
       -> [(LtsNode, [Rule INT], [LtsNode ])]
    parRules = withStrategy $ parList $ seqTriple r0 (parList rwhnf) (parList rwhnf)
 {- 
   semantic : parRules = id
 -}

{-
    parRules = withStrategy $ parList $ \(p,rl,pl) -> do
       p' <- rpar (p `using` r0)
       rl' <- rpar (rl `using` parList rwhnf)
       pl' <- rpar (pl `using` parList rwhnf)
       return (p',rl',pl')
-}