-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathModelling.hs
66 lines (54 loc) · 2.54 KB
/
Modelling.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
{-# LANGUAGE GADTs #-}
-- | This state captures a model along its ScoringFunction.
module Modelling( Modelling(..)
, TorsionModelling
, modelling
, initModelling
, modelScore
, showModellingScore
, reportModellingScore
) where
import qualified Data.ByteString.Char8 as BS
import Score.ScoringFunction as SF(ScoringFunction(scoreShow), ScoreList, scores, totalScore)
import Model
import Control.DeepSeq(NFData(..))
import Control.Monad(mapM_)
-- | Data structure containing a model and its modelling environment
-- (scoring function.) It also stores a list of current score values, so
-- one can easily update model, or use memoized score values.
data Modelling m =
(Model m) => Modelling { model :: m
, modelScores :: ScoreList
, scoring :: ScoringFunction
}
instance (NFData m) => NFData (Modelling m) where
rnf ming = rnf (model ming) `seq` rnf (modelScores ming)
-- | Type alias for torsion space modelling.
type TorsionModelling = Modelling TorsionModel
-- | Returns a total score of a model.
modelScore :: Modelling m -> Double
modelScore = SF.totalScore . modelScores
-- | Runs an action on a model, and updates Modelling environment.
modelling :: Model m => (m -> IO m) -- ^ action transforming a Model
-> Modelling m -- ^ Modelling environment to which the action is applied
-> IO (Modelling m)
modelling act m = do m' <- act $ model m
sl <- SF.scores sf m'
return m { model = m'
, modelScores = sl
, scoring = sf
}
where
sf = scoring m
-- | Pretty showing score components within a given Modelling environment.
showModellingScore :: Model m => Modelling m
-> IO [BS.ByteString]
showModellingScore m = scoreShow (scoring m) (model m)
-- | Reports current score components within Modelling environment to stdout.
reportModellingScore :: Model m => Modelling m -> IO ()
reportModellingScore m = showModellingScore m >>= mapM_ BS.putStrLn
-- | Initializes Modelling environment with a scoring function and a model.
initModelling :: Model m => ScoringFunction -- ^ scoring function
-> m -- ^ input model
-> IO (Modelling m)
initModelling sf m = (\vals -> Modelling m vals sf) `fmap` scores sf m