0 | module Control.Monad.Sample.Instances
2 | import Control.Monad.Identity
6 | import Control.Monad.Distribution
7 | import Control.Monad.Sample.Definition
11 | [pickMax] Monad m => MonadSample m where
12 | sample = toCostate $
\d => pure (argmax d.logits)
16 | [pickMin] Monad m => MonadSample m where
17 | sample = toCostate $
\d => pure (argmin d.logits)
22 | sampleCubical : {n : Nat} -> {name : AxisName} ->
23 | Tensor [name ~~> n] Double -> IO (Maybe (Fin n))
24 | sampleCubical {n = Z} _ = pure Nothing
25 | sampleCubical {n = S k} logits = do
26 | let cumSum = Utils.cumulativeSum (softargmaxImpl logits)
27 | r <- randomRIO (0.0, 1.0)
28 | pure $
findBin (#> cumSum) r
32 | MonadSample IO where
33 | sample @{ne} @{fold} = toCostate $
\d => do
34 | Just k <- sampleCubical (flatten mapToList d.logits)
35 | | Nothing => pure (GetInterface ne d.logits.extractShapeRank1)
36 | pure (mapToList.bwd d.logits.extractShapeRank1 k)