# PumasModel-Domains

Domains are used to define the param portion of a PumasModel. This segment of the documentation describes the available Domain types that can be used within the param portions.

## Matching Parameter Types and Domains

A param specification in a PumasModel directly defines the types which are required to be given as the input to the model's API functions such as simobs and fit. For example, if the param specification is given as:

@param begin
θ ∈ VectorDomain(2; lower=[0.0,0.0], upper=[20.0,20.0])
Ω ∈ PSDDomain(2)
Σ ∈ RealDomain(; lower=0.01, upper=0.2)
end

Then in simobs(model, data, param) or fit(model, data, param), the parameters param must be a NamedTuple of values where the type fits in the domain. For example, param must have param.θ as a Vector. Thus the following would be a valid definition of param for this structure:

param = (
θ = [0.4, 7.0],
Ω = [0.04 0.0
0.0  0.01],
Σ = 0.1
)

Below are the specifications of the Domain types and their matching value types.

## RealDomain and VectorDomain

RealDomain and VectorDomain are the core domain types of Pumas. A RealDomain defines a scalar value which exists in the real line, while a VectorDomain defines a real-valued vector which lives in a hypercube of $\mathbb{R}^n$. The length n of a VectorDomain is a required positional argument. Each of these allow keyword arguments for setting an upper and lower bound for the segment, where for the RealDomain these are scalars and for the VectorDomain it is a vector of upper and lower bound for each component of the vector. Thus the constructors are:

RealDomain(; upper, lower)
VectorDomain(n; upper, lower)

A RealDomain requires that the matching parameters are an AbstractFloat type. A VectorDomain requires that the matching parameters are a Vector of an AbstactFloat type which has the correct size.

## Positive-Definite Matrix Domains

In many cases, one may wish to specify a positive-definite covariance matrix as a parameter in a model. A common use case for this functionality is for defining the domain of a random effect. There are two domains for positive-definite matrices: PSDDomain and PDiagDomain. Both of the constructors require the size n of the n x n postive-definite matrix:

PSDDomain(n)
PDiagDomain(n)

A PSDDomain requires that the matching matrix input is positive definite but puts no further restrictions on the matrix. If a domain is specified as Ω ∈ PSDDomain(2), then

Ω = [0.04 0.0
0.0  0.01]

is a valid parameter specification. The PDiagDomain restricts the parameter space to positive definite diagonal matricesis, i.e. diagonal matrices with positive diagonal elemenets. Thus, if a domain is specified as Ω ∈ PDiagDomain(2), then

Ω = Diagonal([0.0, 1.0])

is a valid parameter specification.

## Distributional Domains

Instead of using a Domain type from Pumas, a Distribution can be used to specify a domain. For example,

Ω ~ Normal(0.0, 1.0)

is a valid domain specification. If this is done, then the probability distribution is used and interpreted as the prior distribution. Implicitly, the domain of a distribution is treated as the support of the distribution. A distributional domain requires that the matching parameter is of the same type as a sample from the domain. For example, if Ω ~ Normal(0,1), then Ω should be given as a scalar.

## Constrained

The Constrained domain is for defining a Constrained probability distribution. Constrained takes in a distribution and has keyword arguments for upper and lower bounds. For example, ψ ~ Constrained(MVNormal(Ω),lower=[0.0,0.0]) defines a ψ to be from the distributional domain which corresponds to a multivariate normal distribution, but is constrained to be positive. Like with the distributional domains, Constrained requires that the matching parameter is of the same type as a sample from the domain.