From 9b6a050bda32e0bd74a45016a1475c4ac10ef089 Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Tue, 29 Apr 2025 09:57:09 +0200 Subject: [PATCH] added some copyrgiht info --- hs/app/CommonOptions.hs | 2 ++ hs/app/DecomposeInput.hs | 2 ++ hs/app/DecomposeOutput.hs | 2 ++ hs/app/DecomposeTemp.hs | 54 +++++++++++++++++++++++++++++++++++++++ hs/app/HsiMethod.hs | 2 ++ hs/app/LStarMain.hs | 2 ++ hs/app/Main.hs | 6 +++++ hs/app/RandomGen.hs | 2 ++ hs/mealy-decompose.cabal | 3 ++- 9 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 hs/app/DecomposeTemp.hs diff --git a/hs/app/CommonOptions.hs b/hs/app/CommonOptions.hs index 5a733cb..d12ddce 100644 --- a/hs/app/CommonOptions.hs +++ b/hs/app/CommonOptions.hs @@ -1,3 +1,5 @@ +-- | Copyright: (c) 2024-2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 module CommonOptions where import Options.Applicative diff --git a/hs/app/DecomposeInput.hs b/hs/app/DecomposeInput.hs index 5f3b886..632338e 100644 --- a/hs/app/DecomposeInput.hs +++ b/hs/app/DecomposeInput.hs @@ -1,3 +1,5 @@ +-- | Copyright: (c) 2024-2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 module DecomposeInput where import Bisimulation (bisimulation2) diff --git a/hs/app/DecomposeOutput.hs b/hs/app/DecomposeOutput.hs index 7e94011..df38997 100644 --- a/hs/app/DecomposeOutput.hs +++ b/hs/app/DecomposeOutput.hs @@ -1,6 +1,8 @@ {-# LANGUAGE PartialTypeSignatures #-} {-# OPTIONS_GHC -Wno-partial-type-signatures #-} +-- | Copyright: (c) 2024-2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 module DecomposeOutput where import CommonOptions diff --git a/hs/app/DecomposeTemp.hs b/hs/app/DecomposeTemp.hs new file mode 100644 index 0000000..188b716 --- /dev/null +++ b/hs/app/DecomposeTemp.hs @@ -0,0 +1,54 @@ +-- | Copyright: (c) 2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 +module DecomposeTemp where + +import DotParser (readDotFile) +import Mealy + +import Control.Monad (unless) +import Data.List (nub, sort) +import Data.Maybe (mapMaybe) +import Data.Set qualified as Set +import Data.Text (Text) +import Options.Applicative + +-- Nog een experiment + +data DecomposeTempOptions = DecomposeTempOptions + { filename :: FilePath + , quiescence :: Text + , numComponents :: Int + } + deriving Show + +decomposeTempOptionsParser :: Parser DecomposeTempOptions +decomposeTempOptionsParser = + DecomposeTempOptions + <$> argument str (help "Filename to read (dot format)" <> metavar "FILE") + <*> option str (long "quiescence" <> help "String denoting empty output" <> showDefault <> value "quiescence") + <*> option auto (long "components" <> short 'c' <> help "Number of components" <> metavar "NUM" <> showDefault <> value 2) + +mainDecomposeTemp :: DecomposeTempOptions -> IO () +mainDecomposeTemp DecomposeTempOptions{..} = do + putStrLn $ "reading " <> filename <> " and quiescence=" <> show quiescence + MealyMachine{..} <- readDotFile filename + + let + quiescenceTransitions s = mapMaybe (\i -> let (o, t) = behaviour s i in if o == quiescence then Just (s, t) else Nothing) inputs + valid = all (uncurry (==)) . quiescenceTransitions + + unless (all valid states) $ do + putStrLn "WARNING: Not all quiescence-transistions are self-loops!" + + let + definedTransitions s = mapMaybe (\i -> let (o, t) = behaviour s i in if o /= quiescence || s /= t then Just (s, i, o, t) else Nothing) inputs + showState s trns = putStrLn $ show s <> ": " <> show (fmap (\(_, i, _, _) -> i) trns) + + bfs [] _ = [] + bfs (x : todo) visited + | x `Set.member` visited = bfs todo visited + | otherwise = + let trns = definedTransitions x + in (x, sort trns) : bfs (todo <> nub (fmap (\(_, _, _, t) -> t) trns)) (Set.insert x visited) + + mapM_ (uncurry showState) (bfs [initialState] Set.empty) diff --git a/hs/app/HsiMethod.hs b/hs/app/HsiMethod.hs index fccdc8c..9f8b4ac 100644 --- a/hs/app/HsiMethod.hs +++ b/hs/app/HsiMethod.hs @@ -1,3 +1,5 @@ +-- | Copyright: (c) 2024-2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2] module HsiMethod where import Data.Trie qualified as Trie diff --git a/hs/app/LStarMain.hs b/hs/app/LStarMain.hs index 61407a8..886ac9e 100644 --- a/hs/app/LStarMain.hs +++ b/hs/app/LStarMain.hs @@ -1,3 +1,5 @@ +-- | Copyright: (c) 2024-2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 module LStarMain where import Bisimulation (bisimulation2) diff --git a/hs/app/Main.hs b/hs/app/Main.hs index 182f5bd..3a95dfe 100644 --- a/hs/app/Main.hs +++ b/hs/app/Main.hs @@ -1,10 +1,13 @@ {-# OPTIONS_GHC -Wno-missing-signatures #-} +-- | Copyright: (c) 2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 module Main where import CommonOptions import DecomposeInput import DecomposeOutput +import DecomposeTemp import HsiMethod import LStarMain import RandomGen @@ -25,6 +28,7 @@ main = do case optCommand of DecomposeOutput options -> mainDecomposeOutput options commonOptions DecomposeInput options -> mainDecomposeInput options commonOptions + DecomposeTemp options -> mainDecomposeTemp options HsiMethod options -> mainHsiMethod options LStar options -> mainLStar options RandomGen options -> mainRandomGen options @@ -45,6 +49,7 @@ optionsParser = data Command = DecomposeOutput DecomposeOutputOptions | DecomposeInput DecomposeInputOptions + | DecomposeTemp DecomposeTempOptions | HsiMethod HsiMethodOptions | LStar LStarOptions | RandomGen RandomGenOptions @@ -54,6 +59,7 @@ commandParser = hsubparser ( command "decompose-output" (info (DecomposeOutput <$> decomposeOutputOptionsParser) (progDesc "decompose based on output")) <> command "decompose-input" (info (DecomposeInput <$> decomposeInputOptionsParser) (progDesc "decompose based on independent inputs")) + <> command "decompose-temp" (info (DecomposeTemp <$> decomposeTempOptionsParser) (progDesc "temporary experiment")) <> command "hsi-method" (info (HsiMethod <$> hsiMethodOptionsParser) (progDesc "construct HSI test suite from specification dot file")) <> command "lstar" (info (LStar <$> lStarOptionsParser) (progDesc "little l* playground")) <> command "random-gen" (info (RandomGen <$> randomGenOptionsParser) (progDesc "generate random parallel compositions")) diff --git a/hs/app/RandomGen.hs b/hs/app/RandomGen.hs index 47c02cd..4515f68 100644 --- a/hs/app/RandomGen.hs +++ b/hs/app/RandomGen.hs @@ -1,6 +1,8 @@ {-# LANGUAGE PartialTypeSignatures #-} {-# OPTIONS_GHC -Wno-partial-type-signatures #-} +-- | Copyright: (c) 2024-2025 Joshua Moerman, Open Universiteit +-- SPDX-License-Identifier: EUPL-1.2 module RandomGen where import Data.Partition (Block (..)) diff --git a/hs/mealy-decompose.cabal b/hs/mealy-decompose.cabal index 1727fd7..57002a4 100644 --- a/hs/mealy-decompose.cabal +++ b/hs/mealy-decompose.cabal @@ -1,6 +1,6 @@ cabal-version: 2.2 name: mealy-decompose -version: 0.4.0.0 +version: 0.4.1.0 license: EUPL-1.2 license-file: LICENSE author: Joshua Moerman @@ -53,6 +53,7 @@ executable mealy-decompose-main CommonOptions, DecomposeInput, DecomposeOutput, + DecomposeTemp, HsiMethod, LStarMain, RandomGen