packages feed

BPS-0.1.1.0: src/main/haskell/prof/Main.hs

{-# LANGUAGE RankNTypes #-}

module Main where

import ATMSTrun
import JTMSrun
import Control.Monad.Random
import Control.Monad.Random.Class
import Data.TMS.ATMS.ATMST

main :: IO ()
main = do
  -- gen <- getStdGen
  let gen = mkStdGen 8675309 --- Fix for comparing like to like
  evalRandT (runATMST $
              makeForceATMS
                (IntRange 800 810) (IntRange 4000 4010)
                0.1
                (IntRange 50 60) (IntRange 25 30)
                False) gen
  return ()

intSet :: (RandomGen g, Monad m) => Int -> Int -> RandT g m [Int]
intSet 0 _ = return []
intSet n m = do
  x <- getRandomR (0, m)
  xs <- intSet (n - 1) m
  return $ x : xs

intSetExcept :: (RandomGen g, Monad m) => Int -> Int -> Int -> RandT g m [Int]
intSetExcept 0 _ _ = return []
intSetExcept n m d = do
  x <- getRandomR (0, m)
  if (x == d) then intSetExcept n m d else do
    xs <- intSetExcept (n - 1) m d
    return $ x : xs

data IntRange = IntRange { lo :: Int, hi :: Int }

sample :: (RandomGen g, Monad m) => IntRange -> RandT g m Int
sample (IntRange lo hi) = getRandomR (lo, hi)

coinFlip :: (RandomGen g, Monad m) => Double -> RandT g m Bool
coinFlip p = do
  q <- getRandomR (0.0, 1.0)
  return $ q <= p

makeForceATMS ::
  (RandomGen g, MonadIO m) =>
    IntRange -> IntRange -> Double -> IntRange -> IntRange -> Bool ->
      ATMST s (RandT g m) ()
makeForceATMS assumptionsRange nonassumptionsRange contradictionChance
              justificationsPerConclusion antecedentsPerJustifications
              cyclic = do

  atms <- createATMS "Random ATMS"
  setDatumStringViaString atms
  setInformantStringViaString atms
  assumptions <- lift $ sample assumptionsRange
  nonassumptions <- lift $ sample nonassumptionsRange
  let totalNodes = assumptions + nonassumptions

  assumptionNodes <- forM [0 .. assumptions - 1] $ \i ->
    createNode atms ("Node-" ++ show i) True False

  nonassumptionNodes <- forM [0 .. nonassumptions - 1] $ \i -> do
    isContradiction <- lift $ coinFlip contradictionChance
    let idx = assumptions + i
    createNode atms ("Node-" ++ show idx) False isContradiction

  let nodes = assumptionNodes ++ nonassumptionNodes

  {-# SCC "mainLoop" #-} forM_ [0 .. nonassumptions - 1] $ \i -> do
    let idx = assumptions + i
    let node = nodes !! idx
    justifications <- lift $ sample justificationsPerConclusion
    -- lift $ lift $ liftIO $ putStrLn $
    --   show justifications ++ " justifications for node " ++ show idx
    forM_ [0 .. justifications - 1] $ \j -> do
      thisSize <- lift $ sample antecedentsPerJustifications
      antsIdx <- lift $ if cyclic
        then intSet thisSize $ idx - 1
        else intSetExcept thisSize (totalNodes - 1) j
      let ants = map (nodes !!) antsIdx
      {-# SCC "justCalls" #-} justifyNode (show i ++ "." ++ show j) node ants
    {-# SCC "forceLabel" #-} debugNodeLabel node