Scruff.SFuncs
Scruff.SFuncs.Apply — TypeApply{J, O} <: SFunc{Tuple{SFunc{J, O}, J}, O}Apply represents an sfunc that takes two groups of arguments. The first group is a single argument, which is an sfunc to apply to the second group of arguments.
Additional supported operators
supportsupport_qualitysamplelogcpdfcompute_pisend_lambda
Type parameters
J: the input type of the sfunc that may be applied; that sfunc is the input type of theApplyO: the output type of the sfunc that may be applied, which is also the output type of theApply
Scruff.SFuncs.Cat — Typemutable struct Cat{O} <: Dist{O, Vector{Real}}Cat defines an sfunc that represents a set of categorical output values that are not conditioned on any input. Its parameters are always of type Vector{Real}, which is the probability of each output value.
Supported operations
supportsupport_qualitysamplecpdfbounded_probscompute_pif_expectation
Type parameters
O: the output type of theCat
Scruff.SFuncs.Chain — Typestruct Chain{I, J, K, O} <: Conditional{I, J, K, O, Nothing, Q, SFunc{J, O, Nothing}}A Conditional that chains its input I through a given function that returns an SFunc{J,O}.
Scruff.SFuncs.Conditional — Typeabstract type Conditional{I <: Tuple, J <: Tuple, K <: Tuple, O, S <: SFunc{J, O}} <: SFunc{K, O}Conditional sfuncs represent the generation of an sfunc depending on the values of parents. An subtype of Conditional must provide a gensf method that takes an I and returns an SFunc{J,O} (important the generated SFunc must not appear outside the Conditional. It should not be a parent).
Additional supported operators
supportsupport_qualitysamplelogcpdfmake_factorscompute_pisend_lambda
Type parameters
I: the type of data used to generate theConditional's sfuncJ: a tuple that represents the input types (theI) of theConditional's generated sfuncK: the input types of theConditional; this is a tuple of types constructed fromI,
and J using extend_tuple_types
O: the output type(s) of both theConditionaland theConditional's generated sfuncS: the type of theConditional's generated sfunc
Scruff.SFuncs.Constant — Typemutable struct Constant{O} <: Dist{O,Nothing}Constant represents an sfunc that always produces the same value. It has no inputs and no parameters.
Additional supported operators
supportsupport_qualitysamplelogcpdfbounded_probscompute_pi
Type parameters
O: the output type(s) of theConstant
Scruff.SFuncs.Det — Typeabstract type Det{I, O} <: SFunc{I, O}Det defines an sfunc that represents a deterministic function I -> O. When a Det is subtyped, a function apply(d::Det, i::I)::O or apply(d::Det, i::I...)::O must also be implemented. It has no parameters.
Additional supported operators
supportsupport_qualitysamplelogcpdfbounded_probsmake_factorscompute_pisend_lambda
Type parameters
I: the input type(s) of theDetO: the output type(s) of theDet
Scruff.SFuncs.Expander — Typemutable struct Expander{I,O} <: SFunc{I,O}An Expander represents a model defined by a function that returns a network. For a given value of an input, the conditional probability distribution is provided by the network produced by the function on that input.
For each such network, the expander manages a runtime to reason about it. Expanders are lazy and do not evaluate the function until they have to.
As a result, there is state associated with Expanders. This is analysis state rather than world state, i.e., it is the state of Scruff's reasoning about the Expander. In keeping with Scruff design, Expanders are immutable and all state associated with reasoning is stored in the runtime that contains the expander. To support this, a runtime has three fields of global state:
:subnets: the expansions of all Expanders managed by the runtime:subruntimes: all the subruntimes recursively managed by this runtime through Expanders, keyed by the networks:depth: the depth to which Expanders in this runtime should be expanded
Type parameters
I: the input type(s) of theExpanderO: the output type(s) of theExpander
Scruff.SFuncs.ExplicitDet — Typestruct ExplicitDet{I, O} <: Det{I, O}ExplicitDet is a Det that contains a field f::Function. It also has an apply method that simply delegates to the ExplicitDet's function:
apply(d::ExplicitDet, i...) = d.f(i...)julia> d = ExplicitDet{Tuple{Vararg{Real}},Real}(sum)
ExplicitDet{Tuple{Vararg{Real, N} where N}, Real}(sum)Scruff.SFuncs.Extend — Typestruct Extend{I<:Tuple{Any},J,O} <: SFunc{J,O}Extend defines an sfunc that extend the input of another sfunc. Useful for defining Separable SFuncs.
Additional supported operators
supportsupport_qualitysamplelogcpdfbounded_probsmake_factorscompute_pisend_lambda
Type parameters
I: the input type(s) of the extended sfunc; it must be a tuple of length 1J: the input type(s) of theExtendO: the output type(s) of both theExtendand the extended sfunc
Scruff.SFuncs.FunctionalScore — Typestruct FunctionalScore{I} <: Score{I}A score defined by a function.
Scruff.SFuncs.Generate — TypeGenerate{O} <: SFunc{Tuple{Dist{O}}, O}Generate a value from its Dist argument.
This helps in higher-order programming. A typical pattern will be to create an sfunc that produces a Dist, and then generate many observations from the Dist using Generate.
Additional supported operators
supportsupport_qualitysamplelogcpdfcompute_pisend_lambdamake_factors
Scruff.SFuncs.HardScore — TypeHardScore{I} <: Score{I}A fixed score.
Scruff.SFuncs.Invertible — Typestruct Invertible{I,O} <: SFunc{Tuple{I},O}An invertible sfunc, with both a forward and a inverse function provided.
Additional supported operators
supportsupport_qualitysamplelogcpdfbounded_probsmake_factorscompute_pisend_lambda
Scruff.SFuncs.LinearGaussian — Typemutable struct LinearGaussian{I <: Tuple{Vararg{Float64}}} <:
Conditional{I, Tuple{}, I, Float64, Normal}LinearGaussian defines an sfunc whose mean is a linear function of its parents. A LinearGaussian's output type is a Float, its parameter type is Tuple{I, Float64, Float64}, and it's contained sfunc is a Normal mean 0.0.
Type parameters
I: the input type(s) of theLinearGaussian
See also: Conditional, Normal
Scruff.SFuncs.LogScore — Typestruct LogScore{I} <: Score{I}A Log score.
Scruff.SFuncs.Mixture — Typemutable struct Mixture{I,O} <: SFunc{I,O}Mixture defines an sfunc representing mixtures of other sfuncs. It contains a vector of sfuncs and a vector of probabilities that those sfuncs are selected, which indices are keys associating the two. The output type of a Mixture is defined by the output type of its internal components. The parameters of a Mixture are its probabilities followed by parameters of all its internal components, in order.
Additional supported operators
supportsupport_qualitysamplecpdfexpectationcompute_pisend_lambda
Type parameters
I: the input type(s) of theMixtureO: the shared output type(s) of its internal components and the output type(s) of theMixture
Scruff.SFuncs.NetworkSFunc — Typestruct NetworkSFunc{I,O} <: SFunc{I,O}An sfunc that combines multiple sfuncs in a network structure.
Arguments
input_placeholders A vector of placeholders indicating the types of network inputs. The type parameter `I` is computed from these.
sfuncs The sfuncs to combine.
parents A `Dict` that maps sfuncs to their parent sfuncs. Note that this parallels networks,
except that we are mapping sfuncs to lists of sfuncs directly rather than variables to vectors of variables.
output A vector of output sfuncs, determining the `O` type parameter.Additional supported operators
samplesample_logcpdflogcpdf
Scruff.SFuncs.NormalScore — Typestruct NormalScore <: Score{Float64}A score defined by a normal density given the mean and sd of the score.
Scruff.SFuncs.Parzen — Typestruct Parzen <: Score{Float64}A parzen score.
Scruff.SFuncs.SepCPTs — TypeSepCPTs = Array{Dict{I, Array{Float64, 1}} where I}
Scruff.SFuncs.Serial — Typestruct Serial{I,O} <: SFunc{I,O}A sequence of sfuncs in series.
Although this could be implemented as a special case of NetworkSFunc, the serial composition allows an easier and more efficient implementation of operations. All but the first sfunc in the sequence will have a single input; the output of each sfunc feeds into the input of the next sfunc.
To work properly, most of the operations on Serial need the support of the intermediate sfuncs, given an input range. Rather than compute this each time, and to avoid having the non-support operations take a size argument, support is memoized, and must be called before other operations like logcpdf are called. The support_memo is a dictionary whose keys are tuples of parent ranges and whose values are the support computed for those parent ranges, along with the target size for which they were computed. Storing the target size enables refinement algorithms that increase the size and improve the support.
Additional supported operators
supportsupport_qualitysamplecpdfbounded_probsmake_factorscompute_pisend_lambda
Type parameters
- I the input type of the first sfunc
- O the output type of the last sfunc
Scruff.SFuncs.Switch — Typeabstract type Switch{N, I, K, O} <: Det{K, O}Switch defines an sfunc that represents choosing between multiple incoming (parent) Sfuncs based on a test. A subtype of Switch must provide a choose function that takes the switch and an i and returns an integer between 1 and N. This is an index into a 'parent array'.
K must be a flat tuple type consisting of I and N occurrences of O: for example, if I is Int
K = extend_tuple_type(Tuple{Int}, NTuple{N, O})If the subtype'd sfunc is not in the Scruff.SFuncs module, the system must import Scruff.SFuncs: choose.
Additional supported operators
supportsupport_qualitycompute_pisend_lambda
Type parameters
N: the count of sfuncs from which to chooseI: the type of the second argument of thechoosefunction defined for theSwitchK: the input type of theSwitch; see aboveO: the output type of theSwitch
See also: choose, extend_tuple_type
Scruff.SFuncs.CLG — MethodCLG(paramdict::Dict)Constructs an*sfunc representing a Conditional linear Gaussian. These sfuncs may have both discrete and continuous parents. For each combination of discrete parents, there is a LinearGaussian that depends on the continuous parents.
CLGs are implemented as a Table with a LinearGaussian.
The paramdict parameter defines the discrete and continuous parents, and the linear gaussean values where the length of a key is the count of the discrete inputs, the length of the tuple in a value is the count of continuous inputs, and the rest of the values are used to build the parameters for CLG itself. For example,
Dict((:x,1) => ((-1.0, 1.0, 2.0), 3.0, 1.0),
(:x,2) => ((-2.0, 4.0, 2.0), 3.0, 1.0),
(:x,3) => ((-3.0, 2.0, 2.0), 3.0, 1.0),
(:y,1) => ((-4.0, 5.0, 2.0), 3.0, 1.0),
(:y,2) => ((-5.0, 3.0, 2.0), 3.0, 1.0),
(:y,3) => ((-6.0, 6.0, 2.0), 3.0, 1.0))- the keys define two(2) discrete parents, with values `[:x,:y]` and `[1,2,3]`
- in the values, the first tuple defines three(3) continuous parents for each
underlying `LinearGausian`, with values `-1.0:-6.0`, `1.0:6.0`, and `2.0`
- the values `3.0` and `1.0` are mean/stddev of the underlying `LinearGaussian`See also: Table, LinearGaussian
Scruff.SFuncs.DiscreteCPT — Methodfunction DiscreteCPT(range::Vector{O}, paramdict::Dict{I, Vector{Float64}}) where {I <: Tuple, O}Constructs an sfunc that represents a Discrete Conditional Probability table.
DiscreteCPTs are implemented as a Table with a Cat.
The range parameter defines all the possible outputs of the DiscreteCPT. The paramdict parameter defines the input(s) and the actual CPT. For example,
range = [1, 2]
paramdict = Dict((1,1) => [0.3, 0.7], (1,2) => [0.6, 0.4], (2,1) =>[0.4, 0.6],
(2,2) => [0.7, 0.3], (3,1) => [0.5, 0.5], (3,2) => [0.8, 0.2])can create a DiscreteCPT which has two(2) inputs (the length of the key) and, given each input as defined by the key, selects either 1 or 2 (the range) with the given probability. So, if the input is (2,1), 1 is selected with probability 0.4 and 2 is selected with probability 0.6.
Scruff.SFuncs.Flip — MethodFlip(p)Constructs a very simple sfunc corresponding to a Bernoulli distribution, represented by a Cat. The output is true with probability p, and false with probability 1-p.
See also: Cat
Scruff.SFuncs.Separable — Methodfunction Separable(range::Vector{O}, probabilities :: Vector{Float64}, compparams :: SepCPTs) where OConstructs an sfunc representing separable models, defined by additive decompositon of a conditional probability distribution into separate distributions depending on each of the parents.
Separables are implemented as a Mixture of Extend sfuncs that extend DiscreteCPTs.
To construct a Separable, this method is passed the range of output values, the probabilities of each of the underlying DiscreteCPT (which are the internal sfuncs of the Mixture), and the parameters for each of the DiscreteCPTs. For example,
alphas = [0.2, 0.3, 0.5]
cpd1 = Dict((1,) => [0.1, 0.9], (2,) => [0.2, 0.8])
cpd2 = Dict((1,) => [0.3, 0.7], (2,) => [0.4, 0.6], (3,) => [0.5, 0.5])
cpd3 = Dict((1,) => [0.6, 0.4], (2,) => [0.7, 0.3])
cpds :: Array{Dict{I,Array{Float64,1}} where I,1} = [cpd1, cpd2, cpd3]
s = Separable([1, 2], alphas, cpds)See also: Mixture, Extend, DiscreteCPT, Table
Scruff.SFuncs.SoftScore — MethodSoftScore(scores::Dict{I,Float64})Return a LogScore of the keys and log values in score.
Scruff.SFuncs.SoftScore — MethodSoftScore(vs::Vector{I}, ss::Vector{Float64})Return a LogScore of the log values in ss vector for the associated keys in vs.
Scruff.SFuncs.choose — Functionchoose interface. For every subtype of Switch, an implementation of this method must be created, whose first parameter is the subtype, and the second parameter is of type I for the parameter type in Switch.
For example, the definition of the If sfunc is as follows, where choose returns either index 1 or index 2.
struct If{O} <: Switch{2, Bool, Tuple{Bool, O, O}, O} end
choose(::If, b::Bool) = b ? 1 : 2Scruff.SFuncs.extend_tuple_type — Methodextend_tuple_type(T1, T2)Given two types T1 and T2, concatenate the types into a single tuple type.
Arguments
T1: Any typeT2: A tuple type
Returns
- If
T1is a tuple type, a tuple with the concatenation of the types inT1andT2 - If
T1is not a tuple type, a tuple withT1prepended to the types inT2
Examples
julia> extend_tuple_type(Int64, Tuple{Float64})
Tuple{Int64, Float64}
julia> extend_tuple_type(Tuple{Int64}, Tuple{Float64})
Tuple{Int64, Float64}
julia> extend_tuple_type(Tuple{Vector{Float64}}, Tuple{Symbol,Symbol})
Tuple{Vector{Float64}, Symbol, Symbol}