Custom model types
The abstract supertype for all models is AbstractSem, which has two subtypes, AbstractSemSingle{O, I, L} and AbstractSemCollection. Currently, there are 2 subtypes of AbstractSemSingle: Sem, SemFiniteDiff. All subtypes of AbstractSemSingle should have at least observed, implied, loss and optimizer fields, and share their types ({O, I, L}) with the parametric abstract supertype. For example, the SemFiniteDiff type is implemented as
struct SemFiniteDiff{O <: SemObserved, I <: SemImplied, L <: SemLoss} <:
       AbstractSemSingle{O, I, L}
    observed::O
    implied::I
    loss::L
endAdditionally, you can change how objective/gradient/hessian values are computed by providing methods for evaluate!, e.g. from SemFiniteDiff's implementation:
evaluate!(objective, gradient, hessian, model::SemFiniteDiff, params) = ...Additionally, we can define constructors like the one in "src/frontend/specification/Sem.jl".
It is also possible to add new subtypes for AbstractSemCollection.