module Cost.Raw where
open import Cost.Base using (CostingNat) open import Data.String open import Utils
{-# FOREIGN GHC import Data.SatInt (fromSatInt) #-}
{-# FOREIGN GHC import Data.Functor.Identity (Identity, runIdentity) #-}
{-# FOREIGN GHC import PlutusCore.Evaluation.Machine.ExBudget (ExBudget(..))  #-}
{-# FOREIGN GHC import PlutusCore.Evaluation.Machine.ExMemory (ExCPU(..), ExMemory(..)) #-}
{-# FOREIGN GHC import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCekMachineCostsForTesting) #-}
{-# FOREIGN GHC import UntypedPlutusCore.Evaluation.Machine.Cek.CekMachineCosts (CekMachineCostsBase(..)) #-}
postulate HCekMachineCosts : Set
postulate HExBudget : Set
{-# COMPILE GHC HCekMachineCosts = type CekMachineCostsBase Identity #-}
{-# COMPILE GHC HExBudget = type ExBudget #-}
postulate getCekStartupCost : HCekMachineCosts →  HExBudget
postulate getCekVarCost     : HCekMachineCosts →  HExBudget
postulate getCekConstCost   : HCekMachineCosts →  HExBudget
postulate getCekLamCost     : HCekMachineCosts →  HExBudget
postulate getCekDelayCost   : HCekMachineCosts →  HExBudget
postulate getCekForceCost   : HCekMachineCosts →  HExBudget
postulate getCekApplyCost   : HCekMachineCosts →  HExBudget
postulate getCekBuiltinCost : HCekMachineCosts →  HExBudget
postulate getCekConstrCost  : HCekMachineCosts →  HExBudget
postulate getCekCaseCost    : HCekMachineCosts →  HExBudget
{-# COMPILE GHC getCekStartupCost = runIdentity . cekStartupCost  #-}
{-# COMPILE GHC getCekVarCost     = runIdentity . cekVarCost      #-}
{-# COMPILE GHC getCekConstCost   = runIdentity . cekConstCost    #-}
{-# COMPILE GHC getCekLamCost     = runIdentity . cekLamCost      #-}
{-# COMPILE GHC getCekDelayCost   = runIdentity . cekDelayCost    #-}
{-# COMPILE GHC getCekForceCost   = runIdentity . cekForceCost    #-}
{-# COMPILE GHC getCekApplyCost   = runIdentity . cekApplyCost    #-}
{-# COMPILE GHC getCekBuiltinCost = runIdentity . cekBuiltinCost  #-}
{-# COMPILE GHC getCekConstrCost  = runIdentity . cekConstrCost   #-}
{-# COMPILE GHC getCekCaseCost    = runIdentity . cekCaseCost     #-}
postulate getCPUCost : HExBudget → CostingNat
postulate getMemoryCost : HExBudget → CostingNat
{-# COMPILE GHC getCPUCost = fromSatInt . (\(ExCPU x) -> x) . exBudgetCPU  #-}
{-# COMPILE GHC getMemoryCost = fromSatInt . (\(ExMemory x) -> x) . exBudgetMemory  #-}
-- postulate defaultHCekMachineCosts : HCekMachineCosts
-- {-# COMPILE GHC defaultHCekMachineCosts = defaultCekMachineCostsForTesting #-}
{-# FOREIGN GHC import PlutusCore.Evaluation.Machine.CostingFun.SimpleJSON  #-}
record LinearFunction : Set where
    constructor mkLinearFunction
    field
        intercept : CostingNat
        slope : CostingNat
{-# COMPILE GHC LinearFunction = data LinearFunction(LinearFunction) #-}
record OneVariableQuadraticFunction : Set where
    constructor mkOneVariableQuadraticFunction
    field
        coeff0 : CostingNat
        coeff1 : CostingNat
        coeff2 : CostingNat
{-# COMPILE GHC OneVariableQuadraticFunction = data OneVariableQuadraticFunction(OneVariableQuadraticFunction) #-}
record TwoVariableLinearFunction : Set where
    constructor mkTwoVariableLinearFunction
    field
        intercept : CostingNat
        slope1 : CostingNat
        slope2 : CostingNat
{-# COMPILE GHC TwoVariableLinearFunction = data TwoVariableLinearFunction(TwoVariableLinearFunction) #-}
record TwoVariableQuadraticFunction : Set where
    constructor mkTwoVariableQuadraticFunction
    field
        minimum : CostingNat
        coeff00 : CostingNat
        coeff10 : CostingNat
        coeff01 : CostingNat
        coeff20 : CostingNat
        coeff11 : CostingNat
        coeff02 : CostingNat
{-# COMPILE GHC TwoVariableQuadraticFunction = data TwoVariableQuadraticFunction(TwoVariableQuadraticFunction) #-}
record ExpModCostingFunction : Set where
    constructor mkExpModCostingFunction
    field
        coeff00 : CostingNat
        coeff11 : CostingNat
        coeff12 : CostingNat
{-# COMPILE GHC ExpModCostingFunction = data ExpModCostingFunction(ExpModCostingFunction) #-}
data RawModel : Set where
    ConstantCost          : CostingNat → RawModel
    AddedSizes            : LinearFunction → RawModel
    MultipliedSizes       : LinearFunction → RawModel
    MinSize               : LinearFunction → RawModel
    MaxSize               : LinearFunction → RawModel
    LinearInX             : LinearFunction → RawModel
    LinearInY             : LinearFunction → RawModel
    LinearInZ             : LinearFunction → RawModel
    LiteralInYOrLinearInZ : LinearFunction → RawModel
    LinearInMaxYZ         : LinearFunction → RawModel
    LinearInYAndZ         : TwoVariableLinearFunction -> RawModel
    QuadraticInY          : OneVariableQuadraticFunction → RawModel
    QuadraticInZ          : OneVariableQuadraticFunction → RawModel
    QuadraticInXAndY      : TwoVariableQuadraticFunction → RawModel
    SubtractedSizes       : LinearFunction → CostingNat → RawModel
    ConstAboveDiagonal    : CostingNat → RawModel → RawModel
    ConstBelowDiagonal    : CostingNat → RawModel → RawModel
    ConstOffDiagonal      : CostingNat → RawModel → RawModel
    ExpModCost            : ExpModCostingFunction → RawModel
{-# COMPILE GHC RawModel = data Model (ConstantCost | AddedSizes |
    MultipliedSizes | MinSize | MaxSize | LinearInX | LinearInY | LinearInZ |
    LiteralInYOrLinearInZ | LinearInMaxYZ | LinearInYAndZ |QuadraticInY |
    QuadraticInZ | QuadraticInXAndY | SubtractedSizes | ConstAboveDiagonal |
    ConstBelowDiagonal | ConstOffDiagonal | ExpModCost) #-}
record CpuAndMemoryModel : Set where
     constructor mkCpuAndMemoryModel
     field
        cpuModel : RawModel
        memoryModel : RawModel
{-# COMPILE GHC CpuAndMemoryModel = data CpuAndMemoryModel (CpuAndMemoryModel) #-}
BuiltinCostMap : Set
BuiltinCostMap = List (String × CpuAndMemoryModel)
RawCostModel : Set RawCostModel = HCekMachineCosts × BuiltinCostMap