text:
using BSON: @save

# Loss types:

function norm_diff!(x,y)
    return sqrt(sum((x - y).^2) / sum(y.^2))
end

function error_loss!(model, input, output)
    model_result = model(input)
    return norm_diff!(model_result, output|>cgpu)
end

function get_matrices!(alpha, kappa, omega, gamma)
    inv = reshape([u_type(-1.0)],1,1,1,1)|> cgpu

    s_h_real = (kappa .* kappa .* omega .* omega)
    h_imag = kappa .* kappa .* omega .* gamma
    s_imag = (kappa .* kappa .* omega .* omega .* alpha) .+ (kappa .* kappa .* omega .* gamma)

    h_matrix = cat(cat(s_h_real, h_imag, dims=3),cat(inv .* h_imag, s_h_real, dims=3),dims=4) |> cgpu
    s_matrix = cat(cat(s_h_real, s_imag, dims=3),cat(inv .* s_imag, s_h_real, dims=3),dims=4) |> cgpu

    return h_matrix, s_matrix
end

function residual_loss!(model, n, m, f, input, output)
    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    h = u_type(2.0 ./ (n+m))
    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu

    e0 = model(input)

    r_unet = (h^2) .* helmholtz_chain_channels!(e0, h_matrix; h=h)|> cgpu
    return norm_diff!(r_unet, r)
end

function error_residual_loss!(model, n, m, f, input, output)
    e0 = model(input)

    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    h = u_type(2.0 ./ (n+m))
    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu
    r_unet = (h^2) .* helmholtz_chain_channels!(e0, h_matrix; h=h)|> cgpu

    e_loss = norm_diff!(e0, output|>cgpu)
    r_loss = norm_diff!(r_unet, r)

    return e_loss + 0.1 * r_loss
end

function error_residual_loss_details!(model, n, m, f, input, output)
    e0 = model(input)

    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    h = u_type(1.0 ./ n)
    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu
    r_unet = (h^2) .* helmholtz_chain_channels!(e0, h_matrix; h=h)|> cgpu

    e_loss = norm_diff!(e0, output|>cgpu)
    r_loss = norm_diff!(r_unet, r)

    return [e_loss + 0.1 * r_loss, r_loss, e_loss]
end

function append_input!(tuple, extension)
    return (cat(tuple[1], extension, dims=3), tuple[2])
end

function convert_input!(tuple)
    return (u_type.(tuple[1]), u_type.(tuple[2]))
end

function batch_loss!(set, loss; errors_count=1, gamma_input=false, append_gamma=identity)
    set_size = size(set,1)
    batch_size = min(1000,set_size)
    batchs = floor(Int64,set_size/batch_size)
    loss_sum = zeros(errors_count)
    for batch_idx in 1:batchs
        batch_set = set[(batch_idx-1)*batch_size+1:batch_idx*batch_size]
        if gamma_input == true
            batch_set = append_gamma.(batch_set)
        end
        current_loss = loss.(batch_set|>cgpu)
        loss_sum = loss_sum .+ sum(hcat(current_loss...),dims=2)
    end
    return (loss_sum ./ set_size)
end

function jacobi_channels!(n, x, b, matrix; w=0.8)
    h = 2.0 ./ (n+m)

    y = helmholtz_chain_channels!(x, matrix; h=h)|> cgpu
        residual = b - y
    d = u_type(4.0 / h^2) .- sum(matrix, dims=4)
    alpha = u_type(w) ./ d
    step = alpha .* residual

    return x .+ step
end

function full_solution_loss!(model, input, output, n, m, f)
    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    e = output
    h = u_type(2.0 ./ (n+m))

    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu

    e0 = model(input)

    ae1 = (h^2) .* helmholtz_chain_channels!(e0, h_matrix; h=h)|> cgpu

    return norm_diff!(e0, e|> cgpu) + norm_diff!(ae1, r)
end

function full_solution_loss_details!(model, input, output, n, m, f)
    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    e = output
    h = u_type(2.0 ./ (n+m))

    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu

    e0 = model(input)

    ae1 = (h^2) .* helmholtz_chain_channels!(e0, h_matrix; h=h)|> cgpu

    return [norm_diff!(e0, e|> cgpu) + norm_diff!(ae1, r), norm_diff!(e0, e|> cgpu), norm_diff!(ae1, r)]
end

function full_solution_loss1!(model, input, output, n, m, f)
    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    e = output
    h = u_type(2.0 ./ (n+m))

    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu

    e0 = model(input)

    e1 = jacobi_channels!(n, e0, r ./ (h^2), h_matrix)|> cgpu
    ae1 = (h^2) .* helmholtz_chain_channels!(e1, h_matrix; h=h)|> cgpu
    r1 = r - ae1

    e2 = model(cat(r1,kappa,gamma,dims=3)|> cgpu)
    e3 = e1 + e2

    e4 = jacobi_channels!(n, e3, r ./ (h^2), h_matrix)
    # ae4 = (h^2) .* helmholtz_chain_channels!(e4, h_matrix; h=h)|> cgpu
    # r2 = r - ae4

    # e5 = model(cat(r2,kappa,gamma,dims=3)|> cgpu)
    # e6 = e4 + e5

    # e7 = jacobi_channels!(n, e6, r ./ (h^2), h_matrix)

    return norm_diff!(e0, e|> cgpu) + norm_diff!(e3, e|> cgpu) + norm_diff!(e4, e|> cgpu)
    #return norm_diff!(e0, e|> cgpu) + norm_diff!(e1, e|> cgpu) + norm_diff!(e3, e|> cgpu) + norm_diff!(e4, e|> cgpu) + norm_diff!(e6, e|> cgpu) + norm_diff!(e7, e|> cgpu)
end

function full_solution_loss_details1!(model, input, output, n, m, f)
    r = reshape(input[:,:,1:2,1],n-1,m-1,2,1)|> cgpu
    kappa = reshape(input[:,:,3,1],n-1,m-1,1,1)|> cgpu
    gamma = reshape(input[:,:,4,1],n-1,m-1,1,1)|> cgpu
    omega = reshape([u_type(2.0*pi*f)],1,1,1,1)|> cgpu
    alpha = reshape([u_type(0.5)],1,1,1,1)|> cgpu
    e = output
    h = u_type(2.0 ./ (n+m))

    h_matrix, s_matrix = get_matrices!(alpha, kappa, omega, gamma)|> cgpu

    e0 = model(input)
    # @info "e0 $(size(e0)) $(typeof(e0)) h_matrix $(size(h_matrix)) $(typeof(h_matrix))"
    e1 = jacobi_channels!(n, e0, r ./ (h^2), h_matrix)|> cgpu
    ae1 = (h^2) .* helmholtz_chain_channels!(e1, h_matrix; h=h)|> cgpu
    r1 = r - ae1

    e2 = model(cat(r1,kappa,gamma,dims=3)|> cgpu)
    e3 = e1 + e2

    e4 = jacobi_channels!(n, e3, r ./ (h^2), h_matrix)
    # ae4 = (h^2) .* helmholtz_chain_channels!(e4, h_matrix; h=h)|> cgpu
    # r2 = r - ae4

    # e5 = model(cat(r2,kappa,gamma,dims=3)|> cgpu)
    # e6 = e4 + e5

    # e7 = jacobi_channels!(n, e6, r ./ (h^2), h_matrix)

    # if norm(r) > 70 && norm(r) < 70.005 # mod(print_index,1000) == 0
    #     @info "e $(norm(e)) r $(norm(r)) e0 $(norm(e0)) e1 $(norm(e1)) ae1 $(norm(ae1)) r1 $(norm(r1)) e2 $(norm(e2)) e3 $(norm(e3)) e4 $(norm(e4)) ae4 $(norm(ae4)) r2 $(norm(r2)) e5 $(norm(e5)) e6 $(norm(e6)) e7 $(norm(e7))"
    #     @info "e $(norm(e)) r $(norm(r)) e0 $(norm(e0)) e1 $(norm(e1)) ae1 $(norm(ae1)) r1 $(norm(r1)) e2 $(norm(e2)) e3 $(norm(e3)) e4 $(norm(e4)) ae4 $(norm(ae4)) r2 $(norm(r2)) e5 $(norm(e5)) e6 $(norm(e6)) e7 $(norm(e7))"
    #
    # end
    # print_index = print_index+1
    return [norm_diff!(e0, e|> cgpu) + norm_diff!(e3, e|> cgpu) + norm_diff!(e4, e|> cgpu),
            norm_diff!(e0, e|> cgpu), norm_diff!(e3, e|> cgpu), norm_diff!(e4, e|> cgpu)] #  + norm_diff!(e4, e|> cgpu) + norm_diff!(e6, e|> cgpu) + norm_diff!(e7, e|> cgpu)
end

function train_residual_unet!(model, test_name, n, m, f, kappa, omega, gamma,
                            train_size, test_size, batch_size, iterations, init_lr;
                            e_vcycle_input=true, v2_iter=10, level=3, data_augmentetion=true, kappa_type=1, threshold=50,
                            kappa_input=true, kappa_smooth=false, k_kernel=3, gamma_input=false, kernel=(3,3), smaller_lr=10, axb=false, jac=false, norm_input=false,
                            model_type=SUnet, k_type=NaN, k_chs=-1, indexes=3, data_path="", full_loss=false, residual_loss=false, error_details=false, gmres_restrt=1, σ=elu) #, model=NaN)

    @info "$(Dates.format(now(), "HH:MM:SS")) - Start Train $(test_name)"

    if data_path != ""
        train_set = get_csv_set!(data_path, n, train_size)
        test_set = get_csv_set!(data_path, n, test_size)
    else
        train_set = generate_random_data!(train_size, n, m, kappa, omega, gamma;
                                                e_vcycle_input=e_vcycle_input, v2_iter=v2_iter, level=level, data_augmentetion =data_augmentetion,
                                                kappa_type=kappa_type, threshold=threshold, kappa_input=kappa_input, kappa_smooth=kappa_smooth, k_kernel=k_kernel, axb=axb, jac=jac, norm_input=norm_input, gmres_restrt=gmres_restrt)
        test_set = generate_random_data!(test_size, n, m, kappa, omega, gamma;
                                                e_vcycle_input=e_vcycle_input, v2_iter=v2_iter, level=level,
                                                kappa_type=kappa_type, threshold=threshold, kappa_input=kappa_input, kappa_smooth=kappa_smooth, k_kernel=k_kernel, axb=axb, jac=jac, norm_input=norm_input, gmres_restrt=gmres_restrt)
    end
    @info "$(Dates.format(now(), "HH:MM:SS")) - Generated Data"
    mkpath("models")

    # if model == NaN
    #     model = create_model!(e_vcycle_input, kappa_input, gamma_input; kernel=kernel, type=model_type, k_type=k_type, k_chs=k_chs, indexes=indexes, σ=σ)|>cgpu
    # end
    #
    batchs = floor(Int64,train_size / batch_size) # (batch_size*10))
    test_loss = zeros(iterations)
    train_loss = zeros(iterations)
    CSV.write("$(test_name) loss.csv", DataFrame(Train=[], Test=[]), delim = ';')
    errors_count = 4
    if errors_count > 1 && full_loss == true
        # CSV.write("$(test_name) loss.csv", DataFrame(Train=[],Train_U1=[],Train_J1=[],Train_U2=[],Train_J2=[],Train_U3=[],Train_J3=[],Test=[]), delim = ';') # ,Test_U1=[],Test_J1=[],Test_U2=[],Test_J2=[])
        # CSV.write("$(test_name) loss.csv", DataFrame(Train=[],Train_E=[],Train_R=[],Test=[],Test_E=[],Test_R=[]), delim = ';') # ,Test_U1=[],Test_J1=[],Test_U2=[],Test_J2=[])
        CSV.write("test/unet/results/$(test_name) loss.csv", DataFrame(Train=[],Train_U1=[],Train_U2=[],Train_J2=[],Test=[]), delim = ';')

    end
    if residual_loss == true
        CSV.write("$(test_name) loss.csv", DataFrame(Train=[], Residual=[], Error=[], Test=[]), delim = ';')
    end
    loss!(x, y) = error_loss!(model, x, y)
    full_loss!(x, y) = full_solution_loss1!(model, x, y, n, m, f)
    r_loss!(x ,y) = error_residual_loss!(model, n, m, f, x, y)
    loss!(tuple) = loss!(tuple[1], tuple[2])
    full_loss_details!(tuple) = full_solution_loss_details1!(model, tuple[1], tuple[2], n, m, f)
    r_loss_details!(tuple) = error_residual_loss_details!(model, n, m, f, tuple[1], tuple[2])

    # Start model training
    append_gamma!(tuple) = append_input!(tuple,gamma)
    lr = init_lr
    opt = RADAM(lr)
    for iteration in 1:iterations
        if mod(iteration,smaller_lr) == 0
            lr = lr / 10
            opt = RADAM(lr)
            batch_size = min(batch_size * 2,512)
            batchs = floor(Int64,train_size / min((batch_size),train_size)) #*10
            smaller_lr = ceil(Int64,smaller_lr / 2)
            @info "$(Dates.format(now(), "HH:MM:SS")) - Update Learning Rate $(lr) Batch Size $(batch_size)"
        end
        idxs = randperm(train_size)
        for batch_idx in 1:batchs
            batch_set = train_set[idxs[(batch_idx-1)*batch_size+1:batch_idx*batch_size]]
            if gamma_input == true
                batch_set = append_gamma!.(batch_set)
            end
            batch_set = convert_input!.(batch_set) |>cgpu
            if full_loss == true
                Flux.train!(full_loss!, Flux.params(model), batch_set, RADAM(lr))
            elseif residual_loss == true
                Flux.train!(r_loss!, Flux.params(model), batch_set, RADAM(lr))
            else
                Flux.train!(loss!, Flux.params(model), batch_set, RADAM(lr))
            end
        end

        if full_loss == true
            test_res = batch_loss!(test_set, full_loss_details!;errors_count=errors_count,gamma_input=gamma_input,append_gamma=append_gamma!)
            train_res = batch_loss!(train_set, full_loss_details!;errors_count=errors_count,gamma_input=gamma_input,append_gamma=append_gamma!)
            test_loss[iteration] = test_res[1]
            train_loss[iteration] = train_res[1]
            CSV.write("$(test_name) loss.csv", DataFrame(Train=[train_res[1]],Train_U1=[train_res[2]],Train_U2=[train_res[3]],Train_J2=[train_res[4]],Test=[test_res[1]]), delim = ';', append=true)

            # CSV.write("$(test_name) loss.csv", DataFrame(Train=[train_res[1]],Train_U1=[train_res[2]],Train_J1=[train_res[3]],Train_U2=[train_res[4]],Train_J2=[train_res[5]],Train_U3=[train_res[6]],Train_J3=[train_res[7]],Test=[test_res[1]]), delim = ';', append=true)
            #CSV.write("$(test_name) loss.csv", DataFrame(Train=[train_res[1]],Train_E=[train_res[2]],Train_R=[train_res[3]],Test=[test_res[1]],Test_E=[test_res[2]],Test_R=[test_res[3]]), delim = ';', append=true)

        elseif residual_loss == true
            test_res = batch_loss!(test_set, r_loss_details!;gamma_input=gamma_input,append_gamma=append_gamma!)
            train_res = batch_loss!(train_set, r_loss_details!;gamma_input=gamma_input,append_gamma=append_gamma!)
            test_loss[iteration] = test_res[1]
            train_loss[iteration] = train_res[1]
            CSV.write("$(test_name) loss.csv", DataFrame(Train=[train_res[1]], Residual=[train_res[2]], Error=[train_res[3]], Test=[test_res[1]]), delim = ';',append=true)
        else
            test_loss[iteration] = batch_loss!(test_set, loss!;gamma_input=gamma_input,append_gamma=append_gamma!)[1]
            train_loss[iteration] = batch_loss!(train_set, loss!;gamma_input=gamma_input,append_gamma=append_gamma!)[1]
            CSV.write("$(test_name) loss.csv", DataFrame(Train=[train_loss[iteration]], Test=[test_loss[iteration]]), delim = ';',append=true)
        end

        @info "$(Dates.format(now(), "HH:MM:SS")) - $(iteration)) Train loss value = $(train_loss[iteration]) , Test loss value = $(test_loss[iteration])"

        if mod(iteration,30) == 0
            model = model|>cpu
            @save "models/$(test_name).bson" model
            @info "$(Dates.format(now(), "HH:MM:SS")) - Save Model $(test_name).bson"

            model = model|>cgpu
        end
    end

    model = model|>cpu
    @save "models/$(test_name).bson" model
    @info "$(Dates.format(now(), "HH:MM:SS")) - Save Model $(test_name).bson"

    model = model|>cgpu
    return model, train_loss, test_loss
end


text:
@testset "Selections" begin

  atoms = readPDB("./structure.pdb")

  @test length(select(atoms,"name CA")) == 104
  sel = select(atoms,"index = 13")
  @test length(sel) == 1
  @test sel[1].index == 13
  @test sel[1].index_pdb == 13

  @test length(select(atoms,"index > 1 and index < 13")) == 11

  @test length(select(atoms,"protein")) == 1463

  @test length(select(atoms,"water")) == 58014

  @test length(select(atoms,"resname GLY")) == 84

  @test length(select(atoms,"segname PROT")) == 1463

  @test length(select(atoms,"residue = 2")) == 11

  @test length(select(atoms,"neutral")) == 1182

  @test length(select(atoms,"charged")) == 281

  @test length(select(atoms,"sidechain")) == 854

  @test length(select(atoms,"acidic")) == 162

  @test length(select(atoms,"basic")) == 68

  @test length(select(atoms,"hydrophobic")) == 327

  @test length(select(atoms,"hydrophobic")) == 327

  @test length(select(atoms,"aliphatic")) == 379

  @test length(select(atoms,"aromatic")) == 344

  @test length(select(atoms,"polar")) == 880

  @test length(select(atoms,"nonpolar")) == 583

  @test maxmin(atoms,"chain A").xlength ≈ [83.083, 83.028, 82.7]

  # Test editing a field
  atoms[1].index = 0
  @test atoms[1].index == 0

  # Test residue iterator
  someresidues = select(atoms,"residue < 15")
  n = 0
  m = 0.
  for res in eachresidue(someresidues)
    if name(res) == "SER"
      n += 1
      for atom in res
        m += mass(atom)
      end
    end
  end
  @test n == 4
  @test m ≈ 348.31340000000006

  # Residue properties (discontinous set)
  lessresidues = select(someresidues,"residue < 3 or residue > 12")
  @test residue.(eachresidue(lessresidues)) == [1, 2, 13, 14]
  @test resnum.(eachresidue(lessresidues)) == [1, 2, 13, 14]
  @test name.(eachresidue(lessresidues)) == ["ALA", "CYS", "SER", "SER"]
  @test resname.(eachresidue(lessresidues)) == ["ALA", "CYS", "SER", "SER"]
  @test chain.(eachresidue(lessresidues)) == ["A", "A", "A", "A"]
  @test model.(eachresidue(lessresidues)) == [1, 1, 1, 1]

end

ext: jl


text:
#CMDimData: Tools to easily manipulate continuous, multi-dimensional datasets.
#-------------------------------------------------------------------------------
__precompile__(true)
#=
TAGS:
	#WANTCONST, HIDEWARN_0.7
=#

module CMDimData

using Colors
using MDDatasets
import Pkg

const rootpath = realpath(joinpath(@__DIR__, ".."))
NullOr{T} = Union{Nothing, T}

include("EasyPlot/EasyPlot.jl")
include("EasyData/EasyData.jl")

#==Subpackage manipulations
===============================================================================#

#Add a CMDimData subpackage to the active environment.
function pkgadd(pkgname::Symbol)
	throw(:NOTIMPL)
	repo = "https://github.com/ma-laforge/CMDimData"
	@show Pkg.add(PackageSpec(path=repo, subdir="subpkgs/$pkgname"))
end

#==Initialization
===============================================================================#
#Mimick import by including package code into the caller's module
macro includepkg(pkgname::Symbol)
#=Import glue code in caller's module.
	Expected that caller's module has access to dependency information on both
	`CMDimData` & dependencies of included module.

	Sadly, precompile of package code cannot be reused across Julia sessions.
	NOTE: Must call __init__() because it is only called on legitimate packages (not modules)
=#
	path = realpath(joinpath(rootpath,"subpkgs/$pkgname/src/$pkgname.jl"))
	m = quote
		if !@isdefined $pkgname
			include($path)
			$pkgname.__init__()
		end
	end
	return esc(m) #esc: Evaluate in calling module
end

function __init__()
	return
end

end # module


text:
using Test
using NumCME
using LinearAlgebra
using Sundials: CVODE_BDF

## Bursting gene model
𝕊 = [[-1, 1, 0] [1, -1, 0] [0, 0, 1] [0, 0, -1]]
x₀ = [1, 0, 0]
k₀₁ = 0.05
k₁₀ = 0.1
λ = 5.0
γ = 1.0

θ = [k₀₁, k₁₀, λ, γ]

# Propensity formulations that have no dependencies on parameters
a1 = propensity() do x, p
    k₀₁ * x[1]
end
a2 = propensity((t, p) -> max(0.0, 1.0 - sin(π * t / 2))) do x, p
    k₁₀ * x[2]
end
a2j = propensity() do t, x, p
    max(0.0, 1.0 - sin(π * t / 2)) * k₁₀ * x[2]
end
a3 = propensity() do x, p
    λ * x[2]
end
a4 = propensity() do x, p
    γ * x[3]
end

# Propensity formulations that have dependencies on parameters
a1_p = propensity() do x, p
    p[1] * x[1]
end
a2_p = propensity((t, p) -> max(0.0, 1.0 - sin(π * t / 2))) do x, p
    p[2] * x[2]
end
a3_p = propensity() do x, p
    p[3] * x[2]
end
a4_p = propensity() do x, p
    p[4] * x[3]
end

bursting_model = CmeModel(𝕊, [a1, a2, a3, a4], [])
@test typeof(bursting_model) <: CmeModel

bursting_model_parameterized = CmeModel(𝕊, [a1_p, a2_p, a3_p, a4_p], θ)
@test typeof(bursting_model_parameterized) <: CmeModel

# Fixed FSP solver
# Solve to get dense outputs
tspan = (0.0, 120.0)
𝔛 = StateSpaceSparse(𝕊, x₀)
expand!(𝔛, 20)
p0 = FspVectorSparse(𝔛, [[1, 0, 0] => 1.0])
solutions = solve(bursting_model, p0, tspan, CVODE_BDF(linear_solver = :GMRES), odertol = 1.0e-4, odeatol = 1.0e-14);
@test typeof(solutions) <: FspOutputSparse
@test prod([typeof(solutions[i]) <: FspOutputSliceSparse for i in 1:length(solutions)])
@test prod(
    [(sum(p) + sum(sinks) ≈ 1.0) for (p, sinks) in zip(solutions.p, solutions.sinks)
])

# Solve to get outputs at specific times
tspan = (0.0, 120.0)
toutputs = 0.0:20.0:120.0
𝔛 = StateSpaceSparse(𝕊, x₀)
expand!(𝔛, 20)
p0 = FspVectorSparse(𝔛, [[1, 0, 0] => 1.0])
solutions = solve(bursting_model, p0, tspan, CVODE_BDF(linear_solver = :GMRES), odertol = 1.0e-4, odeatol = 1.0e-14, saveat = toutputs);
@test prod(
    [(sum(p) + sum(sinks) ≈ 1.0) for (p, sinks) in zip(solutions.p, solutions.sinks)
])
@test length(solutions) == length(toutputs)

# Consistency between using parameter-free representation and parametric representation
tspan = (0.0, 120.0)
toutputs = 0.0:20.0:120.0
p0 = FspVectorSparse(StateSpaceSparse(𝕊, x₀), [x₀ => 1.0])
fspmethod = AdaptiveFspSparse(
    ode_method = CVODE_BDF(linear_solver = :GMRES),
    space_adapter = SelectiveRStepAdapter(10, 10, true)
)

fspsolutions1 = solve(bursting_model, p0, tspan, fspmethod, odertol = 1.0e-4, odeatol = 1.0e-14, saveat = toutputs)
@test prod(
    [(sum(p) + sum(sinks) ≈ 1.0) for (p, sinks) in zip(fspsolutions1.p, fspsolutions1.sinks)
])

fspsolutions2 = solve(bursting_model_parameterized, p0, tspan, fspmethod, odertol = 1.0e-4, odeatol = 1.0e-14, saveat = toutputs)
@test prod(
    [(sum(p) + sum(sinks) ≈ 1.0) for (p, sinks) in zip(fspsolutions2.p, fspsolutions2.sinks)
])

@test prod(
    [norm(p1.values - p2.values, 1) ≤ 1.0E-14 for (p1, p2) in zip(fspsolutions1.p, fspsolutions2.p)]
)


text:
# TODO
# (1) faster updates with single determinant or matrix inverse
# (2) monitor energy, magnetization, etc.

mutable struct DQMC
    L::Int
    h::Float64
    x::BitArray # state
    F::Matrix{Float64} # Pfaffian
    invF::Matrix{Float64} # inverse Pfaffian
end

function DQMC(L::Int, h::Float64)
    F = pairing(L, h)
    invF = inv(F)
    if rand() > 0.5
        init_x = falses(L)
    else
        init_x = trues(L)
    end
    DQMC(L, h, init_x, F, invF)
end

function fast_update!(x::AbstractArray, F::Matrix, L::Int, h::Float64,
                      old_weight::Float64)
    # println(" ")
    # display(x')
    # r = sample(1:L, rand(1:L), replace = false)
    r = rand(1:L, rand(2:2:L))
    @. x[r] = !x[r]
    new_weight = F[x .> 0, x .> 0] |> det
    ratio = new_weight / old_weight
    # if sum(x) > 0
    # D = F[x .> 0, x .> 0]
    # display(F[x .> 0, x .> 0])
    # display(pinv(F[x .> 0, x .> 0]))
    # end
    # newratio = 1 + inv(F[x .> 0, x .> 0])[r,r] * B' #* inv(F[x .> 0, x .> 0]) * B
    # println("old ratio - new ratio", ratio - newratio)
    if rand() > min(1, ratio)
        @. x[r] = !x[r] # flip back
        return old_weight
    else
        return new_weight
    end
end

function sweep!(x::AbstractArray, F::Matrix, L::Int, h::Float64)
    old_weight = F[x .> 0, x .> 0] |> det
    for _ in 1:2 * L
        old_weight = fast_update!(x, F, L, h, old_weight)
    end
end

function single_sample(;L = 4, h = 1.0, N = 100, file = false)
    if file != false
        println("Removing file", file)
        Base.Filesystem.rm(file, force=true)
    end
    model = DQMC(L, h)
    configs = [] #Vector{BitVector}
    @showprogress 1 "warming up..." for i in 1:N
        sweep!(model.x, model.F, model.L, model.h)
    end
    @showprogress 1 "running MC..." for i in 1:N
        sweep!(model.x, model.F, model.L, model.h)
        push!(configs, copy(model.x))
        if file ≠ false
            open(file * ".txt", "a") do f
                writedlm(f, Int.(model.x'))
            end
        end
    end
    return configs
end

function sample(;nrepeats=4, L = 4, h = 1.0, N = 100, file = false)
    nrepeats = 2 * L
    configs = single_sample(L=L, h=h, N=N, file=file)
    # @showprogress for i in 1:nrepeats-1
        configs = vcat(single_sample(L=L, h=h, N=N, file=file), configs)
    # end
    return configs
end


text:
import CSV

# Is this the idiomatic way of specifying types?
# https://csv.juliadata.org/stable/#Providing-Types
file = CSV.File("input_file.txt", header=false; types=[Int])

# Specifying types makes this crash somehow.  Ask Lorenzo later.
complement_dict = Dict()

total = 2020

for row in file
    complement_dict[row[1]] = total - row[1]
end

complement = 0
key = 0

for (k, v) in complement_dict
    try
        complement_dict[v]
        global key = k
        global complement = v
    catch error
    end
end

if complement == 0
    println("Error!!!")
else
    product = key * complement
    println("The two values are $key and $complement.  The product is $product")
end


text:
function solve()
    a, b = [parse(Int, x) for x in split(readline())]
    a*b
end

println(solve())

max_stars_repo_name: aishikawa/atcoder-julia

max_issues_repo_name: aishikawa/atcoder-julia

max_forks_repo_name: aishikawa/atcoder-julia


text:
# StdSharedPtr

eval(cxxnewfile("StdSharedPtr.cxx", """
    #include <memory>
    """))

Base.cconvert(::Type{Ptr{StdSharedPtr{T}}}, ptr::StdSharedPtr{T}) where {T} = ptr.cxx

convert_arg(::Type{Ptr{StdSharedPtr{T}}}, ptr::StdSharedPtr{T}) where {T} = ptr.cxx
convert_result(::Type{StdSharedPtr{T}}, ptr::Ptr{StdSharedPtr{T}}) where {T} = StdSharedPtr{T}(ptr)

StdSharedPtr{T}() where {T} = StdSharedPtr_new(T)

function generate(::Type{StdSharedPtr{T}}) where {T}
    CT = T == Bool ? "bool" : cxxtype[T]
    NT = cxxname(CT)

    eval(cxxfunction(FnName(Symbol(:StdSharedPtr_new), "std_shared_ptr_$(NT)_new", libSTL),
                     FnResult(Ptr{StdSharedPtr{T}}, "std::shared_ptr<$CT> *", StdSharedPtr{T}, expr -> :(StdSharedPtr{$T}($expr))),
                     [FnArg(:type, Nothing, "type", "void", Type{T}, identity; skip=true)], "return new std::shared_ptr<$CT>;"))

    eval(cxxfunction(FnName(:StdSharedPtr_delete, "std_shared_ptr_$(NT)_delete", libSTL), FnResult(Nothing, "void"),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
                     "delete ptr;"))

    eval(cxxfunction(FnName(:(Base.copy), "std_shared_ptr_$(NT)_copy", libSTL),
                     FnResult(Ptr{StdSharedPtr{T}}, "std::shared_ptr<$CT> *", StdSharedPtr{T}, expr -> :(StdSharedPtr{$T}($expr))),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
                     "return new std::shared_ptr<$CT>(*ptr);"))

    eval(cxxfunction(FnName(:(Base.empty!), "std_shared_ptr_$(NT)_empty_", libSTL), FnResult(Nothing, "void"),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
                     "ptr->reset();"))

    eval(cxxfunction(FnName(:(Base.isempty), "std_shared_ptr_$(NT)_isempty", libSTL), FnResult(Bool, "bool"),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "const std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
                     "return !*ptr;"))

    # if T == Bool
    #     eval(cxxfunction(FnName(:(Base.getindex), "std_shared_ptr_$(NT)_getindex", libSTL), FnResult(T, CT),
    #                      [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
    #                      "return **ptr;"))
    # else
    eval(cxxfunction(FnName(:(Base.getindex), "std_shared_ptr_$(NT)_getindex", libSTL),
                     FnResult(Ptr{T}, "$CT *", T, expr -> :(convert_result($T, $expr))),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
                     "return &**ptr;"))
    # end

    eval(cxxfunction(FnName(:(Base.setindex!), "std_shared_ptr_$(NT)_setindex_", libSTL), FnResult(Nothing, "void"),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity),
                      FnArg(:val, Ptr{T}, "val", "$CT const *", Any, expr -> :(convert_arg(Ptr{$T}, convert($T, $expr))))],
                     "**ptr = *val;"))

    eval(cxxfunction(FnName(:use_count, "std_shared_ptr_$(NT)_use_count", libSTL),
                     FnResult(Csize_t, "std::size_t", Int, expr -> :(convert(Int, $expr))),
                     [FnArg(:ptr, Ptr{StdSharedPtr{T}}, "ptr", "const std::shared_ptr<$CT> * restrict", StdSharedPtr{T}, identity)],
                     "return ptr->use_count();"))

    eval(cxxfunction(FnName(:(Base.:(==)), "std_shared_ptr_$(NT)_equals", libSTL), FnResult(Bool, "bool"),
                     [FnArg(:ptr1, Ptr{StdSharedPtr{T}}, "ptr1", "const std::shared_ptr<$CT> * restrict", StdSharedPtr{T},
                            identity),
                      FnArg(:ptr2, Ptr{StdSharedPtr{T}}, "ptr2", "const std::shared_ptr<$CT> * restrict", StdSharedPtr{T},
                            identity)], "return *ptr1 == *ptr2;"))

    eval(cxxfunction(FnName(:make_shared, "std_make_shared_$(NT)", libSTL),
                     FnResult(Ptr{StdSharedPtr{T}}, "std::shared_ptr<$CT> *", StdSharedPtr{T}, expr -> :(StdSharedPtr{$T}($expr))),
                     [FnArg(:type, Nothing, "type", "void", Type{T}, identity; skip=true),
                      FnArg(:val, Ptr{T}, "val", "$CT const *", Any, expr -> :(convert_arg(Ptr{$T}, convert($T, $expr))))],
                     """
                     auto valptr = std::make_shared<$CT>(*val);
                     auto ptr = new std::shared_ptr<$CT>;
                     ptr->swap(valptr);
                     return ptr;
                     """))

    return nothing
end

const StdSharedPtr_types = value_types
for T in sort!(collect(StdSharedPtr_types); by=string)
    generate(StdSharedPtr{T})
end

export use_count
export make_shared

free(ptr::StdSharedPtr) = StdSharedPtr_delete(ptr)

Base.eltype(::StdSharedPtr{T}) where {T} = T

################################################################################

GCStdSharedPtr{T}() where {T} = GCStdSharedPtr{T}(StdSharedPtr{T}())

free(ptr::GCStdSharedPtr) = free(vec.managed)

Base.empty(ptr::GCStdSharedPtr) = empty!(ptr.managed)
Base.isempty(ptr::GCStdSharedPtr) = isempty(ptr.managed)
Base.getindex(ptr::GCStdSharedPtr) = getindex(ptr.managed)
Base.setindex!(ptr::GCStdSharedPtr, val) = setindex!(ptr.managed, val)
Base.eltype(::GCStdSharedPtr{T}) where {T} = eltype(StdSharedPtr{T})


text:
using NodesAndModes
using StartUpDG
using UnPack
using LinearAlgebra
using SparseArrays
using FluxDiffUtils
using StaticArrays
using Plots

N = 7
K = 16
T = 1.5
CFL = .025

interval = 50

rd = RefElemData(Line(),N; quad_rule_vol=gauss_lobatto_quad(0,0,N))
VX,EToV = uniform_mesh(Line(),K)
md_BCs = MeshData(VX,EToV,rd)
md = make_periodic(md_BCs,rd)

@unpack M,Dr,Vf,LIFT = rd

Q = M*Dr
Q1 = diagm(1=>ones(N))-diagm(-1=>ones(N))
Q1[1,1] = -1
Q1[N+1,N+1] = 1
@. Q1 = .5*Q1
E = M*LIFT

fS(uL,uR) = @. (uL*uL + uL*uR + uR*uR)/6.0
dS(uL,uR) = @. .5*max(abs(uL),abs(uR))*(uL-uR)

function rhs(u,Qskew,E,rd,md)
    @unpack Vf = rd
    @unpack rxJ,nxJ,mapP = md
    uf = Vf*u
    return rxJ.*(Qskew*u) + .5*E*(uf[mapP].*nxJ)
end
function rhsf(u,E,rd,md)
    @unpack Vf = rd
    @unpack nxJ,mapP = md
    uf = Vf*u
    return .5*E*(uf[mapP].*nxJ)
end
function build_rhs_matrix(rhs::F,Np,K) where {F}
    A = zeros(Np*K,Np*K)
    u = zeros(Float64,Np,K)
    for i = 1:Np*K
        u[i] = 1.0
        A[:,i] .= vec(rhs(u))
        u[i] = 0.0
    end
    return droptol!(sparse(A),1e-12)
end
Qg = build_rhs_matrix(u->rhs(u,.5*(Q-Q'),E,rd,md),N+1,K)
Bg = build_rhs_matrix(u->rhsf(u,E,rd,md),N+1,K)
QgTr = -Qg # assume skew-symmetric
Q1g = build_rhs_matrix(u->rhs(u,.5*(Q1-Q1'),E,rd,md),N+1,K)
Q1gTr = -Q1g # assume skew-symmetric

# matrix used in convex limiting
ΔQ = .5*(Q1-Q1') - .5*(Q-Q')

function hadsum(ATr::SparseMatrixCSC,F::Fxn,u) where {Fxn}
    rhs = similar(u)
    rows = rowvals(ATr)
    vals = nonzeros(ATr)
    for i = 1:size(ATr,2)
        ui = u[i]
        val_i = zero(ui)
        for row_id in nzrange(ATr,i)
            j = rows[row_id]
            val_i += vals[row_id]*F(ui,u[j])
        end
        rhs[i] = val_i
    end
    return rhs
end

@unpack x,J = md
MJ = M*J
invm = 1 ./ vec(M*J)
x = vec(x)
u = @. (x > -1/3)*1.0

u1 = similar(u)
uN = similar(u)
rhsu = similar(u)
l = reshape(similar(u),N+1,K)
L = zeros(N+1,N+1)

dt = CFL*(x[2]-x[1]) / maximum(abs.(u))
Nsteps = ceil(Int,T/dt)
dt = T/Nsteps
ubounds = extrema(u)

init_mass = sum(vec(MJ).*u)
@gif for i = 1:Nsteps
    global u
    r1 = hadsum(Q1gTr,fS,u) + .5*hadsum(abs.(Q1gTr),dS,u)
    rN = hadsum(QgTr,fS,u) + .5*hadsum(abs.(Bg),dS,u)

    # low order update
    @. u1 = u - dt*invm*r1
    @. uN = u - dt*invm*rN

    u = reshape(u,N+1,K)

    # local limiting
    for e = 1:K
        u1e = @view reshape(u1,N+1,K)[:,e]
        uNe = @view reshape(uN,N+1,K)[:,e]
        uNmin = minimum(uNe)
        θ = max(0.0,min(1.0, minimum(@. u1e / (u1e-uNmin + 1e-7))))
        u[:,e] = @. u1e + θ*(uNe-u1e)
        # l[:,e] .= 0.0
        # if θ > 1e-10 # for plotting
            l[:,e] .= 1-θ
        # end
    end

    # # node-wise convex limiting
    # for e = 1:K
    #     uL,uR = NodesAndModes.meshgrid(@view u[:,e])
    #     A = ΔQ .* fS(uL,uR) - .5*abs.(.5*(Q1-Q1')) .* dS(uL,uR)
    #     λij = 1/(N+1)
    #     for i = 1:N+1
    #         for j = 1:N+1
    #             λij = MJ[i,e]/(N+1)
    #             L[i,j] = 1.0
    #             if u[i,e] + dt*A[i,j]/λij > 0 # need u[i,e] + lij * dt * Aij / λij > 0
    #                 L[i,j] = 1.0
    #             elseif abs(A[i,j]) > 1e-14
    #                 L[i,j] = λij * (1e-16 - u[i,e]) / A[i,j]
    #             end
    #         end
    #     end
    #     # fill!(L,minimum(L))
    #     u[:,e] = reshape(u1,N+1,K)[:,e] + dt*sum(min.(L,L').*A,dims=2) ./ @view MJ[:,e]
    #     l[:,e] = 1 .- sum(min.(L,L'),dims=2)/(N+1)
    # end

    u = vec(u)

    if i%interval==0
        println("$i / $Nsteps: $ubounds, $(extrema(u))")
        plot(x,u,mark=:dot,ms=2,ylims=ubounds .+ (-1,1))
        plot!(reshape(x,N+1,K),l,leg=false)
    end
end every interval

Δmass = sum(vec(MJ).*u)-init_mass
println("Δmass = $Δmass")

max_stars_repo_name: yiminllin/ESDG-PosLimit

max_issues_repo_name: yiminllin/ESDG-PosLimit

max_forks_repo_name: yiminllin/ESDG-PosLimit


text:
### A Pluto.jl notebook ###
# v0.17.3

using Markdown
using InteractiveUtils

# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error).
macro bind(def, element)
    quote
        local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end
        local el = $(esc(element))
        global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el)
        el
    end
end

# ╔═╡ 7057fdae-7b4a-42d4-8cd9-75999e72ecb7
begin
	using ClimateModels, Pkg, CairoMakie, NetCDF, PlutoUI
	using Suppressor, OrderedCollections, Git, UUIDs, DataFrames
	"Done with loading packages"
end

# ╔═╡ a3f9fb60-d889-4320-a979-dddd87ff173f
md"""# SPEEDY Atmosphere (Fortran)

Here we setup, run and plot a fast atmospheric model called [speedy.f90](https://github.com/samhatfield/speedy.f90) (_Simplified Parameterizations, privitivE-Equation DYnamics_). Documentation about the model can be found [here](https://samhatfield.co.uk/speedy.f90/) and [here](https://www.ictp.it/research/esp/models/speedy.aspx).

As done with the other models, we define a new concrete type, `SPEEDY_config`, and the rest of the `ClimateModels.jl` interface implementation for this new type (`setup`, `build`, and `launch`) in this notebook.
"""

# ╔═╡ a63753bd-5b83-4324-8bf9-8b3532c6b3d4
md"""## Setup, Build, and Launch"""

# ╔═╡ c9f91552-b7d4-41c5-bfbd-13888bf290a2
md"""### Model Run Duration

####

How many simulated month?

$(@bind nmonths NumberField(1:24))
"""

# ╔═╡ 6ff81750-6060-4f40-b3ce-fee20c9c1b1f
md"""### Animate Plots

####

Click start to start browsing through model output. Or stop at anypoint to pause.

$(@bind ti Clock(1.0))"""

# ╔═╡ 2bd3aba3-fbac-499b-9364-ec391b195f95
md"""### Model Interface Details"""

# ╔═╡ 22e7ecc9-a40e-47ea-8cda-2a6441ca8dbe
"""
	struct SPEEDY_config <: AbstractModelConfig

Concrete type of `AbstractModelConfig` for `SPEEDY` model.
"""
Base.@kwdef struct SPEEDY_config <: AbstractModelConfig
	model :: String = "speedy"
	configuration :: String = "default"
	options :: OrderedDict{Any,Any} = OrderedDict{Any,Any}()
	inputs :: OrderedDict{Any,Any} = OrderedDict{Any,Any}()
	outputs :: OrderedDict{Any,Any} = OrderedDict{Any,Any}()
	status :: OrderedDict{Any,Any} = OrderedDict{Any,Any}()
	channel :: Channel{Any} = Channel{Any}(10)
	folder :: String = tempdir()
	ID :: UUID = UUIDs.uuid4()
end

# ╔═╡ 4dc8c2fa-269b-427e-aab1-5a541c91a011
begin
	import ClimateModels: build
	function build(x :: SPEEDY_config)
	    pth0=pwd()
	    pth=pathof(x)

	    cd(pth)
	    if Sys.isapple()
	        ENV["NETCDF"] = "/usr/local/Cellar/netcdf/4.8.0_1/" #may differ between computers
	    else
	        ENV["NETCDF"] = "/usr/" #may differ between computers
	    end
	    @suppress run(`bash build.sh`)
	    cd(pth0)
	end
end

# ╔═╡ a2582849-bea6-4447-94ba-06147266c67a
function SPEEDY_launch(x::SPEEDY_config)
    pth0=pwd()
    pth=pathof(x)
    cd(pth)
    @suppress run(`bash run.sh`)
    cd(pth0)
end

# ╔═╡ 24c0cf26-5a59-461f-817e-5b4c95d15e1d
begin
	import ClimateModels: setup
	function setup(x :: SPEEDY_config)
	    !isdir(joinpath(x.folder)) ? mkdir(joinpath(x.folder)) : nothing
	    pth=pathof(x)
	    !isdir(pth) ? mkdir(pth) : nothing

	    url="https://github.com/gaelforget/speedy.f90"
	    @suppress run(`$(git()) clone -b more_diags $url $pth`)

	    !isdir(joinpath(pth,"log")) ? git_log_init(x) : nothing

	    put!(x.channel,SPEEDY_launch)
	end
end

# ╔═╡ 59211a03-6212-4f56-8d0a-66a0a805d9f0
begin
	MC=SPEEDY_config()
	setup(MC)
	"Done with setup"
end

# ╔═╡ a1f311f6-2dc2-46da-a48c-a5edc910b888
with_terminal() do
	show(MC)
end

# ╔═╡ 7d7aea6b-a5de-4ad6-88fd-b05049f4f36a
begin
	(ny,nm)=divrem(nmonths+1,12)
	nm==0 ? (ny,nm)=(ny-1,12) : nothing
	(ny,nm)

	nml_ini="! nsteps_out = model variables are output every nsteps_out timesteps
! nstdia     = model diagnostics are printed every nstdia timesteps
&params
nsteps_out = 180
nstdia     = 180
/
! start_datetime = the start datetime of the model integration
! end_datetime   = the end datetime of the model integration
&date
start_datetime%year   = 1982
start_datetime%month  = 1
start_datetime%day    = 1
start_datetime%hour   = 0
start_datetime%minute = 0
end_datetime%year     = $(1982+ny)
end_datetime%month    = $(nm)
end_datetime%day      = 1
end_datetime%hour     = 0
end_datetime%minute   = 0
/
"

	write(joinpath(pathof(MC),"namelist.nml"),nml_ini)

	"Done with parameter file"
end

# ╔═╡ 91cd170b-7e8d-4abe-b000-46745e531c8f
begin
	exe=joinpath(homedir(),"speedy")
	exe_link=joinpath(pathof(MC),"bin","speedy")
	if isfile(exe)*!isfile(exe_link)
		pth=joinpath(pathof(MC),"bin")
		!isdir(pth) ? mkdir(pth) : nothing
		symlink(exe,exe_link)
	elseif !isfile(exe_link)
		build(MC)
	end
	"Done with build"
end

# ╔═╡ 7e9e1b6b-f0c8-4da1-820f-fb65214e7cd3
begin
	nmonths
	launch(MC)
	tst="Done with launch"
end

# ╔═╡ c11fddfa-db75-48ba-a197-0be048ec60b3
begin
	#IDa="7c9a3f54-f972-4e0d-9514-4a3d4cb39492"
	IDa=string(MC.ID)

	function plot_output_xy(files,varname="hfluxn",time=1,level=1)
		(lon,lat,lev,values,fil)=read_output(files,varname,time)
		length(size(values))==4 ? tmp = values[:,:,level,1] : tmp = values[:,:,1]
		ttl = varname*" , at $(lev[level]) σ, $(basename(fil)[1:end-3])"

		set_theme!(theme_light())
		f=Figure(resolution = (900, 600))
		a = Axis(f[1, 1],xlabel="longitude",ylabel="latitude",title=ttl)
		co = Makie.contourf!(a,lon,lat,tmp)
		Colorbar(f[1,2], co, height = Relative(0.65))

		f
	end

	function plot_output_zm(files,varname="hfluxn",time=1)
		tmp=read_output(files,varname,time)

		ttl = varname*" , zonal mean , $(basename(tmp.fil)[1:end-3])"
		set_theme!(theme_light())
		f=Figure(resolution = (900, 600))

		if length(size(tmp.values))==4
			val=dropdims(sum(tmp.values,dims=1);dims=(1,4))/length(tmp.lon)
			a = Axis(f[1, 1],xlabel="longitude",ylabel="latitude",title=ttl)
			co = Makie.contourf!(a,tmp.lat,reverse(-tmp.lev),reverse(val;dims=2),
				 frmt=:png,ylabel="-σ",xlabel="latitude (°N)")
			Colorbar(f[1,2], co, height = Relative(0.65))
		else
			val=dropdims(sum(tmp.values,dims=1);dims=(1,3))
			a = Axis(f[1, 1],"latitude (°N)",title=ttl)
			Plots.plot!(a,tmp.lat,val)
		end

		f
	end

	function list_files_output(x::SPEEDY_config)
			pth=pathof(x)
			tmp=readdir(joinpath(pth,"rundir"))
			files=tmp[findall(occursin.("198",tmp))[2:end]]
			nt=length(files)
			[joinpath(pth,"rundir",t) for t in files]
	end

	function read_output(files,varname="t",time=1)
		nt=length(files)
		isnothing(time) ? t=1 : t=mod(time,Base.OneTo(nt))
		ncfile = NetCDF.open(files[t])

		lon = ncfile.vars["lon"][:]
		lat = ncfile.vars["lat"][:]
		lev = ncfile.vars["lev"][:]
		tmp = ncfile.vars[varname]

		return (lon=lon,lat=lat,lev,values=tmp,fil=files[t])
	end

	𝑉=DataFrame(name=String[],long_name=String[],unit=String[],ndims=Int[])
	push!(𝑉,("u","eastward_wind","m/s",3))
	push!(𝑉,("v","northward_wind","m/s",3))
	push!(𝑉,("t","air_temperature","K",3))
	push!(𝑉,("q","specific_humidity","1",3))
	push!(𝑉,("phi","geopotential_height","m",3))
	#two-dimensional variables:
	push!(𝑉,("ps","surface_air_pressure","Pa",2))
	push!(𝑉,("hfluxn","surface_heat_flux","W/m2",2))
	push!(𝑉,("evap","evaporation","g/(m^2 s)",2))

	md"""## Plot Model Output

	####

	Select Variable to Read and Plot:

	$(@bind myvar Select(𝑉.name))

	####

	List of Possible Output Variables :
	"""
end

# ╔═╡ d46e35ad-da83-41c1-b802-6c52bbd58a32
with_terminal() do
	show(𝑉)
end

# ╔═╡ cda60695-fc07-42cb-b78c-9f3de34fb826
begin
	tst
	files=list_files_output(MC)
	f_xy=plot_output_xy(files,myvar,ti,8)
	f_zm=plot_output_zm(files,myvar,ti)
	"Plots have been updated -- they are displayed below."
end

# ╔═╡ feead29a-c475-4b4b-93d2-8bf2adcc4a3e
#files
md"""Zonal mean:

$(f_zm)

Surface level:

$(f_xy)
"""

# ╔═╡ 0787d4ae-4764-40b4-b607-acf3903210f4
begin
	#sea_surface_temperature.nc
	#86400/36/60=40 minutes time step
	#180/36=5days
	rundir=joinpath(pathof(MC),"rundir")

	function get_msk()
		ncfile = NetCDF.open(joinpath(rundir,"surface.nc"))
		lsm=ncfile.vars["lsm"]
		msk=Float64.(reverse(lsm,dims=2))
		msk[findall(msk[:,:].==1.0)].=NaN
		msk[findall(msk[:,:].<1.0)].=1.0
		msk
	end
	msk=get_msk()

	function plot_input(x::SPEEDY_config,varname="sst",time=1)
		isnothing(time) ? t=1 : t=mod(time,Base.OneTo(12))
		ncfile = NetCDF.open(joinpath(rundir,"sea_surface_temperature.nc"))
		lon = ncfile.vars["lon"][:]
		lat = reverse(ncfile.vars["lat"][:])
		tmp = reverse(ncfile.vars[varname][:,:,t],dims=2)
		tmp[findall(tmp.==9.96921f36)].=NaN

		set_theme!(theme_light())
		f=Figure(resolution = (900, 600))
		a = Axis(f[1, 1],xlabel="longitude",ylabel="latitude",title=varname*" (month $t)")
		co = Makie.contourf!(a,lon,lat,(msk.*tmp), levels=273 .+collect(-32:4:32),colorrange=(273-32,273+32))
		Colorbar(f[1,2], co, height = Relative(0.65))

		f
	end

	md"""## Appendices

	- Plot Model Input
	- Model Parameters
	- Model Interface Details

	### Plot Model Input

	Here we display the SST input field that drives the Atmosphere model.

	Chosen month : $(@bind to NumberField(1:12))
	"""
end

# ╔═╡ 6ed201f2-f779-4f82-bc22-0c66ac0a4d74
plot_input(MC,"sst",to)

# ╔═╡ 4ae7e302-10d5-11ec-0c5e-838d34e10c23
begin
	tst

	import MITgcmTools: read_namelist
	pp=dirname(pathof(ClimateModels))
	include(joinpath(pp,"../examples/helper_functions.jl"))
	nml=read_namelist(MC)
	nml[:params]
	nml[:date]

	md"""### Model Parameters
	"""
end

# ╔═╡ 4ad62ce6-606d-4784-adf6-b96319006082
with_terminal() do
	println("parameters groups : ")
	println(keys(nml))
	println("")
	println("nml[:params] has : ")
	println(nml[:params])
	println("")
	println("nml[:date] has :")
	println(nml[:date])
end

# ╔═╡ ee4443c0-5c12-4c6b-8c5b-1eca7cc62c37
TableOfContents()

# ╔═╡ 00000000-0000-0000-0000-000000000001
PLUTO_PROJECT_TOML_CONTENTS = """
[deps]
CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
ClimateModels = "f6adb021-9183-4f40-84dc-8cea6f651bb0"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Git = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
MITgcmTools = "62725fbc-3a66-4df3-9000-e33e85b3a198"
NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9"
OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[compat]
CairoMakie = "~0.6.6"
ClimateModels = "~0.1.20"
DataFrames = "~1.3.1"
Git = "~1.2.1"
MITgcmTools = "~0.1.32"
NetCDF = "~0.11.3"
OrderedCollections = "~1.4.1"
PlutoUI = "~0.7.25"
Suppressor = "~0.2.0"
"""

# ╔═╡ 00000000-0000-0000-0000-000000000002
PLUTO_MANIFEST_TOML_CONTENTS = """
# This file is machine-generated - editing it directly is not advised

julia_version = "1.7.0"
manifest_format = "2.0"

[[deps.AWS]]
deps = ["Base64", "Compat", "Dates", "Downloads", "GitHub", "HTTP", "IniFile", "JSON", "MbedTLS", "Mocking", "OrderedCollections", "Retry", "Sockets", "URIs", "UUIDs", "XMLDict"]
git-tree-sha1 = "82e9580aff0d2c1703f4bf38a9de79e927f252f9"
uuid = "fbe9abb3-538b-5e4e-ba9e-bc94f4f92ebc"
version = "1.74.0"

[[deps.AbstractFFTs]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "485ee0867925449198280d4af84bdb46a2a404d0"
uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
version = "1.0.1"

[[deps.AbstractPlutoDingetjes]]
deps = ["Pkg"]
git-tree-sha1 = "abb72771fd8895a7ebd83d5632dc4b989b022b5b"
uuid = "6e696c72-6542-2067-7265-42206c756150"
version = "1.1.2"

[[deps.AbstractTrees]]
git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.3.4"

[[deps.Adapt]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "84918055d15b3114ede17ac6a7182f68870c16f7"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
version = "3.3.1"

[[deps.Animations]]
deps = ["Colors"]
git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d"
uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340"
version = "0.4.1"

[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"

[[deps.ArrayInterface]]
deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"]
git-tree-sha1 = "265b06e2b1f6a216e0e8f183d28e4d354eab3220"
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
version = "3.2.1"

[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"

[[deps.Automa]]
deps = ["Printf", "ScanByte", "TranscodingStreams"]
git-tree-sha1 = "d50976f217489ce799e366d9561d56a98a30d7fe"
uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
version = "0.8.2"

[[deps.AxisAlgorithms]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7"
uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
version = "1.0.1"

[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"

[[deps.Blosc]]
deps = ["Blosc_jll"]
git-tree-sha1 = "575bdd70552dd9a7eaeba08ef2533226cdc50779"
uuid = "a74b3585-a348-5f62-a45c-50e91977d574"
version = "0.7.2"

[[deps.Blosc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "91d6baa911283650df649d0aea7c28639273ae7b"
uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9"
version = "1.21.1+0"

[[deps.Bzip2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e"
uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
version = "1.0.6+5"

[[deps.CEnum]]
git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9"
uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
version = "0.4.1"

[[deps.CFTime]]
deps = ["Dates", "Printf"]
git-tree-sha1 = "bca6cb6ee746e6485ca4535f6cc29cf3579a0f20"
uuid = "179af706-886a-5703-950a-314cd64e0468"
version = "0.1.1"

[[deps.CSV]]
deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"]
git-tree-sha1 = "49f14b6c56a2da47608fe30aed711b5882264d7a"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
version = "0.9.11"

[[deps.Cairo]]
deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"]
git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b"
uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
version = "1.0.5"

[[deps.CairoMakie]]
deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "SHA", "StaticArrays"]
git-tree-sha1 = "774ff1cce3ae930af3948c120c15eeb96c886c33"
uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
version = "0.6.6"

[[deps.Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "e2f47f6d8337369411569fd45ae5753ca10394c6"
uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
version = "1.16.0+6"

[[deps.CatViews]]
deps = ["Random", "Test"]
git-tree-sha1 = "23d1f1e10d4e24374112fcf800ac981d14a54b24"
uuid = "81a5f4ea-a946-549a-aa7e-2a7f63a27d31"
version = "1.0.0"

[[deps.ChainRulesCore]]
deps = ["Compat", "LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "4c26b4e9e91ca528ea212927326ece5918a04b47"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
version = "1.11.2"

[[deps.ChangesOfVariables]]
deps = ["ChainRulesCore", "LinearAlgebra", "Test"]
git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1"
uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0"
version = "0.1.2"

[[deps.ClimateModels]]
deps = ["AWS", "CFTime", "CSV", "DataFrames", "Dates", "Downloads", "Git", "NetCDF", "OrderedCollections", "Pkg", "Statistics", "Suppressor", "TOML", "Test", "UUIDs", "Zarr"]
git-tree-sha1 = "15ba5b736e675d5e79fe5ad0e7a8f67a286ffe31"
uuid = "f6adb021-9183-4f40-84dc-8cea6f651bb0"
version = "0.1.20"

[[deps.CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.0"

[[deps.ColorBrewer]]
deps = ["Colors", "JSON", "Test"]
git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4"
uuid = "a2cac450-b92f-5266-8821-25eda20663c8"
version = "0.4.0"

[[deps.ColorSchemes]]
deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"]
git-tree-sha1 = "a851fec56cb73cfdf43762999ec72eff5b86882a"
uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
version = "3.15.0"

[[deps.ColorTypes]]
deps = ["FixedPointNumbers", "Random"]
git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597"
uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
version = "0.11.0"

[[deps.ColorVectorSpace]]
deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"]
git-tree-sha1 = "3f1f500312161f1ae067abe07d13b40f78f32e07"
uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
version = "0.9.8"

[[deps.Colors]]
deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40"
uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
version = "0.12.8"

[[deps.Compat]]
deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"]
git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
version = "3.41.0"

[[deps.CompilerSupportLibraries_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"

[[deps.ConstructionBase]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4"
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
version = "1.3.0"

[[deps.Contour]]
deps = ["StaticArrays"]
git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
version = "0.5.7"

[[deps.Crayons]]
git-tree-sha1 = "3f71217b538d7aaee0b69ab47d9b7724ca8afa0d"
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
version = "4.0.4"

[[deps.DataAPI]]
git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8"
uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
version = "1.9.0"

[[deps.DataFrames]]
deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
git-tree-sha1 = "cfdfef912b7f93e4b848e80b9befdf9e331bc05a"
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
version = "1.3.1"

[[deps.DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
version = "0.18.11"

[[deps.DataValueInterfaces]]
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
version = "1.0.0"

[[deps.Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"

[[deps.DelimitedFiles]]
deps = ["Mmap"]
uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"

[[deps.DensityInterface]]
deps = ["InverseFunctions", "Test"]
git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b"
uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d"
version = "0.4.0"

[[deps.DiskArrays]]
git-tree-sha1 = "6a50d800025a1664c99a8e819e0568c75e3ac0c7"
uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3"
version = "0.2.12"

[[deps.Distances]]
deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"]
git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04"
uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
version = "0.10.7"

[[deps.Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"

[[deps.Distributions]]
deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"]
git-tree-sha1 = "c1724611e6ae29c6094c8d9850e3136297ba7fff"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
version = "0.25.36"

[[deps.DocStringExtensions]]
deps = ["LibGit2"]
git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
version = "0.8.6"

[[deps.Downloads]]
deps = ["ArgTools", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"

[[deps.EarCut_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d"
uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
version = "2.2.3+0"

[[deps.EllipsisNotation]]
deps = ["ArrayInterface"]
git-tree-sha1 = "3fe985505b4b667e1ae303c9ca64d181f09d5c05"
uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949"
version = "1.1.3"

[[deps.Expat_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b3bfd02e98aedfa5cf885665493c5598c350cd2f"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
version = "2.2.10+0"

[[deps.ExprTools]]
git-tree-sha1 = "b7e3d17636b348f005f11040025ae8c6f645fe92"
uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04"
version = "0.1.6"

[[deps.EzXML]]
deps = ["Printf", "XML2_jll"]
git-tree-sha1 = "0fa3b52a04a4e210aeb1626def9c90df3ae65268"
uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
version = "1.1.0"

[[deps.FFMPEG]]
deps = ["FFMPEG_jll"]
git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8"
uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
version = "0.4.1"

[[deps.FFMPEG_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "LibVPX_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
git-tree-sha1 = "3cc57ad0a213808473eafef4845a74766242e05f"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
version = "4.3.1+4"

[[deps.FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
git-tree-sha1 = "463cb335fa22c4ebacfd1faba5fde14edb80d96c"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
version = "1.4.5"

[[deps.FFTW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea"
uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
version = "3.3.10+0"

[[deps.FileIO]]
deps = ["Pkg", "Requires", "UUIDs"]
git-tree-sha1 = "2db648b6712831ecb333eae76dbfd1c156ca13bb"
uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
version = "1.11.2"

[[deps.FilePathsBase]]
deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"]
git-tree-sha1 = "04d13bfa8ef11720c24e4d840c0033d145537df7"
uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
version = "0.9.17"

[[deps.FillArrays]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"]
git-tree-sha1 = "8756f9935b7ccc9064c6eef0bff0ad643df733a3"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
version = "0.12.7"

[[deps.FixedPointNumbers]]
deps = ["Statistics"]
git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc"
uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
version = "0.8.4"

[[deps.Fontconfig_jll]]
deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "35895cf184ceaab11fd778b4590144034a167a2f"
uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.1+14"

[[deps.Formatting]]
deps = ["Printf"]
git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8"
uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
version = "0.4.2"

[[deps.FreeType]]
deps = ["CEnum", "FreeType2_jll"]
git-tree-sha1 = "cabd77ab6a6fdff49bfd24af2ebe76e6e018a2b4"
uuid = "b38be410-82b0-50bf-ab77-7b57e271db43"
version = "4.0.0"

[[deps.FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "cbd58c9deb1d304f5a245a0b7eb841a2560cfec6"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
version = "2.10.1+5"

[[deps.FreeTypeAbstraction]]
deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "StaticArrays"]
git-tree-sha1 = "770050893e7bc8a34915b4b9298604a3236de834"
uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
version = "0.9.5"

[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91"
uuid = "559328eb-81f9-559d-9380-de523a88c83c"
version = "1.0.10+0"

[[deps.Future]]
deps = ["Random"]
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"

[[deps.GeometryBasics]]
deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"]
git-tree-sha1 = "58bcdf5ebc057b085e58d95c138725628dd7453c"
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
version = "0.4.1"

[[deps.Gettext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"]
git-tree-sha1 = "8c14294a079216000a0bdca5ec5a447f073ddc9d"
uuid = "78b55507-aeef-58d4-861c-77aaff3498b1"
version = "0.20.1+7"

[[deps.Git]]
deps = ["Git_jll"]
git-tree-sha1 = "d7bffc3fe097e9589145493c08c41297b457e5d0"
uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
version = "1.2.1"

[[deps.GitHub]]
deps = ["Base64", "Dates", "HTTP", "JSON", "MbedTLS", "Sockets", "SodiumSeal"]
git-tree-sha1 = "c8594dff1ed76e232d8063b2a2555335900af6f3"
uuid = "bc5e4493-9b4d-5f90-b8aa-2b2bcaad7a26"
version = "5.7.0"

[[deps.Git_jll]]
deps = ["Artifacts", "Expat_jll", "Gettext_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "33be385f3432a5a5b7f6965af9592d4407f3167f"
uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb"
version = "2.31.0+0"

[[deps.Glib_jll]]
deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "04690cc5008b38ecbdfede949220bc7d9ba26397"
uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
version = "2.59.0+4"

[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
git-tree-sha1 = "1c5a84319923bea76fa145d49e93aa4394c73fc2"
uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
version = "1.1.1"

[[deps.Graphite2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011"
uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
version = "1.3.14+0"

[[deps.GridLayoutBase]]
deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
git-tree-sha1 = "70938436e2720e6cb8a7f2ca9f1bbdbf40d7f5d0"
uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
version = "0.6.4"

[[deps.Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
version = "1.0.2"

[[deps.HDF5_jll]]
deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "fd83fa0bde42e01952757f01149dd968c06c4dba"
uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
version = "1.12.0+1"

[[deps.HTTP]]
deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"]
git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "0.9.17"

[[deps.HarfBuzz_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Gettext_jll", "Glib_jll", "Graphite2_jll", "ICU_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"]
git-tree-sha1 = "90bed5fc61d12d10832ebf988988104888eebaca"
uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
version = "2.6.1+10"

[[deps.Hyperscript]]
deps = ["Test"]
git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9"
uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91"
version = "0.0.4"

[[deps.HypertextLiteral]]
git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238"
uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"
version = "0.9.3"

[[deps.ICU_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "6ce9cf3c5490b045710d60ac3fd2fe48188846b3"
uuid = "a51ab1cf-af8e-5615-a023-bc2c838bba6b"
version = "67.1.0+3"

[[deps.IOCapture]]
deps = ["Logging", "Random"]
git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a"
uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89"
version = "0.2.2"

[[deps.IfElse]]
git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1"
uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
version = "0.1.1"

[[deps.ImageCore]]
deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"]
git-tree-sha1 = "9a5c62f231e5bba35695a20988fc7cd6de7eeb5a"
uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
version = "0.9.3"

[[deps.ImageIO]]
deps = ["FileIO", "Netpbm", "OpenEXR", "PNGFiles", "TiffImages", "UUIDs"]
git-tree-sha1 = "a2951c93684551467265e0e32b577914f69532be"
uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
version = "0.5.9"

[[deps.Imath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e"
uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
version = "3.1.2+0"

[[deps.IndirectArrays]]
git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
version = "1.0.0"

[[deps.Inflate]]
git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c"
uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
version = "0.1.2"

[[deps.IniFile]]
deps = ["Test"]
git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8"
uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f"
version = "0.5.0"

[[deps.InlineStrings]]
deps = ["Parsers"]
git-tree-sha1 = "8d70835a3759cdd75881426fced1508bb7b7e1b6"
uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
version = "1.1.1"

[[deps.IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c"
uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
version = "2018.0.3+2"

[[deps.InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"

[[deps.Interpolations]]
deps = ["AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
git-tree-sha1 = "b15fc0a95c564ca2e0a7ae12c1f095ca848ceb31"
uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
version = "0.13.5"

[[deps.IntervalSets]]
deps = ["Dates", "EllipsisNotation", "Statistics"]
git-tree-sha1 = "3cc368af3f110a767ac786560045dceddfc16758"
uuid = "8197267c-284f-5f27-9208-e0e47529a953"
version = "0.5.3"

[[deps.InverseFunctions]]
deps = ["Test"]
git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65"
uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
version = "0.1.2"

[[deps.InvertedIndices]]
git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
version = "1.1.0"

[[deps.IrrationalConstants]]
git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151"
uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
version = "0.1.1"

[[deps.Isoband]]
deps = ["isoband_jll"]
git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137"
uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4"
version = "0.1.1"

[[deps.IterTools]]
git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
version = "1.4.0"

[[deps.IteratorInterfaceExtensions]]
git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
uuid = "82899510-4779-5014-852e-03e436cf321d"
version = "1.0.0"

[[deps.JLLWrappers]]
deps = ["Preferences"]
git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
version = "1.3.0"

[[deps.JSON]]
deps = ["Dates", "Mmap", "Parsers", "Unicode"]
git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.2"

[[deps.KernelDensity]]
deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"]
git-tree-sha1 = "591e8dc09ad18386189610acafb970032c519707"
uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
version = "0.6.3"

[[deps.LAME_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c"
uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
version = "3.100.1+0"

[[deps.LZO_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6"
uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
version = "2.10.1+0"

[[deps.LaTeXStrings]]
git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996"
uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
version = "1.3.0"

[[deps.LazyArtifacts]]
deps = ["Artifacts", "Pkg"]
uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"

[[deps.LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"

[[deps.LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"

[[deps.LibGit2]]
deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"

[[deps.LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"

[[deps.LibVPX_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "12ee7e23fa4d18361e7c2cde8f8337d4c3101bc7"
uuid = "dd192d2f-8180-539f-9fb4-cc70b1dcf69a"
version = "1.10.0+0"

[[deps.Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[[deps.Libffi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290"
uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
version = "3.2.2+1"

[[deps.Libgcrypt_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"]
git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae"
uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
version = "1.8.7+0"

[[deps.Libgpg_error_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9"
uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
version = "1.42.0+0"

[[deps.Libiconv_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778"
uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
version = "1.16.1+1"

[[deps.Libmount_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73"
uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
version = "2.35.0+0"

[[deps.Libuuid_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066"
uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
version = "2.36.0+0"

[[deps.LinearAlgebra]]
deps = ["Libdl", "libblastrampoline_jll"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

[[deps.LogExpFunctions]]
deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"]
git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1"
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
version = "0.3.6"

[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"

[[deps.Lz4_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "5d494bc6e85c4c9b626ee0cab05daa4085486ab1"
uuid = "5ced341a-0733-55b8-9ab6-a4889d929147"
version = "1.9.3+0"

[[deps.MITgcmTools]]
deps = ["Artifacts", "ClimateModels", "DataFrames", "Dates", "LazyArtifacts", "MeshArrays", "NetCDF", "OrderedCollections", "Printf", "SparseArrays", "Suppressor", "UUIDs"]
git-tree-sha1 = "85fd18c07803b16af3e317e9568d526f5ca61853"
uuid = "62725fbc-3a66-4df3-9000-e33e85b3a198"
version = "0.1.32"

[[deps.MKL_jll]]
deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"]
git-tree-sha1 = "5455aef09b40e5020e1520f551fa3135040d4ed0"
uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
version = "2021.1.1+2"

[[deps.Makie]]
deps = ["Animations", "Base64", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Distributions", "DocStringExtensions", "FFMPEG", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MakieCore", "Markdown", "Match", "MathTeXEngine", "Observables", "Packing", "PlotUtils", "PolygonOps", "Printf", "Random", "RelocatableFolders", "Serialization", "Showoff", "SignedDistanceFields", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "UnicodeFun"]
git-tree-sha1 = "56b0b7772676c499430dc8eb15cfab120c05a150"
uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
version = "0.15.3"

[[deps.MakieCore]]
deps = ["Observables"]
git-tree-sha1 = "7bcc8323fb37523a6a51ade2234eee27a11114c8"
uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
version = "0.1.3"

[[deps.MappedArrays]]
git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142"
uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
version = "0.4.1"

[[deps.Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"

[[deps.Match]]
git-tree-sha1 = "1d9bc5c1a6e7ee24effb93f175c9342f9154d97f"
uuid = "7eb4fadd-790c-5f42-8a69-bfa0b872bfbf"
version = "1.2.0"

[[deps.MathTeXEngine]]
deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "Test"]
git-tree-sha1 = "70e733037bbf02d691e78f95171a1fa08cdc6332"
uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
version = "0.2.1"

[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"]
git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
version = "1.0.3"

[[deps.MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"

[[deps.MeshArrays]]
deps = ["CatViews", "Dates", "Downloads", "LazyArtifacts", "NearestNeighbors", "Pkg", "Printf", "SparseArrays", "Statistics", "Unitful"]
git-tree-sha1 = "c5b9b98540a900934d9b531f8a153ce49016cec7"
uuid = "cb8c808f-1acf-59a3-9d2b-6e38d009f683"
version = "0.2.31"

[[deps.Missings]]
deps = ["DataAPI"]
git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f"
uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
version = "1.0.2"

[[deps.Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"

[[deps.Mocking]]
deps = ["Compat", "ExprTools"]
git-tree-sha1 = "29714d0a7a8083bba8427a4fbfb00a540c681ce7"
uuid = "78c3b35d-d492-501b-9361-3d52fe80e533"
version = "0.7.3"

[[deps.MosaicViews]]
deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d"
uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
version = "0.3.3"

[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"

[[deps.NaNMath]]
git-tree-sha1 = "f755f36b19a5116bb580de457cda0c140153f283"
uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
version = "0.3.6"

[[deps.NearestNeighbors]]
deps = ["Distances", "StaticArrays"]
git-tree-sha1 = "16baacfdc8758bc374882566c9187e785e85c2f0"
uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
version = "0.4.9"

[[deps.NetCDF]]
deps = ["DiskArrays", "Formatting", "NetCDF_jll"]
git-tree-sha1 = "23b0e32fde256a4e2e497e678abcf956ed26204b"
uuid = "30363a11-5582-574a-97bb-aa9a979735b9"
version = "0.11.3"

[[deps.NetCDF_jll]]
deps = ["Artifacts", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Pkg", "Zlib_jll", "nghttp2_jll"]
git-tree-sha1 = "0cf4d1bf2ef45156aed85c9ac5f8c7e697d9288c"
uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3"
version = "400.702.400+0"

[[deps.Netpbm]]
deps = ["FileIO", "ImageCore"]
git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153"
uuid = "f09324ee-3d7c-5217-9330-fc30815ba969"
version = "1.0.2"

[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"

[[deps.Observables]]
git-tree-sha1 = "fe29afdef3d0c4a8286128d4e45cc50621b1e43d"
uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
version = "0.4.0"

[[deps.OffsetArrays]]
deps = ["Adapt"]
git-tree-sha1 = "043017e0bdeff61cfbb7afeb558ab29536bbb5ed"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.10.8"

[[deps.Ogg_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7937eda4681660b4d6aeeecc2f7e1c81c8ee4e2f"
uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
version = "1.3.5+0"

[[deps.OpenBLAS_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"

[[deps.OpenEXR]]
deps = ["Colors", "FileIO", "OpenEXR_jll"]
git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633"
uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
version = "0.3.2"

[[deps.OpenEXR_jll]]
deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304"
uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
version = "3.1.1+0"

[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"

[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "15003dcb7d8db3c6c857fda14891a539a8f2705a"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
version = "1.1.10+0"

[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1"
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"

[[deps.Opus_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720"
uuid = "91d4177d-7536-5919-b921-800302f37372"
version = "1.3.2+0"

[[deps.OrderedCollections]]
git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
version = "1.4.1"

[[deps.PCRE2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"

[[deps.PCRE_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488"
uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc"
version = "8.44.0+0"

[[deps.PDMats]]
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
git-tree-sha1 = "ee26b350276c51697c9c2d88a072b339f9f03d73"
uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
version = "0.11.5"

[[deps.PNGFiles]]
deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
git-tree-sha1 = "6d105d40e30b635cfed9d52ec29cf456e27d38f8"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
version = "0.3.12"

[[deps.Packing]]
deps = ["GeometryBasics"]
git-tree-sha1 = "1155f6f937fa2b94104162f01fa400e192e4272f"
uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566"
version = "0.4.2"

[[deps.PaddedViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "646eed6f6a5d8df6708f15ea7e02a7a2c4fe4800"
uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
version = "0.5.10"

[[deps.Pango_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9a336dee51d20d1ed890c4a8dca636e86e2b76ca"
uuid = "36c8627f-9965-5494-a995-c6b170f724f3"
version = "1.42.4+10"

[[deps.Parsers]]
deps = ["Dates"]
git-tree-sha1 = "d7fa6237da8004be601e19bd6666083056649918"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "2.1.3"

[[deps.Pixman_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29"
uuid = "30392449-352a-5448-841d-b1acce4e97dc"
version = "0.40.1+0"

[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"

[[deps.PkgVersion]]
deps = ["Pkg"]
git-tree-sha1 = "a7a7e1a88853564e551e4eba8650f8c38df79b37"
uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688"
version = "0.1.1"

[[deps.PlotUtils]]
deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"]
git-tree-sha1 = "e4fe0b50af3130ddd25e793b471cb43d5279e3e6"
uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
version = "1.1.1"

[[deps.PlutoUI]]
deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"]
git-tree-sha1 = "93cf0910f09a9607add290a3a2585aa376b4feb6"
uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
version = "0.7.25"

[[deps.PolygonOps]]
git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
version = "0.1.2"

[[deps.PooledArrays]]
deps = ["DataAPI", "Future"]
git-tree-sha1 = "db3a23166af8aebf4db5ef87ac5b00d36eb771e2"
uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720"
version = "1.4.0"

[[deps.Preferences]]
deps = ["TOML"]
git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
version = "1.2.2"

[[deps.PrettyTables]]
deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"]
git-tree-sha1 = "b7ff9f9ce50eab241e978cd975ad4ae113f5a41f"
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
version = "1.3.0"

[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[[deps.ProgressMeter]]
deps = ["Distributed", "Printf"]
git-tree-sha1 = "afadeba63d90ff223a6a48d2009434ecee2ec9e8"
uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
version = "1.7.1"

[[deps.QuadGK]]
deps = ["DataStructures", "LinearAlgebra"]
git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39"
uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
version = "2.4.2"

[[deps.REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[deps.Random]]
deps = ["SHA", "Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[[deps.Ratios]]
deps = ["Requires"]
git-tree-sha1 = "01d341f502250e81f6fec0afe662aa861392a3aa"
uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
version = "0.4.2"

[[deps.Reexport]]
git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
uuid = "189a3867-3050-52da-a836-e630ba90ab69"
version = "1.2.2"

[[deps.RelocatableFolders]]
deps = ["SHA", "Scratch"]
git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca"
uuid = "05181044-ff0b-4ac5-8273-598c1e38db00"
version = "0.1.3"

[[deps.Requires]]
deps = ["UUIDs"]
git-tree-sha1 = "8f82019e525f4d5c669692772a6f4b0a58b06a6a"
uuid = "ae029012-a4dd-5104-9daa-d747884805df"
version = "1.2.0"

[[deps.Retry]]
git-tree-sha1 = "41ac127cd281bb33e42aba46a9d3b25cd35fc6d5"
uuid = "20febd7b-183b-5ae2-ac4a-720e7ce64774"
version = "0.4.1"

[[deps.Rmath]]
deps = ["Random", "Rmath_jll"]
git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f"
uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
version = "0.7.0"

[[deps.Rmath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7"
uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
version = "0.3.0+0"

[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"

[[deps.SIMD]]
git-tree-sha1 = "9ba33637b24341aba594a2783a502760aa0bff04"
uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
version = "3.3.1"

[[deps.ScanByte]]
deps = ["Libdl", "SIMD"]
git-tree-sha1 = "9cc2955f2a254b18be655a4ee70bc4031b2b189e"
uuid = "7b38b023-a4d7-4c5e-8d43-3f3097f304eb"
version = "0.3.0"

[[deps.Scratch]]
deps = ["Dates"]
git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda"
uuid = "6c6a2e73-6563-6170-7368-637461726353"
version = "1.1.0"

[[deps.SentinelArrays]]
deps = ["Dates", "Random"]
git-tree-sha1 = "244586bc07462d22aed0113af9c731f2a518c93e"
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
version = "1.3.10"

[[deps.Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"

[[deps.SharedArrays]]
deps = ["Distributed", "Mmap", "Random", "Serialization"]
uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"

[[deps.Showoff]]
deps = ["Dates", "Grisu"]
git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de"
uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
version = "1.0.3"

[[deps.SignedDistanceFields]]
deps = ["Random", "Statistics", "Test"]
git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9"
uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96"
version = "0.4.0"

[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"

[[deps.SodiumSeal]]
deps = ["Base64", "Libdl", "libsodium_jll"]
git-tree-sha1 = "80cef67d2953e33935b41c6ab0a178b9987b1c99"
uuid = "2133526b-2bfb-4018-ac12-889fb3908a75"
version = "0.1.1"

[[deps.SortingAlgorithms]]
deps = ["DataStructures"]
git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
version = "1.0.1"

[[deps.SparseArrays]]
deps = ["LinearAlgebra", "Random"]
uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"

[[deps.SpecialFunctions]]
deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
git-tree-sha1 = "e08890d19787ec25029113e88c34ec20cac1c91e"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
version = "2.0.0"

[[deps.StackViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c"
uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
version = "0.1.1"

[[deps.Static]]
deps = ["IfElse"]
git-tree-sha1 = "7f5a513baec6f122401abfc8e9c074fdac54f6c1"
uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
version = "0.4.1"

[[deps.StaticArrays]]
deps = ["LinearAlgebra", "Random", "Statistics"]
git-tree-sha1 = "3c76dde64d03699e074ac02eb2e8ba8254d428da"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "1.2.13"

[[deps.Statistics]]
deps = ["LinearAlgebra", "SparseArrays"]
uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

[[deps.StatsAPI]]
git-tree-sha1 = "0f2aa8e32d511f758a2ce49208181f7733a0936a"
uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
version = "1.1.0"

[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
git-tree-sha1 = "2bb0cb32026a66037360606510fca5984ccc6b75"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
version = "0.33.13"

[[deps.StatsFuns]]
deps = ["ChainRulesCore", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
git-tree-sha1 = "bedb3e17cc1d94ce0e6e66d3afa47157978ba404"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "0.9.14"

[[deps.StructArrays]]
deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"]
git-tree-sha1 = "2ce41e0d042c60ecd131e9fb7154a3bfadbf50d3"
uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
version = "0.6.3"

[[deps.SuiteSparse]]
deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"

[[deps.Suppressor]]
git-tree-sha1 = "a819d77f31f83e5792a76081eee1ea6342ab8787"
uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
version = "0.2.0"

[[deps.TOML]]
deps = ["Dates"]
uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"

[[deps.TableTraits]]
deps = ["IteratorInterfaceExtensions"]
git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
version = "1.0.1"

[[deps.Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"]
git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
version = "1.6.1"

[[deps.Tar]]
deps = ["ArgTools", "SHA"]
uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"

[[deps.TensorCore]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6"
uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50"
version = "0.1.1"

[[deps.Test]]
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[[deps.TiffImages]]
deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"]
git-tree-sha1 = "c342ae2abf4902d65a0b0bf59b28506a6e17078a"
uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
version = "0.5.2"

[[deps.TranscodingStreams]]
deps = ["Random", "Test"]
git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.9.6"

[[deps.URIs]]
git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355"
uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
version = "1.3.0"

[[deps.UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[[deps.Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[deps.UnicodeFun]]
deps = ["REPL"]
git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
version = "0.4.1"

[[deps.Unitful]]
deps = ["ConstructionBase", "Dates", "LinearAlgebra", "Random"]
git-tree-sha1 = "0992ed0c3ef66b0390e5752fe60054e5ff93b908"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
version = "1.9.2"

[[deps.WeakRefStrings]]
deps = ["DataAPI", "InlineStrings", "Parsers"]
git-tree-sha1 = "c69f9da3ff2f4f02e811c3323c22e5dfcb584cfa"
uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
version = "1.4.1"

[[deps.WoodburyMatrices]]
deps = ["LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3"
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
version = "0.5.5"

[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
version = "2.9.12+0"

[[deps.XMLDict]]
deps = ["EzXML", "IterTools", "OrderedCollections"]
git-tree-sha1 = "d9a3faf078210e477b291c79117676fca54da9dd"
uuid = "228000da-037f-5747-90a9-8195ccbf91a5"
version = "0.4.1"

[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a"
uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
version = "1.1.34+0"

[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527"
uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
version = "1.6.9+4"

[[deps.Xorg_libXau_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e"
uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
version = "1.0.9+4"

[[deps.Xorg_libXdmcp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4"
uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
version = "1.1.3+4"

[[deps.Xorg_libXext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3"
uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
version = "1.3.4+4"

[[deps.Xorg_libXrender_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96"
uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
version = "0.9.10+4"

[[deps.Xorg_libpthread_stubs_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb"
uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
version = "0.1.0+3"

[[deps.Xorg_libxcb_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6"
uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
version = "1.13.0+3"

[[deps.Xorg_xtrans_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845"
uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
version = "1.4.0+3"

[[deps.Zarr]]
deps = ["AWS", "Blosc", "CodecZlib", "DataStructures", "Dates", "DiskArrays", "HTTP", "JSON", "OffsetArrays", "Pkg"]
git-tree-sha1 = "18ac3fd29790edeee42bfed5020b12ae61a029d0"
uuid = "0a941bbe-ad1d-11e8-39d9-ab76183a1d99"
version = "0.6.3"

[[deps.Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"

[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "cc4bf3fdde8b7e3e9fa0351bdeedba1cf3b7f6e6"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.5.0+0"

[[deps.isoband_jll]]
deps = ["Libdl", "Pkg"]
git-tree-sha1 = "a1ac99674715995a536bbce674b068ec1b7d893d"
uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4"
version = "0.2.2+0"

[[deps.libass_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "acc685bcf777b2202a904cdcb49ad34c2fa1880c"
uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
version = "0.14.0+4"

[[deps.libblastrampoline_jll]]
deps = ["Artifacts", "Libdl", "OpenBLAS_jll"]
uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"

[[deps.libfdk_aac_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7a5780a0d9c6864184b3a2eeeb833a0c871f00ab"
uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
version = "0.1.6+4"

[[deps.libpng_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
version = "1.6.38+0"

[[deps.libsodium_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e"
uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8"
version = "1.0.20+0"

[[deps.libvorbis_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"]
git-tree-sha1 = "c45f4e40e7aafe9d086379e5578947ec8b95a8fb"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
version = "1.3.7+0"

[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"

[[deps.p7zip_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"

[[deps.x264_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d713c1ce4deac133e3334ee12f4adff07f81778f"
uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
version = "2020.7.14+2"

[[deps.x265_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "487da2f8f2f0c8ee0e83f39d13037d6bbf0a45ab"
uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
version = "3.0.0+3"
"""

# ╔═╡ Cell order:
# ╟─a3f9fb60-d889-4320-a979-dddd87ff173f
# ╟─7057fdae-7b4a-42d4-8cd9-75999e72ecb7
# ╟─a63753bd-5b83-4324-8bf9-8b3532c6b3d4
# ╟─59211a03-6212-4f56-8d0a-66a0a805d9f0
# ╟─a1f311f6-2dc2-46da-a48c-a5edc910b888
# ╟─c9f91552-b7d4-41c5-bfbd-13888bf290a2
# ╟─7d7aea6b-a5de-4ad6-88fd-b05049f4f36a
# ╟─91cd170b-7e8d-4abe-b000-46745e531c8f
# ╟─7e9e1b6b-f0c8-4da1-820f-fb65214e7cd3
# ╟─c11fddfa-db75-48ba-a197-0be048ec60b3
# ╟─d46e35ad-da83-41c1-b802-6c52bbd58a32
# ╟─cda60695-fc07-42cb-b78c-9f3de34fb826
# ╟─6ff81750-6060-4f40-b3ce-fee20c9c1b1f
# ╟─feead29a-c475-4b4b-93d2-8bf2adcc4a3e
# ╟─0787d4ae-4764-40b4-b607-acf3903210f4
# ╟─6ed201f2-f779-4f82-bc22-0c66ac0a4d74
# ╟─4ae7e302-10d5-11ec-0c5e-838d34e10c23
# ╟─4ad62ce6-606d-4784-adf6-b96319006082
# ╟─2bd3aba3-fbac-499b-9364-ec391b195f95
# ╠═22e7ecc9-a40e-47ea-8cda-2a6441ca8dbe
# ╠═24c0cf26-5a59-461f-817e-5b4c95d15e1d
# ╠═4dc8c2fa-269b-427e-aab1-5a541c91a011
# ╠═a2582849-bea6-4447-94ba-06147266c67a
# ╟─ee4443c0-5c12-4c6b-8c5b-1eca7cc62c37
# ╟─00000000-0000-0000-0000-000000000001
# ╟─00000000-0000-0000-0000-000000000002


text:
# ============================================================================ #
# Constant
# ============================================================================ #

struct Constant <: AbstractConstant
    value::Float64

    function Constant(value)
        return new( value )
    end
end

function evaluate(x::Constant)
    return x.value
end

function evaluate(x::A) where {A <: AbstractArray{<: Constant}}
    s = similar(x)
    for ii in eachindex(x)
        s[ii] = x[ii].value
    end
    return s
end

function to_string(x::Constant)
    return string(x.value)
end

function clone(x::Constant)
    y = x
    return y
end

function is_zero_constant(x, tol = 1e-30)
    return false
end

function is_one_constant(x, tol = 1e-30)
    return false
end

function is_zero_constant(x::Constant, tol = 1e-30)
    return abs(x.value) <= tol
end

function is_one_constant(x::Constant, tol = 1e-30)
    tmp = x.value - one(typeof(x.value))
    return abs(tmp) <= tol
end

max_stars_repo_name: HomoModelicus/julia

max_issues_repo_name: HomoModelicus/julia

max_forks_repo_name: HomoModelicus/julia


text:
using JuMP, EAGO

                     m = Model()

                     EAGO.register_eago_operators!(m)

                     @variable(m, -1 <= x[i=1:4] <= 1)

                     @variable(m, -1.263105417837706 <= q <= 2.4766737340949954)

                     add_NL_constraint(m, :(sigmoid(0.7635571507341847 + -0.35250618093605723*sigmoid(0.5051094873509578 + -0.17934163301535788*sigmoid(-0.331542222824047 + 0.7450661875335634*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + -0.10668129539960924*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4]))) + -0.9610191438924418*sigmoid(0.6781688636512797 + -0.22580923517577522*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + 0.2965219706242044*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4])))) + 0.1709251594821839*sigmoid(0.058205314222445015 + 0.7954955842799771*sigmoid(-0.331542222824047 + 0.7450661875335634*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + -0.10668129539960924*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4]))) + -0.9762293687340509*sigmoid(0.6781688636512797 + -0.22580923517577522*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + 0.2965219706242044*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4]))))) + sigmoid(-0.29663194049169395 + 0.013502946151282558*sigmoid(0.5051094873509578 + -0.17934163301535788*sigmoid(-0.331542222824047 + 0.7450661875335634*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + -0.10668129539960924*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4]))) + -0.9610191438924418*sigmoid(0.6781688636512797 + -0.22580923517577522*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + 0.2965219706242044*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4])))) + -0.2459643040595232*sigmoid(0.058205314222445015 + 0.7954955842799771*sigmoid(-0.331542222824047 + 0.7450661875335634*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + -0.10668129539960924*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4]))) + -0.9762293687340509*sigmoid(0.6781688636512797 + -0.22580923517577522*sigmoid(0.04378671584682481 + 0.6928572029860351*$(x[1]) + 0.8337172801246142*$(x[2]) + 0.1196869024103484*$(x[3]) + -0.7815194586429408*$(x[4])) + 0.2965219706242044*sigmoid(0.8574467662893772 + -0.06659837723966744*$(x[1]) + -0.15959391344635332*$(x[2]) + -0.6414263171723844*$(x[3]) + 0.9253455779716249*$(x[4]))))) - $q <= 0.0))

                     @objective(m, Min, q)

                     return m

max_stars_repo_name: PSORLab/RSActivationFunctions

max_issues_repo_name: PSORLab/RSActivationFunctions

max_forks_repo_name: PSORLab/RSActivationFunctions