# Network Formulations

## Type Hierarchy

We begin with the top of the hierarchy, where we can distinguish between AC and DC power flow models.

AbstractACPModel <: AbstractPowerModel
AbstractDCPModel <: AbstractPowerModel
AbstractWRModel <: AbstractPowerModel
AbstractWModel <: AbstractPowerModel
AbstractIVRModel <: AbstractPowerModel

## Power Models

Each of these forms can be used as the model parameter for a PowerModel:

ACPPowerModel <: AbstractACPForm

DCPPowerModel <: AbstractDCPForm

IVRPowerModel <: AbstractIVRModel

SOCWRPowerModel <: AbstractWRForm
QCRMPowerModel <: AbstractWRForm

SOCBFPowerModel <: AbstractSOCBFModel

For details on AbstractPowerModel, see the section on Power Model. A more comprehensive list of supported formulation is documented in Formulation Details.

## User-Defined Abstractions

Consider the class of conic Models for power flow models. One way of modeling them in this package is through the following type hierarchy:

AbstractConicPowerModel <: AbstractPowerModel
AbstractWRMModel <: AbstractConicPowerModel

AbstractSDPWRMModel <: AbstractWRMModel
mutable struct SDPWRMPowerModel <: AbstractSDPWRMModel @pm_fields end

The user-defined abstractions do not have to begin from the root AbstractPowerModel abstract type, and can begin from an intermediate abstract type. For example, in the following snippet:

AbstractDCPLLModel <: AbstractDCPModel

mutable struct DCPLLPowerModel <: AbstractDCPLLModel @pm_fields end