18 | module Spidr.BayesianOptimization.Acquisition
20 | import Control.Monad.Reader
21 | import Control.Monad.Identity
24 | import Spidr.Distribution
26 | import Spidr.Model.Supervised
29 | %prefix_record_projections off
33 | record DataModel modelType {auto probabilisticModel : ProbabilisticModel f t marginal modelType} where
34 | constructor MkDataModel
40 | dataset : Dataset f t
42 | %prefix_record_projections on
51 | Acquisition : (0 batchSize : Nat) -> {auto 0 _ : GT batchSize 0} -> (0 features : Shape) -> Type
52 | Acquisition batchSize features = Tensor (batchSize :: features) F64 -> Tag $
Tensor [] F64
60 | expectedImprovement :
61 | ProbabilisticModel features [1] Gaussian m =>
63 | (best : Tensor [] F64) ->
64 | Acquisition 1 features
65 | expectedImprovement model best at = do
67 | marginal <- tag =<< marginalise model at
68 | let best' = broadcast {to = [_, 1]} best
69 | pdf <- tag =<< pdf marginal best'
70 | cdf <- tag =<< cdf marginal best'
71 | let mean = squeeze !(mean {event = [1]} {dim = 1} marginal)
72 | variance = squeeze !(variance {event = [1]} marginal)
73 | pure $
(best - mean) * cdf + variance * pdf
78 | expectedImprovementByModel :
79 | ProbabilisticModel features [1] Gaussian modelType =>
80 | ReaderT (DataModel modelType) Tag $
Acquisition 1 features
81 | expectedImprovementByModel = MkReaderT $
\env => do
82 | marginal <- marginalise env.model env.dataset.features
83 | best <- tag $
squeeze !(reduce @{Min} [0] !(mean {event = [1]} marginal))
84 | pure $
expectedImprovement env.model best
89 | probabilityOfFeasibility :
90 | (limit : Tensor [] F64) ->
91 | ClosedFormDistribution [1] dist =>
92 | ProbabilisticModel features [1] dist modelType =>
93 | ReaderT (DataModel modelType) Tag $
Acquisition 1 features
94 | probabilityOfFeasibility limit =
95 | asks $
\env, at => do cdf !(marginalise env.model at) (broadcast {to = [_, 1]} limit)
102 | negativeLowerConfidenceBound :
104 | {auto 0 betaNonNegative : beta >= 0 = True} ->
105 | ProbabilisticModel features [1] Gaussian modelType =>
106 | ReaderT (DataModel modelType) Tag $
Acquisition 1 features
107 | negativeLowerConfidenceBound beta = asks $
\env, at => do
108 | marginal <- tag =<< marginalise env.model at
110 | !(mean {event = [1]} marginal) - fill beta * !(variance {event = [1]} marginal)
119 | expectedConstrainedImprovement :
120 | (limit : Tensor [] F64) ->
121 | ProbabilisticModel features [1] Gaussian modelType =>
122 | ReaderT (DataModel modelType) Tag (Acquisition 1 features -> Acquisition 1 features)