0 | {--
 1 | Copyright (C) 2021  Joel Berkeley
 2 |
 3 | This program is free software: you can redistribute it and/or modify
 4 | it under the terms of the GNU Affero General Public License as published
 5 | by the Free Software Foundation, either version 3 of the License, or
 6 | (at your option) any later version.
 7 |
 8 | This program is distributed in the hope that it will be useful,
 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 | GNU Affero General Public License for more details.
12 |
13 | You should have received a copy of the GNU Affero General Public License
14 | along with this program.  If not, see <https://www.gnu.org/licenses/>.
15 | --}
16 | ||| Functionality for probabilistic models.
17 | module Model
18 |
19 | import Distribution
20 | import Tensor
21 |
22 | ||| A `ProbabilisticModel` is a mapping from a feature domain to a probability distribution over
23 | ||| a target domain.
24 | |||
25 | ||| @features The shape of the feature domain.
26 | ||| @targets The shape of the target domain.
27 | ||| @marginal The type of mulitvariate marginal distribution over the target domain.
28 | public export
29 | interface Distribution marginal => ProbabilisticModel
30 |     (0 features, targets : Shape)
31 |     (0 marginal : (0 event : Shape) -> (0 dim : Nat) -> Type)
32 |     model | model
33 |   where
34 |     ||| Return the marginal distribution over the target domain at the specified feature values.
35 |     marginalise : model -> {n : _} -> Tensor (S n :: features) F64 -> Tag $ marginal targets (S n)
36 |