diff --git a/Project.toml b/Project.toml index 1a59902..262528d 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "SourceCodeMcCormick" uuid = "a7283dc5-4ecf-47fb-a95b-1412723fc960" authors = ["Robert Gottlieb "] -version = "0.4.1" +version = "0.5.0" [deps] CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" @@ -9,7 +9,9 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6" IfElse = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" +StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" SymbolicUtils = "d1185830-fcd6-423d-90d6-eec64667417b" Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" diff --git a/src/SourceCodeMcCormick.jl b/src/SourceCodeMcCormick.jl index 46edd44..a4a331a 100644 --- a/src/SourceCodeMcCormick.jl +++ b/src/SourceCodeMcCormick.jl @@ -8,6 +8,7 @@ using IfElse using DocStringExtensions using Graphs using CUDA +using StaticArrays: @MVector import Dates import SymbolicUtils: BasicSymbolic, exprtype, SYM, TERM, ADD, MUL, POW, DIV @@ -46,12 +47,21 @@ include(joinpath(@__DIR__, "interval", "interval.jl")) include(joinpath(@__DIR__, "relaxation", "relaxation.jl")) include(joinpath(@__DIR__, "transform", "transform.jl")) include(joinpath(@__DIR__, "grad", "grad.jl")) +include(joinpath(@__DIR__, "kernel_writer", "kernel_write.jl")) +include(joinpath(@__DIR__, "precompile.jl")) +_precompile_() export McCormickIntervalTransform, IntervalTransform export apply_transform, all_evaluators, convex_evaluator, extract_terms, genvar, genparam, get_name, factor, binarize!, pull_vars, shrink_eqs, grad, shrink_grad!, convex_subgradient, all_subgradients, grad_transform!, - levels, eqn_edges, eval_generator, grad_eval_generator, fgen + levels, eqn_edges, eval_generator, grad_eval_generator, fgen, kgen, + perform_substitutions + +# export individual kernels +export SCMC_cadd_kernel, SCMC_add_to_kernel, SCMC_negate_kernel, SCMC_exp_kernel, + SCMC_log_kernel, SCMC_inv_kernel, SCMC_cmul_kernel, SCMC_sigmoid_kernel, + SCMC_mult_kernel, SCMC_add_kernel end \ No newline at end of file diff --git a/src/kernel_writer/even_power_example.jl b/src/kernel_writer/even_power_example.jl new file mode 100644 index 0000000..844f230 --- /dev/null +++ b/src/kernel_writer/even_power_example.jl @@ -0,0 +1,2110 @@ +# Positive even integer powers + +# NOTE: You can reduce the number of temporary variables by combining the various +# if-else blocks into one another, which increases the kernel speed, but at the +# expense of significantly longer compilation times. The following times were +# recorded using my workstation, in the format: +# Method +# Compilation/first run time +# Kernel runtime (8192-length inputs) +# +# Default (~200 line function) +# 0.751169 seconds (680.11 k CPU allocations: 32.493 MiB) +# 138.600 μs (12 allocations: 256 bytes) +# +# Med-length (Keeping eps_min/max in its own if-else tree, combining midcc/cv +# cc/cv_id and final assignment trees; ~400 line function) +# 7.573736 seconds (3.19 M CPU allocations: 141.522 MiB, 0.46% gc time) +# 136.000 μs (12 allocations: 256 bytes) +# +# Max-length (Combining eps_min/max, midcc/cv, cc/cv_id, and assignments into +# one deep if-else tree; ~1470 line function) +# 115.306541 seconds (12.22 M CPU allocations: 529.422 MiB, 0.13% gc time) +# 124.800 μs (12 allocations: 256 bytes) + +function SCMC_even_power_kernel_short(OUT::CuDeviceMatrix, x::CuDeviceMatrix, z::Integer) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,4] <= 0.0 + eps_min = x[idx,4] + eps_max = x[idx,3] + elseif x[idx,3] >= 0.0 + eps_min = x[idx,3] + eps_max = x[idx,4] + elseif abs(x[idx,3]) >= abs(x[idx,4]) + eps_min = 0.0 + eps_max = x[idx,3] + else + eps_min = 0.0 + eps_max = x[idx,4] + end + OUT[idx,3] = eps_min^z + OUT[idx,4] = eps_max^z + + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcc = x[idx,1] + cc_id = 2 + midcv = x[idx,1] + cv_id = 2 + elseif x[idx,1] >= eps_max + if x[idx,1] >= eps_min + midcc = x[idx,1] + cc_id = 2 + midcv = x[idx,1] + cv_id = 2 + elseif eps_min >= x[idx,2] + midcc = x[idx,1] + cc_id = 2 + midcv = x[idx,2] + cv_id = 1 + else + midcc = x[idx,1] + cc_id = 2 + midcv = eps_min + cv_id = 3 + end + elseif eps_max >= x[idx,2] + if x[idx,1] >= eps_min + midcc = x[idx,2] + cc_id = 1 + midcv = x[idx,1] + cv_id = 2 + elseif eps_min >= x[idx,2] + midcc = x[idx,2] + cc_id = 1 + midcv = x[idx,2] + cv_id = 1 + else + midcc = x[idx,2] + cc_id = 1 + midcv = eps_min + cv_id = 3 + end + else + if x[idx,1] >= eps_min + midcc = eps_max + cc_id = 3 + midcv = x[idx,1] + cv_id = 2 + elseif eps_min >= x[idx,2] + midcc = eps_max + cc_id = 3 + midcv = x[idx,2] + cv_id = 1 + else + midcc = eps_max + cc_id = 3 + midcv = eps_min + cv_id = 3 + end + end + elseif eps_max >= x[idx,1] + if eps_min >= x[idx,1] + midcc = x[idx,1] + cc_id = 2 + midcv = x[idx,1] + cv_id = 2 + elseif x[idx,2] >= eps_min + midcc = x[idx,1] + cc_id = 2 + midcv = x[idx,2] + cv_id = 1 + else + midcc = x[idx,1] + cc_id = 2 + midcv = eps_min + cv_id = 3 + end + elseif x[idx,2] >= eps_max + if eps_min >= x[idx,1] + midcc = x[idx,2] + cc_id = 1 + midcv = x[idx,1] + cv_id = 2 + elseif x[idx,2] >= eps_min + midcc = x[idx,2] + cc_id = 1 + midcv = x[idx,2] + cv_id = 1 + else + midcc = x[idx,2] + cc_id = 1 + midcv = eps_min + cv_id = 3 + end + else + if eps_min >= x[idx,1] + midcc = eps_max + cc_id = 3 + midcv = x[idx,1] + cv_id = 2 + elseif x[idx,2] >= eps_min + midcc = eps_max + cc_id = 3 + midcv = x[idx,2] + cv_id = 1 + else + midcc = eps_max + cc_id = 3 + midcv = eps_min + cv_id = 3 + end + end + + if x[idx,3] == x[idx,4] + OUT[idx,1] = midcv*midcv^(z-1) + OUT[idx,2] = midcc^z + while col <= colmax + if cv_id==1 + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==2 + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + + if cc_id==1 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*midcc^(z-1) + elseif cc_id==2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*midcc^(z-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else + OUT[idx,1] = midcv*midcv^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - midcc) + x[idx,4]^z*(midcc - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + if cv_id==1 + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==2 + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==1 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + elseif cc_id==2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +function SCMC_even_power_kernel_medium(OUT::CuDeviceMatrix, x::CuDeviceMatrix, z::Integer) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,4] <= 0.0 + eps_min = x[idx,4] + eps_max = x[idx,3] + elseif x[idx,3] >= 0.0 + eps_min = x[idx,3] + eps_max = x[idx,4] + elseif abs(x[idx,3]) >= abs(x[idx,4]) + eps_min = 0.0 + eps_max = x[idx,3] + else + eps_min = 0.0 + eps_max = x[idx,4] + end + OUT[idx,3] = eps_min^z + OUT[idx,4] = eps_max^z + + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,1] >= eps_max + if x[idx,1] >= eps_min + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif eps_min >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif eps_max >= x[idx,2] + if x[idx,1] >= eps_min + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif eps_min >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,1] >= eps_min + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = eps_max^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - eps_max) + x[idx,4]^z*(eps_max - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif eps_min >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = eps_max^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - eps_max) + x[idx,4]^z*(eps_max - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = eps_max^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - eps_max) + x[idx,4]^z*(eps_max - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif eps_max >= x[idx,1] + if eps_min >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= eps_min + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] >= eps_max + if eps_min >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= eps_min + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if eps_min >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = eps_max^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - eps_max) + x[idx,4]^z*(eps_max - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= eps_min + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = eps_max^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - eps_max) + x[idx,4]^z*(eps_max - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = eps_max^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = eps_min*eps_min^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - eps_max) + x[idx,4]^z*(eps_max - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +function SCMC_even_power_kernel_long(OUT::CuDeviceMatrix, x::CuDeviceMatrix, z::Integer) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,4] <= 0.0 + OUT[idx,3] = x[idx,4]^z + OUT[idx,4] = x[idx,3]^z + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,1] >= x[idx,3] + if x[idx,1] >= x[idx,4] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1] ) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,1] >= x[idx,4] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,1] >= x[idx,4] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,3] >= x[idx,1] + if x[idx,4] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,4] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,4] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,4]*x[idx,4]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + + elseif x[idx,3] >= 0.0 + OUT[idx,3] = x[idx,3]^z + OUT[idx,4] = x[idx,4]^z + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1] ) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,3]*x[idx,3]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif abs(x[idx,3]) >= abs(x[idx,4]) + OUT[idx,3] = 0.0 + OUT[idx,4] = x[idx,3]^z + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,1] >= x[idx,3] + if x[idx,1] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif 0.0 >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1] ) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,1] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif 0.0 >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,1] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif 0.0 >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,3] >= x[idx,1] + if 0.0 >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] >= x[idx,3] + if 0.0 >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if 0.0 >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,3]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,3]) + x[idx,4]^z*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + else + OUT[idx,3] = 0.0 + OUT[idx,4] = x[idx,4]^z + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,1] >= x[idx,4] + if x[idx,1] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif 0.0 >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1] ) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif 0.0 >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,1] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif 0.0 >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,4] >= x[idx,1] + if 0.0 >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,1]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,1]) + x[idx,4]^z*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] >= x[idx,4] + if 0.0 >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1] *x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,2]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,2]) + x[idx,4]^z*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if 0.0 >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,1]*x[idx,1]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*x[idx,1]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= 0.0 + if x[idx,3] == x[idx,4] + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = x[idx,2]*x[idx,2]^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*x[idx,2]^(z-1) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 0.0 + OUT[idx,2] = x[idx,4]^z + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 0.0 + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - x[idx,4]) + x[idx,4]^z*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end \ No newline at end of file diff --git a/src/kernel_writer/kernel_write.jl b/src/kernel_writer/kernel_write.jl new file mode 100644 index 0000000..c13c1b4 --- /dev/null +++ b/src/kernel_writer/kernel_write.jl @@ -0,0 +1,1954 @@ + + +include(joinpath(@__DIR__, "math_kernels.jl")) +include(joinpath(@__DIR__, "string_math_kernels.jl")) + +# The kernel-generating function, analogous to fgen. +kgen(num::Num; constants::Vector{Num}=Num[], overwrite::Bool=false, splitting::Symbol=:default, affine_quadratic::Bool=true) = kgen(num, setdiff(pull_vars(num), constants), [:all], constants, overwrite, splitting, affine_quadratic) +kgen(num::Num, gradlist::Vector{Num}; constants::Vector{Num}=Num[], overwrite::Bool=false, splitting::Symbol=:default, affine_quadratic::Bool=true) = kgen(num, gradlist, [:all], constants, overwrite, splitting, affine_quadratic) +kgen(num::Num, raw_outputs::Vector{Symbol}; constants::Vector{Num}=Num[], overwrite::Bool=false, splitting::Symbol=:default, affine_quadratic::Bool=true) = kgen(num, setdiff(pull_vars(num), constants), raw_outputs, constants, overwrite, splitting, affine_quadratic) +kgen(num::Num, gradlist::Vector{Num}, raw_outputs::Vector{Symbol}; constants::Vector{Num}=Num[], overwrite::Bool=false, splitting::Symbol=:default, affine_quadratic::Bool=true) = kgen(num, gradlist, raw_outputs, constants, overwrite, splitting, affine_quadratic) +function kgen(num::Num, gradlist::Vector{Num}, raw_outputs::Vector{Symbol}, constants::Vector{Num}, overwrite::Bool, splitting::Symbol, affine_quadratic::Bool) + # Create a hash of the expression and check if the function already exists + expr_hash = string(hash(num+sum(gradlist)), base=62) + if (overwrite==false) && (isfile(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl"))) + try func_name = eval(Meta.parse("f_"*expr_hash)) + return func_name + catch + include(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl")) + func_name = eval(Meta.parse("f_"*expr_hash)) + @eval $(func_name)(CUDA.zeros(Float64, 2, 4+2*length($gradlist)), [CUDA.zeros(Float64, 2,3) for i = 1:length($gradlist)]...) + return func_name + end + end + + # If we reach this comment, we're going to be creating/modifying the kernel file. + # Create/open the file in write mode. + file = open(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl"), "w") + write(file, "# Generated at $(Dates.now())\n\n") + write(file, "# Kernel(s) generated for the expression: $(string(num))\n\n") + close(file) + + # Parse the list of requested outputs (Not currently useful, since all outputs are generated by default) + func_outputs = Symbol[] + for output in raw_outputs + output == :cv && push!(func_outputs, :cv) + output == :cc && push!(func_outputs, :cc) + output == :lo && push!(func_outputs, :lo) + output == :hi && push!(func_outputs, :hi) + output == :MC && push!(func_outputs, :cv, :cc, :lo, :hi) + output == :cvgrad && push!(func_outputs, :cvgrad) + output == :ccgrad && push!(func_outputs, :ccgrad) + output == :grad && push!(func_outputs, :cvgrad, :ccgrad) + output == :all && push!(func_outputs, :cv, :cc, :lo, :hi, :cvgrad, :ccgrad) + if ~(output in [:cv, :cc, :lo, :hi, :MC, :cvgrad, :ccgrad, :grad, :all]) + error("Output list contains an invalid output symbol: :$output. Acceptable symbols + include [:cv, :cc, :lo, :hi, :MC, :cvgrad, :ccgrad, :grad, :all]") + end + end + if isempty(func_outputs) + error("No outputs specified.") + end + + # Check the number of independent variables in the expression. Note that + # even if gradlist has 32+ elements, if the expression itself has fewer + # than 32 independent variables, it can be handled in a single kernel. + # Note also that constants are still required as inputs, so we can't + # exclude them from the list of participating variables + indep_vars = get_name.(pull_vars(num)) + + # Deal with quadratic functions differently, if `affine_quadratic` is true. + # This uses Matt's version of affine quadratic relaxations, seen in EAGO's + # `affine_relax_quadratic!` function. + if affine_quadratic==true && is_quadratic(num) # NOTE: When switching to MOI variables, this will be easy to detect + func_name = kgen_affine_quadratic(expr_hash, num, gradlist, func_outputs, constants) + return func_name + end + + # Now we need to split the input expression, if it's too complicated + # to handle quickly in a single kernel. Complexity is determined by + # the complexity() function, which (slightly conservatively) estimates + # the number of lines the kernel will require. The two options for + # splitting based on complexity are: + # Default: Split at 1500 or greater, unless the total remaining is under 2k + # (Also, split if >31 variables needed) + # Conservative: Slower compilation, faster execution. Split at 10k or greater, + # unless total remaining is under 13k. (Also, split if >31 + # variables needed) + + # Begin by factoring and substituting the expression + factored = perform_substitutions(factor(num, split_div=true)) + + # Get the number of lines and variables associated with each factor + n_lines = complexity(factored) + n_vars = var_counts(factored) + + # Prepare input and output information + kernel_nums = Int[] + inputs = Vector{String}[] + outputs = String[] + + # Pick the split points based on the "splitting" input + if splitting==:low # Low, formerly none + split_point = Inf + max_size = Inf + elseif splitting==:default # Default, formerly low + split_point = 10000 + max_size = 12000 + elseif splitting==:high # Formerly default + split_point = 1500 + max_size = 2000 + # elseif splitting==:high # More splitting + # split_point = 1000 + # max_size = 1200 + elseif splitting==:max # Extremely small + split_point = 500 + max_size = 750 + else + error("Splitting must be one of: {:low, :default, :high, :max}") + end + + # Pull out sparsity information in the factorization + sparsity = detect_sparsity(factored, gradlist) + + # Decide if the kernel needs to be split + if (n_vars[end] < 31) && (n_lines[end] <= max_size) + # Complexity is fairly low; only a single kernel needed + create_kernel!(expr_hash, 1, num, get_name.(gradlist), func_outputs, constants, factored, sparsity) + push!(kernel_nums, 1) + push!(inputs, string.(indep_vars)) + push!(outputs, "OUT") + else + # Complexity is not low enough; need multiple kernels + complete = false + kernel_count = 1 + # structure_list = String[] # Experimental + while !complete + # Determine which line to break at + line_ID = findfirst(x -> x > split_point, n_lines) + vars_ID = findfirst(x -> x == 31, n_vars) + if isnothing(vars_ID) + new_ID = line_ID + elseif isnothing(line_ID) + new_ID = vars_ID + else + new_ID = min(line_ID, vars_ID) + end + + # ============================================================================= + # ============================================================================= + # EXPERIMENTAL: + + # We want to make the element at `new_ID` into a kernel, unless the structure + # is exactly the same as a kernel we made previously. + # new_term = extract(factored, new_ID) + # new_structure, order = structure(new_term) + # @show new_structure + # # @show structure_list + # if new_structure in structure_list + # # We've already made this structure. Identify which kernel that was and use that + # # one instead of making a new kernel + # kernel_ID = findfirst(x -> x==new_structure, structure_list) + # push!(kernel_nums, kernel_ID) + # push!(inputs, string.(get_name.(order))) + # push!(outputs, string(factored[new_ID].lhs)) + # println("Was in the list") + # else + # # Send the element at `new_ID` to create_kernel!() + # create_kernel!(expr_hash, kernel_count, new_term, get_name.(gradlist), func_outputs, constants) + # push!(structure_list, new_structure) + # push!(kernel_nums, kernel_count) + # push!(inputs, string.(get_name.(pull_vars(extract(factored, new_ID))))) + # push!(outputs, string(factored[new_ID].lhs)) + # kernel_count += 1 + # end + + # ============================================================================= + # ============================================================================= + #### Start of alternative to experimental section + + # Send the element at `new_ID` to create_kernel!() + create_kernel!(expr_hash, kernel_count, extract(factored, new_ID), get_name.(gradlist), func_outputs, constants, factored, sparsity) + push!(kernel_nums, kernel_count) + push!(inputs, string.(get_name.(pull_vars(extract(factored, new_ID))))) + push!(outputs, string(factored[new_ID].lhs)) + kernel_count += 1 + + #### End of alternative to experimental section + + # Eliminate this part of the factored list, since we've already calculated + # it from this kernel + factored[new_ID] = factored[new_ID].lhs ~ factored[new_ID].lhs + + # Re-calculate line and variable counts + n_lines = complexity(factored) + n_vars = var_counts(factored) + + # If the total number of lines (not including the final line) is below 2000 + # and the number of variables is below 32, we can make the final kernel and be done + if (n_vars[end] < 32) && (all(n_lines[1:end-1] .<= max_size)) + create_kernel!(expr_hash, kernel_count, extract(factored), get_name.(gradlist), func_outputs, constants, factored, sparsity) + push!(kernel_nums, kernel_count) + push!(inputs, string.(get_name.(pull_vars(extract(factored))))) + push!(outputs, "OUT") + complete = true + end + end + end + + # Include all the kernels that were just generated + include(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl")) + + # We can assume that the newly created kernels have sufficiently + # high register usage that they all have a max number of 256 threads. + # All that we need is to figure out the maximum number of blocks + # on the user's machine, and we have some decent parameters with + # which to call @cuda. This command checks the number of Streaming + # Multiprocessors (SMs) in the user's GPU. + blocks = Int32(CUDA.attribute(CUDA.device(), CUDA.DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT)) + + # Now we need to write the main CPU function that calls all of + # the generated kernels and append it to the file. + file = open(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl"), "a") + write(file, outro(expr_hash, kernel_nums, inputs, outputs, blocks, get_name.(gradlist))) + close(file) + + # Compile the function and kernels + include(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl")) + func_name = eval(Meta.parse("f_"*expr_hash)) + @eval $(func_name)(CUDA.zeros(Float64, 2, 4+2*length($gradlist)), [CUDA.zeros(Float64, 2, 3) for i = 1:length($gradlist)]...) + return func_name +end + +# This is a quick function to detect if a Num object is quadratic. This function +# should be unnecessary when using MOI variables, since the object will already +# indicate if the term is quadratic. +function is_quadratic(num::Num) + expr = num.val + + # The function is quadratic if it's composed of one simple term like: + # [const], [var], [coeff]*[var], [var]*[var], [coeff]*[var]*[var] + # or if it's an `Add` type, where each term is one of the above. + if typeof(expr) <: Real + # If the expr has some Real-valued type (Float64, Int64, etc.), treat + # it like it's quadratic + nothing + elseif base_term(expr) + # Easy enough to treat this as quadratic, since the normal process doesn't make sense + nothing + elseif exprtype(expr)==MUL + if length(expr.dict)==1 + # One element in the dict. Check that the term is a base-level variable and that + # its exponent is 1 or 2 + for (key, val) in expr.dict + if !base_term(key) + # Inner term is not a base-level variable, so it's not quadratic + return false + end + if !(val in [1, 2]) + # Inner term's exponent is not 1 or 2, so it's not quadratic + return false + end + end + elseif length(expr.dict)==2 + # Two elements in the dict. Check that both are base-level variables and that + # their exponents are exactly 1 + for (key, val) in expr.dict + if !base_term(key) + # At least one term isn't a base-level variable, so it's not quadratic + return false + end + if !isone(val) + # At least one term has a non-one exponent, so it's not quadratic + return false + end + end + else + # More than 2 elements in the dict? Not quadratic. + return false + end + elseif exprtype(expr)==ADD + # The coefficient is irrelevant; we only need to explore the dictionary. + # The keys are important, but the values are irrelevant. + for key in keys(expr.dict) + if base_term(key) + # SYM is fine + nothing + elseif exprtype(key)==MUL + # It must be exactly [var]*[var], or it's not quadratic + if length(key.dict) != 2 + return false + end + for (subkey, subval) in key.dict + if !base_term(subkey) + # Both terms must be base-level variables + return false + end + if !isone(subval) + # Both terms must have exponents of 1 + return false + end + end + elseif exprtype(key)==POW + # It must be exactly [var]^2, or it's not quadratic + if !base_term(key.base) + return false + end + if key.exp != 2 + return false + end + else + # If it's not one of the above, it's not quadratic + return false + end + end + else + return false # If it's not one of the above, it's not quadratic + end + return true +end + +# A special version of kgen that only applies to quadratic functions. Instead of +# doing McCormick relaxations, this returns either affine bounds or secant line +# bounds, depending on where on the quadratic function the point of interest is. +function kgen_affine_quadratic(expr_hash::String, num::Num, gradlist::Vector{Num}, func_outputs::Vector{Symbol}, constants::Vector{Num}) + # Since it's quadratic, we can construct the kernel according to + # `affine_relax_quadratic!` in EAGO. + + # Extract the variables that are participating in this expression + expr = num.val + vars = get_name.(pull_vars(expr)) + varlist = string.(get_name.(gradlist)) + + # Open the file again + file = open(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl"), "a") + + # Put in the preamble. + write(file, preamble_string(expr_hash, ["OUT"; string.(vars)], 1, 1, length(gradlist))) + + # Depending on the format of the expression, compose the kernel differently + if typeof(expr) <: Real + # It's something like a Float64. We initialize with the value of the expr + write(file, SCMC_quadaff_initialize(expr)) + # And that's pretty much it... Wrap up afterwards as normal + + elseif base_term(expr) + # If it's a SYM type, we initialize with zero + write(file, SCMC_quadaff_initialize(0.0)) + + # We can now add to the temporary subgradient storages + # for this variable with a coefficient of 1.0 + write(file, SCMC_quadaff_affine(string(get_name(expr)), 1.0, varlist)) + + elseif exprtype(expr)==MUL + # If it's a MUL type, we initialize with zero + write(file, SCMC_quadaff_initialize(0.0)) + + # For this to be quadratic, there's either 1 term with an exponent + # of 1 or 2, or there's 2 terms with exponents of 1. If it's 1 term + # with an exponent of 1, it's essentially affine + if length(expr.dict)==1 + for (key, val) in expr.dict + if isone(val) + write(file, SCMC_quadaff_affine(string(get_name(key)), expr.coeff, varlist)) + else # Must be something squared + write(file, SCMC_quadaff_squared(string(get_name(key)), expr.coeff, varlist)) + end + end + else # There must be two elements in the dictionary + binary_vars = string.(get_name.(keys(key.dict))) + binary_vars = binary_vars[sort_vars(binary_vars)] + write(file, SCMC_quadaff_binary(vars..., expr.coeff, varlist)) + end + + elseif exprtype(expr)==ADD + # Final option. If it's ADD type, we initialize with the addition coefficient + write(file, SCMC_quadaff_initialize(expr.coeff)) + + # Now we must go through every term in ADD's dictionary and add it as appropriate + for (key, val) in expr.dict + if base_term(key) + write(file, SCMC_quadaff_affine(string(get_name(key)), val, varlist)) + elseif exprtype(key)==MUL + binary_vars = string.(get_name.(keys(key.dict))) + binary_vars = binary_vars[sort_vars(binary_vars)] + write(file, SCMC_quadaff_binary(binary_vars..., val, varlist)) + elseif exprtype(key)==POW + write(file, SCMC_quadaff_squared(string(get_name(key.base)), val, varlist)) + else + error("How did you get here? Why is $key in a quadratic term?") + end + end + else + error("How did you get here? Somehow this is marked as quadratic: $num") + end + + # Wrap up the kernel by calculating bounds and relaxations + # (NOTE: Technically, calculating the intercepts of the relaxations, + # which is what the kernel is doing normally, is more useful. ParBB + # will need to convert from relaxation values to intercepts anyway. + # EAGO already does this and bypasses the need to calculate relaxations. + # But, for compatibility with McCormick-style relaxations in ParBB, + # it's easier to simply calculate what ParBB is expecting.) + write(file, postamble_quadaff(string.(vars), varlist)) + close(file) + + # Include this kernel so SCMC knows what it is + include(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl")) + + # Add onto the file the "main" CPU function that calls the kernel + blocks = Int32(CUDA.attribute(CUDA.device(), CUDA.DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT)) + file = open(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl"), "a") + write(file, outro(expr_hash, [1], [string.(vars)], ["OUT"], blocks, get_name.(gradlist))) + close(file) + + # Include the file again to get the final kernel + include(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl")) + func_name = eval(Meta.parse("f_"*expr_hash)) + @eval $(func_name)(CUDA.zeros(Float64, 2, 4+2*length($gradlist)), [CUDA.zeros(Float64, 2,4) for i = 1:length($gradlist)]...) + return func_name +end + + +# Note: Currently doesn't consider specific outputs or constants. +# Outputs can be modified by passing that through to the string +# kernels, which will then replace, e.g., "OUT" with "#OUT". +# Not sure yet how I want to handle constants. +# This function takes information about the file name, kernel ID, and +# the expression that a SINGLE kernel is being created for, and creates +# that kernel in the specified file. +create_kernel!(expr_hash::String, kernel_ID::Int, num::Num, gradlist::Vector{Symbol}, func_outputs::Vector{Symbol}, constants::Vector{Num}, orig_factored::Vector{Equation}, orig_sparsity::Vector{Vector{Int}}) = create_kernel!(expr_hash, kernel_ID, num.val, gradlist, func_outputs, constants, orig_factored, orig_sparsity) +function create_kernel!(expr_hash::String, kernel_ID::Int, num::BasicSymbolic{Real}, gradlist::Vector{Symbol}, func_outputs::Vector{Symbol}, constants::Vector{Num}, orig_factored::Vector{Equation}, orig_sparsity::Vector{Vector{Int}}) + # This function will create a kernel for `num`, with the name: + # "f_" * expr_hash * "_$n". This name will be pushed to `kernels`, + # and a vector of the required inputs variables will be pushed to + # `inputs`. Other inputs are needed to determine portions of the + # kernel itself. + + # Start by factorizing the input expression + factorized = factor(num, split_div=true) + + # Perform substitutions if possible + factorized = perform_substitutions(factorized) + + # Collect all the LHS terms and participating variables + LHS = string.(getfield.(factorized, :lhs)) + vars = get_name.(pull_vars(num)) + + # Put the factorized expression into directed acyclic graph form + edgelist, varids = eqn_edges(factorized) #varids includes all aux variables also + g = SimpleDiGraph(edgelist) + + # Perform a topological sort to get the order in which we should + # perform calculations (i.e., the final entry in "varorder" is the + # full original expression) + varorder = varids[topological_sort(g)] + + # Now, we need sparsity information for all the variables. We can pull sparsity information + # normally, unless it's a temporary variable, in which case we have to refer to the original + # factorization and sparsity. + string_gradlist = string.(gradlist) + sparsity = Vector{Vector{Int}}(undef, length(varorder)) + for i in eachindex(varorder) + if varorder[i] in string_gradlist + # Mark sparsity if the variable is already in gradlist + sparsity[i] = [findfirst(==(varorder[i]), string_gradlist)] + else + # Find out what index we're on + idx = findfirst(x -> isequal(string(x.lhs), varorder[i]), factorized) + + if isnothing(idx) + sparsity[i] = orig_sparsity[findfirst(x -> isequal(string(x.lhs), varorder[i]), orig_factored)] + else + # Extract all the variables for this index + vars = pull_vars(extract(factorized, idx)) + + # For each variable in the expanded expression, add in sparsity information + curr_sparsity = Int[] + for var in vars + ID = findfirst(==(string(get_name(var))), string_gradlist) + if isnothing(ID) + # If we didn't find the variable, we need to scan the original factorization, + # and then pull sparsity info from the original sparsity list + ID = findfirst(x -> isequal(string(x.lhs), string(var)), orig_factored) + push!(curr_sparsity, orig_sparsity[ID]...) + else + # If we do find the variable, we can add this variable directly into the sparsity + push!(curr_sparsity, ID) + end + end + + # Add a sorted, unique list to the sparsity tracker + sparsity[i] = sort(unique(curr_sparsity)) + end + end + end + + # Check if we need temporary variables at all. We don't need + # temporary variables if we only have addition, or if we have + # the addition of single-rule terms, since we can just keep adding + # new information to the existing output space. E.g.: + # x + y + z : No temporary variables needed + # 3x + x*y + z^2 : No temporary variables needed + # x*y + y*z + x*y*z : Temporary variable needed because x*y*z is two rules + # need_temps = depth_check(factorized) + # NOTE: Alternatively, saving data to global GPU memory will definitely + # be slower than saving it to a temporary variable and copying it + # to global memory only at the end. Though, that would mean more + # local storage for each thread, which would limit the number of + # threads per SM that could be used (and affect occupancy). So, + # in some cases it may be better to store data in temporary variables, + # and in other cases it might be better to store directly to the + # final output location. This may require some testing, and then + # perhaps a flag that overrides "need_temps" and the subtraction + # of 1 from the temp count later on. + # (Disabling entirely for now) + + # Glossary: + # varids: ALL variables including base variables and aux variables + # varorder: A topologically sorted list of varids + # vars: Variables that participate in the original expression + # (i.e., NOT including ones produced through factorization) + + # g.fadjlist[i]: Contains indices of varids that depend on varids[i] + # g.badjlist[i]: Contains indices of varids that are needed to compute varids[i] + + # Calculate the number of temporary variables needed. + temp_endlist = [] + maxtemp = 0 + # if need_temps #(Skip for now) + for i in eachindex(varorder) # Loop through every participating variable + if (varorder[i] in string.(get_name.(vars))) + # Skip the variable if it's an input + continue + end + # Find which index varorder[i] is in `varids` + ID = findfirst(x -> occursin(varorder[i], x), varids) + tempID = 0 + + # If we are not already keeping track of temporary variables, + # this becomes the first one + if isempty(temp_endlist) + # Keep track of what varids depend on this temporary variable + push!(temp_endlist, copy(g.fadjlist[ID])) + tempID = 1 + else + # Check if this variable's expression uses addition. If so, + # check if either of the RHS variables appeared earlier + # in varorder. + factorized_ID = findfirst(x -> isequal(string(x.lhs), varorder[i]), factorized) + if exprtype(factorized[factorized_ID].rhs) == ADD + # Check through the temp_endlist to see if any temporary variables + # ONLY point to this ID (i.e., they aren't used elsewhere). If so, + # we can re-use that temporary variable and overwrite the results + # with addition. + for j in eachindex(temp_endlist) + if (length(temp_endlist[j])==1) && (temp_endlist[j][1]==ID) + temp_endlist[j] = copy(g.fadjlist[ID]) + tempID = j + break + end + end + end + + # Check if there are any temporary variables we can override + for j in eachindex(temp_endlist) + if isempty(temp_endlist[j]) # Then we can override this one + temp_endlist[j] = copy(g.fadjlist[ID]) + tempID = j + break + end + end + if tempID==0 # Then we haven't found one we can override + push!(temp_endlist, copy(g.fadjlist[ID])) + tempID = length(temp_endlist) + end + end + + # Now that we're done with this variable, look over other + # temporary variables to see if they're no longer needed + for j in eachindex(temp_endlist) + if ID in temp_endlist[j] + filter!(x -> x!=ID, temp_endlist[j]) + end + end + if tempID > maxtemp + maxtemp = tempID + end + end + # end # Skipping outer loop for now + + # [Deprecating, using temporary variables to decrease global memory accesses] + # # We have one more temporary variable than we need, since at + # # least one result could have been stored in the final output + # # of this kernel. + # maxtemp -= 1 + + # At this point, we should be ready to write the kernel. Open + # the file in "append" mode so that other info that was written + # won't be impacted. + file = open(joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl"), "a") + + # Put in the preamble. + write(file, preamble_string(expr_hash, ["OUT"; string.(get_name.(vars))], kernel_ID, maxtemp, length(gradlist))) + + # Loop through the topological list to add calculations in order + temp_endlist = [] + outvar = "" + name_tracker = copy(varids) + for i in eachindex(varorder) # Order in which variables are calculated + # Skip calculation if the variable is one of the inputs + if (varorder[i] in string.(get_name.(vars))) + continue + end + + # Determine the corresponding ID of the variable in varids + ID = findfirst(x -> occursin(varorder[i], x), varids) + + # Get the inputs for this operation by checking the name + # tracker (there might be a better way to do this... ah well) + factorized_ID = findfirst(x -> isequal(string(x.lhs), varorder[i]), factorized) + participants = get_name.(pull_vars(factorized[factorized_ID].rhs)) + inputs = [] + for p in string.(participants) + # Find the corresponding element in varids + varids_ID = findfirst(x -> isequal(x, p), varids) + # Push the name_tracker name to the input list + push!(inputs, name_tracker[varids_ID]) + end + + # [Deprecating; I'll use temporary variables the whole way and then set + # the output variable at the end for final copying] + # # If this is the final variable, it'll be called "OUT". No need + # # for temp variables + # if i==length(varorder) + # name_tracker[ID] = "OUT" + # else + + # Determine which tempID to use/override. temp_endlist keeps + # track of where variables will be used in the future (stored + # as g.fadjlist), with elements removed as they are used. If + # there is an empty row in temp_endlist, we can re-use that + # tempID. If there isn't an empty row, we add a new row. + tempID = 0 + + # If we are not already keeping track of temporary variables, + # this becomes the first one + if isempty(temp_endlist) + # Keep track of what varids depend on this temporary variable + push!(temp_endlist, copy(g.fadjlist[ID])) + tempID = 1 + else + # Check if this variable's expression uses addition. If so, + # check if we can reuse a temporary variable. + factorized_ID = findfirst(x -> isequal(string(x.lhs), varorder[i]), factorized) + if exprtype(factorized[factorized_ID].rhs) == ADD + # Check through the temp_endlist to see if any temporary variables + # ONLY point to this ID (i.e., they aren't used elsewhere). If so, + # we can re-use that temporary variable and overwrite the results + # with addition. + for j in eachindex(temp_endlist) + if (length(temp_endlist[j])==1) && (temp_endlist[j][1]==ID) + temp_endlist[j] = copy(g.fadjlist[ID]) + tempID = j + break + end + end + end + + # Check if there are any temporary variables we can override + for j in eachindex(temp_endlist) + if isempty(temp_endlist[j]) # Then we can override this one + temp_endlist[j] = copy(g.fadjlist[ID]) + tempID = j + break + end + end + if tempID==0 # Then we haven't found one we can override + push!(temp_endlist, copy(g.fadjlist[ID])) + tempID = length(temp_endlist) + end + end + + # When we refer to this variable in the future, we need to know what tempID + # the variable is using + name_tracker[ID] = "temp$(tempID)" + + # Now we can append this temporary variable to the list of inputs + # for the correct operation + inputs = [name_tracker[ID]; inputs] + + # Now we can pass the equation's RHS and the inputs to call the correct + # writer function + write_operation(file, factorized[factorized_ID].rhs, inputs, string.(gradlist), sparsity[i]) + + # Now that we're done with this variable, eliminate this variable + # from the lists of temporary variables' requirements + for j in eachindex(temp_endlist) + if ID in temp_endlist[j] + filter!(x -> x!=ID, temp_endlist[j]) + end + end + + # Keep track of the name of the output variable for setting the output + if i==length(varorder) + outvar = name_tracker[ID] + end + end + + # Now that the function is complete, we can close out the function + write(file, postamble(outvar)) + close(file) + + # And here's the function, if we want to print it out... + # @show joinpath(@__DIR__, "storage", "f_"*expr_hash*".jl") + return nothing +end + +# This function detects subexpressions in the factored list of equations +# that have known/improved relaxations, and replaces them with their +# improved forms. All LHS forms are replaced by the RHS equivalent. +# Some reformulations must be checked before others, since structures +# may change and hide possible reformulations. E.g., if we have the +# expression 2^(log(x*y)), the ideal reformulation is: (x*y)^log(2). +# But, based on the ordering of factors, "log(x*y)" will appear earlier +# than "2^(log(x*y)), and "log(x*y)" reformulates to "log(x) + log(y)". +# This reformulation would disable the ideal reformulation above, +# since we'd then have 2^(log(x) + log(y)). Larger-scale reformulations +# like this example are marked by "HIGH PRIORITY" and are searched for +# first, before any other reformulations. +# Included forms: +# 1) exp(x1)*exp(x2) = exp(x1+x2) [EAGO paper/Misener2014] +# 2) log(x1^a) = a*log(x1) [EAGO paper/Misener2014] +# 3) log(a^x1) = x1*log(a) [EAGO paper] +# 4) log(x1*x2) = log(x1) + log(x2) [EAGO paper] +# 5) (x1^a)^b = x1^(a*b) [EAGO paper] +# 6) a^(log(x1)) = x1^(log(a)) [EAGO paper] (HIGH PRIORITY) +# 7) log(inv(x1)) = -log(x1) [EAGO paper] +# 8) CONST1*CONST2*x1 = (CONST1*CONST2)*x1 +# 9) 1 / (1 + exp(-x)) = Sigmoid(x) +# +# Forms that aren't relevant yet: +# 1) (a^x1)^b = (a^b)^x1 [EAGO paper] (Can't do powers besides integers) +function perform_substitutions(old_factored::Vector{Equation}) + factored = deepcopy(old_factored) + + # Register any terms we want to substitute + @eval @register_symbolic SCMC_sigmoid(x) + + scan_flag = true + while scan_flag + scan_flag = false + + # Higher priority reformulations + for index0 in eachindex(factored) + # 6) a^(log(x1)) = x1^(log(a)) [EAGO paper] + if exprtype(factored[index0].rhs)==POW + # We only apply this rule if the base of the power is Real-valued + if typeof(factored[index0].rhs.base) <: Real + index1 = findfirst(x -> isequal(x.lhs, factored[index0].rhs.exp), factored) + if !isnothing(index1) && exprtype(factored[index1].rhs)==TERM + if factored[index1].rhs.f==log + # We also only want to apply this rule if the argument of + # log() is a variable + if !(typeof(arguments(factored[index1].rhs)[]) <: Real) + # We have: + # aux1 = log(x1) + # aux2 = CONST^aux1 + # + # We will replace with: + # aux1 = log(x1) + # aux2 = x1^[log(CONST)] + scan_flag = true + + # Identify the log variable and base constant value + log_var = arguments(factored[index1].rhs)[] + base_val = factored[index0].rhs.base + + # Modify index0 + ID_1 = findfirst(x -> isequal(x.rhs, log_var^log(base_val)), factored) + if isnothing(ID_1) + @eval $factored[$index0] = $factored[$index0].lhs ~ $log_var^log($base_val) + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_1].lhs)) + end + deleteat!(factored, index0) + end + break + end + end + end + end + end + end + + # Lower priority reformulations + if scan_flag==false + for index0 in eachindex(factored) + # 1) exp(x1)*exp(x2) = exp(x1+x2) [EAGO paper/Misener2014] + if exprtype(factored[index0].rhs)==MUL + # We need to check all the multiplication arguments. We create + # a list of all the args using a recursive function. + args = pull_mult(factored, index0) + + # Count the number of args that are "exp" + exp_count = 0 + exp_args = [] + if length(args) > 1 + for arg in args + if !(typeof(arg) <: Real) && exprtype(arg)==TERM + if arg.f==exp + exp_count += 1 + push!(exp_args, arguments(arg)[]) + end + end + end + end + + # If we have more than 1 "exp", we'll apply this rule. + # Otherwise, we don't do anything. + if exp_count > 1 + # We're going to create one big term and factor it, since + # the arrangement of multiplications in the original factorization + # might not line up with the changes + scan_flag = true + # Create the initial exp() + new_expr = exp(sum(exp_args)) + # Multiply by all the non-exp terms + for arg in args + if exprtype(arg)!=TERM || arg.f!=exp + new_expr *= arg + end + end + # Create a factorization of this new expr + new_factorization = factor(new_expr) + # Scan through the new factorization to see if we can merge elements + # with the original factored list + done = false + last_match = nothing + while !done + done = true + for i in eachindex(new_factorization) + ID_1 = findfirst(x -> isequal(x.rhs, new_factorization[i].rhs), factored) + if !isnothing(ID_1) + # Match was found in the main factorization. Remove this element + # from the new factorization and replace all references to it with + # the auxiliary variable of ID_1 + for j in eachindex(new_factorization) + new_factorization[j] = new_factorization[j].lhs ~ substitute(new_factorization[j].rhs, Dict(new_factorization[i].lhs => factored[ID_1].lhs)) + end + last_match = factored[ID_1].lhs + deleteat!(new_factorization, i) + done = false + break + end + end + end + # Add remaining elements of the factorization to the location of index0 + if length(new_factorization) >= 1 + for j = length(new_factorization)-1:-1:1 + insert!(factored, index0, new_factorization[j]) + end + @eval $factored[$index0+length($new_factorization)-1] = $factored[$index0+length($new_factorization)-1].lhs ~ $new_factorization[end].rhs + else + # Or, if no elements exist, replace all instances of this new auxiliary variable with the last known match + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $last_match)) + end + deleteat!(factored, index0) + end + break + end + + end + + # 2) log(x1^a) = a*log(x1) [EAGO paper/Misener2014] + # Equivalent in this code to: + # 3) log(a^x1) = x1*log(a) [EAGO paper] + if exprtype(factored[index0].rhs)==TERM + if factored[index0].rhs.f==log + index1 = findfirst(x -> isequal(x.lhs, arguments(factored[index0].rhs)[]), factored) + if !isnothing(index1) && exprtype(factored[index1].rhs)==POW + # If the argument of log() is POW type, we can separate based + # on the `base` and `exp` + # start: + # aux1 = log(x^a) + # + # Convert to: + # aux2 = log(x) + # aux1 = a*aux2 + scan_flag = true + factor_base = factored[index1].rhs.base + factor_exp = factored[index1].rhs.exp + + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + if typeof(factor_base) <: Real + # Check whether the new term exists, and then either add it or only refer to that term + ID_1 = findfirst(x -> isequal(x.rhs, factor_exp*log(factor_base)), factored) + if isnothing(ID_1) + @eval $factored[$index0] = $factored[$index0].lhs ~ $factor_exp*log($factor_base) + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_1].lhs)) + end + deleteat!(factored, index0) + end + else + # Check whether terms already exist, and then either add them or only refer to them + ID_1 = findfirst(x -> isequal(x.rhs, log(factor_base)), factored) + if isnothing(ID_1) + insert!(factored, index0, Equation(Symbolics.value(newvar), log(factor_base))) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ $factor_exp*$factored[$index0].lhs + else + # The log term exists... does factor_exp*log_term also exist? + ID_2 = findfirst(x -> isequal(x.rhs, factor_exp*factored[ID_1].lhs), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ $factor_exp*$factored[$ID_1].lhs + else + # Both the inner and outer terms already exist. All terms that refer to factored[index0] + # should instead refer to the term that already exists + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + end + break + end + end + end + + # 4) log(x1*x2) = log(x1) + log(x2) [EAGO paper] + if exprtype(factored[index0].rhs)==TERM + if factored[index0].rhs.f==log + index1 = findfirst(x -> isequal(x.lhs, arguments(factored[index0].rhs)[]), factored) + if !isnothing(index1) && exprtype(factored[index1].rhs)==MUL + # If the argument of log() is MUL type, we can create two new + # log() terms and add them together + # start: + # aux1 = log(x*y) + # + # Convert to: + # aux2 = log(x) + # aux3 = log(y) + # aux1 = aux2+aux3 + # + # Or: + # aux1 = log(CONST*x) + # to: + # aux2 = log(x) + # aux1 = log(CONST) + aux2 + scan_flag = true + args = [keys(factored[index1].rhs.dict)...] + coeff = factored[index1].rhs.coeff + + if length(args)==1 + # If there's only one arg, it's the CONST*x case + # Check whether log(x) already exists + ID_1 = findfirst(x -> isequal(x.rhs, log(args[1])), factored) + if isnothing(ID_1) + # If we don't already have log(x), create a new auxiliary variable + # and update the old expression + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar), log(args[1]))) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ log($coeff) + $factored[$index0].lhs + else + # If log(x) already exists, check if log(COEFF) + log(x) exists + ID_2 = findfirst(x -> isequal(x.rhs, log(coeff) + factored[ID_1].lhs), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ log($coeff) + $factored[$ID_1].lhs + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + else + # If there isn't one argument, there are two, and it's + # the x*y case. Check whether log(x) or log(y) already exist + ID_1 = findfirst(x -> isequal(x.rhs, log(args[1])), factored) + ID_2 = findfirst(x -> isequal(x.rhs, log(args[2])), factored) + + if isnothing(ID_1) && isnothing(ID_2) + # Neither log(x) nor log(y) exist, so we need to make them + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar1 = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar1), log(args[1]))) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar2 = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar2), log(args[2]))) + @eval $factored[$index0+2] = $factored[$index0+2].lhs ~ $factored[$index0].lhs + $factored[$index0+1].lhs + elseif isnothing(ID_1) + # Only log(y) exists, so we need to make log(x) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar1 = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar1), log(args[1]))) + # Find ID_2 again since it may have shifted + ID_2 = findfirst(x -> isequal(x.rhs, log(args[2])), factored) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ $factored[$index0].lhs + $factored[$ID_2].lhs + elseif isnothing(ID_2) + # Only log(x) exists, so we need to make log(y) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar2 = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar2), log(args[2]))) + # Find ID_1 again since it may have shifted + ID_1 = findfirst(x -> isequal(x.rhs, log(args[1])), factored) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ $factored[$ID_1].lhs + $factored[$index0].lhs + else + # Both log(x) and log(y) exist, so we can use those auxiliary variables + @eval $factored[$index0] = $factored[$index0].lhs ~ $factored[$ID_1].lhs + $factored[$ID_2].lhs + end + end + break + end + end + end + + # 5) (x1^a)^b = x1^(a*b) [EAGO paper] + if exprtype(factored[index0].rhs)==POW + # Two cases we care about: either we've found (thing1)^(thing2) + # and thing1 is POW, or (thing1)^(thing2) and thing2 is POW. + index1 = findfirst(x -> isequal(x.lhs, factored[index0].rhs.base), factored) + if !isnothing(index1) && exprtype(factored[index1].rhs)==POW + # If we have: + # aux1 = x1^[any1] (index1) + # aux2 = aux1^[any2] (index0) + # + # Go to: + # aux1 = x1^[any1] + # aux3 = [any1]*[any2] + # aux2 = x1^aux3 + # + # Or, if [any1] and [any2] are both numbers, + # aux1 = x1^[any1] + # aux2 = x1^([any1]*[any2]) + scan_flag = true + + # Identify the lower-level base, "x1" + factor_base = factored[index1].rhs.base + + # Identify the two exponents + exp1 = factored[index0].rhs.exp + exp2 = factored[index1].rhs.exp + + # Create new terms based on the exponents + if typeof(exp1) <: Real && typeof(exp2) <: Real + ID_1 = findfirst(x -> isequal(x.rhs, factor_base^(exp1*exp2)), factored) + if isnothing(ID_1) + @eval $factored[$index0] = $factored[$index0].lhs ~ $factor_base^($exp1*$exp2) + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_1].lhs)) + end + deleteat!(factored, index0) + end + else + ID_1 = findfirst(x -> isequal(x.rhs, exp1*exp2), factored) + if isnothing(ID_1) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar), exp1*exp2)) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ $factor_base^$factored[$index0].lhs + else + ID_2 = findfirst(x -> isequal(x.rhs, factor_base^factored[ID_1].lhs), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ $factor_base^$factored[$ID_1].lhs + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + end + break + end + # Try again with the second case + index1 = findfirst(x -> isequal(x.lhs, factored[index0].rhs.exp), factored) + if !isnothing(index1) && exprtype(factored[index1].rhs)==POW + # If we have: + # aux1 = [any1]^[any2] (index1) + # aux2 = x1^[aux1] (index0) + # + # Go to: + # aux1 = [any1]^[any2] + # aux3 = [any1]*[any2] + # aux2 = x1^aux3 + scan_flag = true + + # Identify the lower-level base, "x1" + factor_base = factored[index0].rhs.base + + # Identify the correct exponents + exp1 = factored[index1].rhs.base + exp2 = factored[index1].rhs.exp + + # Create new terms based on the exponents + ID_1 = findfirst(x -> isequal(x.rhs, exp1*exp2), factored) + if isnothing(ID_1) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar), exp1*exp2)) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ $factor_base^$factored[$index0].lhs + else + ID_2 = findfirst(x -> isequal(x.rhs, factor_base^factored[ID_1].lhs), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ $factor_base^$factored[$ID_1].lhs + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + break + end + end + + # 7) log(inv(x1)) = -log(x1) [EAGO paper] + if exprtype(factored[index0].rhs)==TERM + if factored[index0].rhs.f==log + index1 = findfirst(x -> isequal(x.lhs, arguments(factored[index0].rhs)[]), factored) + if !(isnothing(index1)) && exprtype(factored[index1].rhs)==DIV + # Since division is split into multiplication and inversion, + # if we have division, that means we have 1/[thing]. + # We have: + # aux1 = 1 / [thing] + # aux2 = log(aux1) + # + # We want to convert this to: + # aux1 = 1 / [thing] + # aux3 = log([thing]) + # aux2 = -aux3 + scan_flag = true + ID_1 = findfirst(x -> isequal(x.rhs, log(factored[index1].rhs.den)), factored) + if isnothing(ID_1) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar), log(factored[index1].rhs.den))) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ -$factored[$index0].lhs + else + ID_2 = findfirst(x -> isequal(x.rhs, -factored[ID_1].lhs), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ -$factored[$ID_1].lhs + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + break + end + end + end + + # 8) CONST1*CONST2*x1 = (CONST1*CONST2)*x1 + if exprtype(factored[index0].rhs)==MUL + # We need to check all the multiplication arguments. We create + # a list of all the args using a recursive function. + args = pull_mult(factored, index0) + + # Count the number of args that are Real-valued + real_count = 0 + if length(args) > 1 + for arg in args + if typeof(arg) <: Real + real_count += 1 + end + end + end + + # If we have more than 1 Real-valued argument, we'll apply this rule. + # Otherwise, we don't do anything. + if real_count > 1 + # We're going to create one big term and factor it, since + # the arrangement of multiplications in the original factorization + # might not line up with the changes + scan_flag = true + # Create the initial object + new_expr = Num(1.0) + # Multiply by all the terms + for arg in args + new_expr *= arg + end + # Create a factorization of this new expr + new_factorization = factor(new_expr) + + + # Scan through the new factorization to see if we can merge elements + # with the original factored list + done = false + last_match = nothing + while !done + done = true + for i in eachindex(new_factorization) + ID_1 = findfirst(x -> isequal(x.rhs, new_factorization[i].rhs), factored) + if !isnothing(ID_1) + # Match was found in the main factorization. Remove this element + # from the new factorization and replace all references to it with + # the auxiliary variable of ID_1 + for j in eachindex(new_factorization) + new_factorization[j] = new_factorization[j].lhs ~ substitute(new_factorization[j].rhs, Dict(new_factorization[i].lhs => factored[ID_1].lhs)) + end + last_match = factored[ID_1].lhs + deleteat!(new_factorization, i) + done = false + break + end + end + end + # Add remaining elements of the factorization to the location of index0 + if length(new_factorization) >= 1 + for j = length(new_factorization)-1:-1:1 + insert!(factored, index0, new_factorization[j]) + end + @eval $factored[$index0+length($new_factorization)-1] = $factored[$index0+length($new_factorization)-1].lhs ~ $new_factorization[end].rhs + else + # Or, if no elements exist, replace all instances of this new auxiliary variable with the last known match + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $last_match)) + end + deleteat!(factored, index0) + end + break + end + + end + + # 9) 1 / (1 + exp(-x)) = Sigmoid(x) + if exprtype(factored[index0].rhs)==DIV + # Get index of the denominator + index1 = findfirst(x -> isequal(x.lhs, factored[index0].rhs.den), factored) + if !isnothing(index1) && exprtype(factored[index1].rhs)==ADD + # Make sure denominator is (1 + [...]) + if factored[index1].rhs.coeff==1 + for key in keys(factored[index1].rhs.dict) + # Get the index of the other term + index2 = findfirst(x -> isequal(x.lhs, key), factored) + if !isnothing(index2) && exprtype(factored[index2].rhs)==TERM + # If the other term is a "TERM" type, make sure it's "exp" + if factored[index2].rhs.f==exp + scan_flag = true + # Get the index of the argument of "exp()" + index3 = findfirst(x -> isequal(x.lhs, arguments(factored[index2].rhs)[]), factored) + if isnothing(index3) + # exp's argument is a base-level variable. Add a negation of that variable + # and take the sigmoid of that. + # Check first to make sure these terms aren't already being used + ID_1 = findfirst(x -> isequal(x.rhs, -1*arguments(factored[index2].rhs)[]), factored) + if isnothing(ID_1) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar), -1*arguments(factored[index2].rhs)[])) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ SCMC_sigmoid($newvar) + else + ID_2 = findfirst(x -> isequal(x.rhs, SCMC_sigmoid(factored[ID_1].lhs)), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ SCMC_sigmoid($factored[$ID_1].lhs) + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + elseif (exprtype(factored[index3].rhs)==MUL) && (factored[index3].rhs.coeff==-1) + # Ideal case. The argument of exp() is already negated. Simply make + # the RHS "SCMC_sigmoid(arg)" (if it doesn't already exist) + arg = arguments(factored[index3].rhs)[2] + arg = isequal(arg,-1) ? arguments(factored[index3].rhs)[1] : arg + ID_1 = findfirst(x -> isequal(x.rhs, SCMC_sigmoid(arg)), factored) + if isnothing(ID_1) + @eval $factored[$index0] = $factored[$index0].lhs ~ SCMC_sigmoid($arg) + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_1].lhs)) + end + deleteat!(factored, index0) + end + else + # exp's argument is not yet negated. Add a negation of that variable and + # take the sigmoid of that, if needed. + ID_1 = findfirst(x -> isequal(x.rhs, -1*factored[index3].lhs), factored) + if isnothing(ID_1) + newsym = gensym(:aux) + newsym = Symbol(string(newsym)[3:5] * string(newsym)[7:end]) + newvar = genvar(newsym) + insert!(factored, index0, Equation(Symbolics.value(newvar), -1*factored[index3].lhs)) + @eval $factored[$index0+1] = $factored[$index0+1].lhs ~ SCMC_sigmoid($newvar) + else + ID_2 = findfirst(x -> isequal(x.rhs, SCMC_sigmoid(factored[ID_1].lhs)), factored) + if isnothing(ID_2) + @eval $factored[$index0] = $factored[$index0].lhs ~ SCMC_sigmoid($factored[$ID_1].lhs) + else + for i in eachindex(factored) + @eval $factored[$i] = $factored[$i].lhs ~ substitute($factored[$i].rhs, Dict($factored[$index0].lhs => $factored[$ID_2].lhs)) + end + deleteat!(factored, index0) + end + end + end + break + end + end + end + end + end + end + end + end + + # Perform a cleaning step to eliminate any expressions that are no + # longer used in the final result + factored = cleaner(factored) + end + + return factored +end + +# This function "cleans" a factored expression by removing any terms +# that do not participate in the final expression. +function cleaner(list::Vector{Equation}) + IDs = zeros(Bool, length(list)) + # Start with the final term, and begin looking for participating + # terms. + cleaner(list[end].rhs, list, IDs) + return list[IDs] +end +function cleaner(ex::BasicSymbolic, list::Vector{Equation}, IDs::Vector{Bool}) + # Add this expression to the list of IDs + ID = findfirst(x -> isequal(x.rhs, ex), list) + isnothing(ID) && return nothing + IDs[ID] = true + + # Find all variables in "ex", add them to the list, and check those + # expressions as well. + if exprtype(ex)==SYM + # No need to add anything else + nothing + elseif exprtype(ex)==TERM + new_ID = findfirst(x -> isequal(x.lhs, ex.arguments[]), list) + !isnothing(new_ID) && cleaner(list[new_ID].rhs, list, IDs) + elseif exprtype(ex)==ADD + for (key, val) in ex.dict + new_ID = findfirst(x -> isequal(x.lhs, key), list) + !isnothing(new_ID) && cleaner(list[new_ID].rhs, list, IDs) + end + elseif exprtype(ex)==MUL + for (key, val) in ex.dict + new_ID = findfirst(x -> isequal(x.lhs, key), list) + !isnothing(new_ID) && cleaner(list[new_ID].rhs, list, IDs) + end + elseif exprtype(ex)==DIV + new_ID = findfirst(x -> isequal(x.lhs, ex.den), list) + isnothing(new_ID) && return nothing + cleaner(list[new_ID].rhs, list, IDs) # Assuming no numerator since we're splitting division + elseif exprtype(ex)==POW + new_ID = findfirst(x -> isequal(x.lhs, ex.base), list) + !isnothing(new_ID) && cleaner(list[new_ID].rhs, list, IDs) + new_ID = findfirst(x -> isequal(x.lhs, ex.exp), list) + !isnothing(new_ID) && cleaner(list[new_ID].rhs, list, IDs) + else + nothing + end + return nothing +end +function cleaner(ex::Real, list::Vector{Equation}, IDs::Vector{Bool}) + error("This probably shouldn't be reached. Submit an issue with the expression that brought you here.") + # Add this expression to the list of IDs + ID = findfirst(x -> isequal(x.rhs, ex), list) + isnothing(ID) && return nothing + IDs[ID] = true + return nothing +end +cleaner(ex::Any, list::Vector{Equation}, IDs::Vector{Bool}) = nothing + +# A helper function to pull all the multiplications connected to one +# factor. +function pull_mult(factors, index; args=[]) + if exprtype(factors[index].rhs)==MUL + # Identify the new args + for key in keys(factors[index].rhs.dict) + new_index = findfirst(x -> isequal(x.lhs, key), factors) + if !isnothing(new_index) + args = pull_mult(factors, new_index, args=args) + else + push!(args, key) + end + end + if !isone(factors[index].rhs.coeff) + push!(args, factors[index].rhs.coeff) + end + else + # Add the index of the factor to the list of args + push!(args, factors[index].rhs) + end + return args +end + + +# A helper function to calculate the sparsity of a factorization, given +# the full gradlist +function detect_sparsity(factored, gradlist) + # Idea is to check every element of "factored" and pull out a list of indices + # in gradlist that the variables depend on. + sparsity = Vector{Int}[] + string_gradlist = string.(gradlist) + + for i in eachindex(factored) + vars = string.(pull_vars(extract(factored, i))) + indices = zeros(Int, length(vars)) + for j in eachindex(indices) + indices[j] = findfirst(==(string(vars[j])), string_gradlist) + end + push!(sparsity, indices) + end + + return sparsity +end + +# This function writes the preamble of a CUDA kernel to the specified file. +function preamble_string(file_hash::String, inputs::Vector{String}, kernel_ID::Int, n_temp_vars::Int, dims::Int) + kernel_inputs = String(inputs[1]) + for i = 2:length(inputs) + kernel_inputs *= ", $(String(inputs[i]))" + end + + buffer = Base.IOBuffer() + + write(buffer, "function f_$(file_hash)_$kernel_ID($(kernel_inputs))\n") + write(buffer, " idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x\n") + write(buffer, " stride = blockDim().x * gridDim().x\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " colmax = Int32($dims)\n") + + for i = 1:n_temp_vars + write(buffer, " temp$(i)_lo = 0.0\n") + write(buffer, " temp$(i)_hi = 0.0\n") + write(buffer, " temp$(i)_cv = 0.0\n") + write(buffer, " temp$(i)_cc = 0.0\n") + write(buffer, " temp$(i)_cvgrad = @MVector zeros(Float64, $dims)\n") + write(buffer, " temp$(i)_ccgrad = @MVector zeros(Float64, $dims)\n") + end + + # A development flag for enabling @inbounds in the generated kernels. Although @inbounds + # should speed up the kernels due to the number of indexed memory accesses, in my testing + # it actually made the kernels SLOWER. This could be due to GPU-side optimizations that + # expect bounds-checking, and perhaps the compiler can't do those optimizations if I get + # rid of the bounds check... Might be worth investigating at some point, but leave as + # "false" for now. + enable_inbounds = false + if enable_inbounds + write(buffer, " @inbounds while idx <= Int32(size($(inputs[1]),1))\n") + else + write(buffer, " while idx <= Int32(size($(inputs[1]),1))\n") + end + + return String(take!(buffer)) + +end + +# This function deciphers the type of RHS and selects +# the correct operation to add to the kernel in `file` +function write_operation(file::IOStream, RHS::BasicSymbolic{Real}, inputs::Vector{Any}, gradlist::Vector{String}, sparsity::Vector{Int}) + if exprtype(RHS) == ADD + if ~iszero(RHS.coeff) + write(file, SCMC_cadd_kernel(inputs..., RHS.coeff, gradlist, sparsity)) + elseif inputs[1]==inputs[2] + write(file, SCMC_add_to_kernel(inputs[1], inputs[3], gradlist, sparsity)) + elseif inputs[1]==inputs[3] + write(file, SCMC_add_to_kernel(inputs[1], inputs[2], gradlist, sparsity)) + else + write(file, SCMC_add_kernel(inputs..., gradlist, sparsity)) + end + elseif exprtype(RHS) == MUL + if isone(RHS.coeff) + write(file, SCMC_mult_kernel(inputs..., gradlist, sparsity)) + elseif RHS.coeff==-1 + write(file, SCMC_negate_kernel(inputs..., gradlist, sparsity)) + else + write(file, SCMC_cmul_kernel(inputs..., RHS.coeff, gradlist, sparsity)) + end + elseif exprtype(RHS) == DIV + if isone(RHS.num) + write(file, SCMC_inv_kernel(inputs..., gradlist, sparsity)) + else + close(file) + error("Division shouldn't have a numerator at this point ($RHS)") + end + elseif exprtype(RHS) == POW + if isinteger(RHS.exp) + write(file, SCMC_int_power_kernel(inputs..., Int(RHS.exp), gradlist, sparsity)) + else + write(file, SCMC_float_power_kernel(inputs..., RHS.exp, gradlist, sparsity)) + end + elseif exprtype(RHS) == TERM + if RHS.f==exp + write(file, SCMC_exp_kernel(inputs..., gradlist, sparsity)) + elseif RHS.f==log + write(file, SCMC_log_kernel(inputs..., gradlist, sparsity)) + elseif RHS.f==SCMC_sigmoid + write(file, SCMC_sigmoid_kernel(inputs..., gradlist, sparsity)) + elseif RHS.f==sqrt + write(file, SCMC_float_power_kernel(inputs..., 0.5, gradlist, sparsity)) + else + close(file) + error("Some function was used that we can't handle yet ($RHS)") + end + else + close(file) + error("Something's wrong? $RHS") + end + return nothing +end + +# Once the kernel is almost finished, the last-used temporary variable needs +# to be written to the output matrix. This adds text to accomplish that task, +# and then concludes the kernel. +function postamble(outvar::String) + buffer = Base.IOBuffer() + write(buffer, "\n") + write(buffer, " OUT[idx,1] = $(outvar)_cv\n") + write(buffer, " OUT[idx,2] = $(outvar)_cc\n") + write(buffer, " OUT[idx,3] = $(outvar)_lo\n") + write(buffer, " OUT[idx,4] = $(outvar)_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " OUT[idx,end-2*colmax+col] = $(outvar)_cvgrad[col]\n") + write(buffer, " OUT[idx,end-1*colmax+col] = $(outvar)_ccgrad[col]\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " idx += stride\n") + write(buffer, " end\n") + write(buffer, " return nothing\n") + write(buffer, "end\n") + return String(take!(buffer)) +end + +# A special case, for the quadratic kernel +function postamble_quadaff(vars::Vector{String}, gradlist::Vector{String}) + # Some quick calculation is needed to figure out convex/concave relaxations + # and bounds. Subgradients are already set, however. + + # Basic introduction + buffer = Base.IOBuffer() + write(buffer, " #####################################\n") + write(buffer, " ## Finalize Relaxations and Bounds ##\n") + write(buffer, " #####################################\n") + write(buffer, "\n") + write(buffer, " temp1_cv += intercept_cv\n") + write(buffer, " temp1_cc += intercept_cc\n") + write(buffer, " temp1_lo += intercept_cv\n") + write(buffer, " temp1_hi += intercept_cc\n") + write(buffer, "\n") + + # Adjust lower/upper bounds to account for every participating variable + for var in vars + ID = findfirst(==(var), gradlist) + write(buffer, " temp1_cv += temp1_cvgrad[$ID] * $(var)[idx,1]\n") + write(buffer, " temp1_cc += temp1_ccgrad[$ID] * $(var)[idx,1]\n") + write(buffer, " if temp1_cvgrad[$ID] >= 0.0\n") + write(buffer, " temp1_lo += temp1_cvgrad[$ID] * $(var)[idx,2]\n") + write(buffer, " else\n") + write(buffer, " temp1_lo += temp1_cvgrad[$ID] * $(var)[idx,3]\n") + write(buffer, " end\n") + write(buffer, " if temp1_ccgrad[$ID] >= 0.0\n") + write(buffer, " temp1_hi += temp1_ccgrad[$ID] * $(var)[idx,3]\n") + write(buffer, " else\n") + write(buffer, " temp1_hi += temp1_ccgrad[$ID] * $(var)[idx,2]\n") + write(buffer, " end\n") + write(buffer, "\n") + end + + # Write bounds, relaxations, and subgradients to the output + write(buffer, " OUT[idx,1] = temp1_cv\n") + write(buffer, " OUT[idx,2] = temp1_cc\n") + write(buffer, " OUT[idx,3] = temp1_lo\n") + write(buffer, " OUT[idx,4] = temp1_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " OUT[idx,end-2*colmax+col] = temp1_cvgrad[col]\n") + write(buffer, " OUT[idx,end-1*colmax+col] = temp1_ccgrad[col]\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " idx += stride\n") + write(buffer, " end\n") + write(buffer, " return nothing\n") + write(buffer, "end\n") + return String(take!(buffer)) +end + +# This function creates the final CPU function that calls the +# CUDA kernels previously generated. +function outro(expr_hash::String, kernel_nums::Vector{Int}, inputs::Vector{Vector{String}}, outputs::Vector{String}, blocks::Int32, indep_vars::Vector{Symbol}) + # Start by getting the inputs to this final CPU function + final_inputs = "OUT" + for i in eachindex(indep_vars) + final_inputs *= ", $(string(indep_vars[i]))" + end + + # First, count how many temporary variables we need. We can + # re-use a temporary variable if it's no longer needed after + # it's used. While doing this, modify the inputs/outputs + # to reflect the new variable names + temp_vars = 0 + if length(inputs) > 1 + temp_tracker = Int[] + for i in eachindex(inputs) + # We don't need a temporary variable for the final kernel; + # it's just "OUT" + if i==length(inputs) + continue + end + + # We need a temporary variable. Put one in the right place. + if isempty(temp_tracker) + # If the list is empty, add this index to the list + push!(temp_tracker, i) + temp_vars += 1 + + # Change names as appropriate + starting_name = outputs[i] + final_name = "tempvar_$(length(temp_tracker))" + for j in eachindex(outputs) + if isequal(outputs[j], starting_name) + outputs[j] = final_name + end + end + for j in eachindex(inputs) + for k in eachindex(inputs[j]) + if isequal(inputs[j][k], starting_name) + inputs[j][k] = final_name + end + end + end + else + # If the list has elements, check if any are unused + # (i.e., they've been switched to 0) + unused_ID = findfirst(x -> iszero(x), temp_tracker) + if isnothing(unused_ID) + push!(temp_tracker, i) + temp_vars += 1 + + # Change names as appropriate + starting_name = outputs[i] + final_name = "tempvar_$(length(temp_tracker))" + for j in eachindex(outputs) + if isequal(outputs[j], starting_name) + outputs[j] = final_name + end + end + for j in eachindex(inputs) + for k in eachindex(inputs[j]) + if isequal(inputs[j][k], starting_name) + inputs[j][k] = final_name + end + end + end + else + temp_tracker[unused_ID] = i + + # Change names as appropriate + starting_name = outputs[i] + final_name = "tempvar_$(unused_ID)" + for j in eachindex(outputs) + if isequal(outputs[j], starting_name) + outputs[j] = final_name + end + end + for j in eachindex(inputs) + for k in eachindex(inputs[j]) + if isequal(inputs[j][k], starting_name) + inputs[j][k] = final_name + end + end + end + end + end + + # Check if we can get rid of any previous temporary variables + for j in eachindex(temp_tracker) + iszero(temp_tracker[j]) && continue + used = false + for k in i+1:length(inputs) + if outputs[temp_tracker[j]] in inputs[k] + used = true + break + end + end + if !used + temp_tracker[j] = 0 + end + end + end + end + + # Start writing to the buffer + buffer = Base.IOBuffer() + write(buffer, "\n") + write(buffer, "function f_$(expr_hash)($(final_inputs))\n") + + + # A development flag for enabling @inbounds in the generated kernels. Although @inbounds + # should speed up the kernels due to the number of indexed memory accesses, in my testing + # it actually made the kernels SLOWER. This could be due to GPU-side optimizations that + # expect bounds-checking, and perhaps the compiler can't do those optimizations if I get + # rid of the bounds check... Might be worth investigating at some point, but leave as + # "false" for now. This particular `enable_inbounds` section turns on checks for correct + # matrix sizes in the main kernel. If these checks pass, it should be fine to use @inbounds + # in the lower-level kernels without memory access errors. + enable_inbounds = false + if enable_inbounds + # Verify that the sizes of the input matrices are all the same. Doing this check here + # allows us to use @inbounds later. + write(buffer, " # Verify that the sizes of the input matrices are all the same.\n") + for i in eachindex(indep_vars) + if i==1 + write(buffer, " @assert size($(string(indep_vars[i])))") + else + write(buffer, " == size($(string(indep_vars[i])))") + end + end + write(buffer, "\n\n") + + # Verify that the output matrix is the right size + write(buffer, " # Verify that the output matrix is the right size.\n") + write(buffer, " @assert size(OUT) == (size($(string(indep_vars[1])),1), $(4+2*length(indep_vars)))\n\n") + end + + # Check if we need temporary variables, and if so, add them now. + if temp_vars > 0 + write(buffer, " # Create necessary temporary variables.\n") + for i = 1:temp_vars + write(buffer, " tempvar_$i = similar(OUT)\n") + end + write(buffer, "\n") + end + + # Now, call the kernels + temp_tracker = Int[] + write(buffer, " # Call the kernels in order.\n") + for i in eachindex(inputs) + # Write the inputs for this kernel (first argument is the mutated output) + kernel_inputs = string(outputs[i]) + for j in eachindex(inputs[i]) + kernel_inputs *= ", $(string(inputs[i][j]))" + end + + # Create the kernel call + # Note: The number of threads should never be lower than 256. + # Max registers per SM is 65536, max registers per thread is 255, + # so with 256 threads per SM, each can use all 255 registers (256^2 = 65536) + write(buffer, " CUDA.@sync @cuda always_inline=true threads=256 blocks=$blocks f_$(expr_hash)_$(kernel_nums[i])($kernel_inputs)\n") + end + + # If we wrote temporary variables, clear them from memory + if temp_vars > 0 + write(buffer, "\n") + write(buffer, " # Clear temporary variables from memory.\n") + for i = 1:temp_vars + write(buffer, " CUDA.unsafe_free!(tempvar_$i)\n") + end + end + + # And wrap up the string + write(buffer, "end\n") + return String(take!(buffer)) +end + +complexity(num::Num) = complexity(perform_substitutions(factor(num, split_div=true))) +function complexity(factorized::Vector{Equation}) + # Set up the complexity list + complexity = zeros(Int, length(factorized)) + + # If we need the factorized list to be sorted topologically, we can do: + # edgelist, varids = eqn_edges(factorized) + # g = SimpleDiGraph(edgelist) + + # We shouldn't need the list to be sorted topologically, since the final + # term should always correspond to the full expression. So, we can start + # at the final term and go backwards + complexity[end] = _complexity(complexity, factorized, length(factorized)) + return complexity +end + +function _complexity(complexity::Vector{Int}, factorized::Vector{Equation}, start::Int) + # Given the term of index [start], return the complexity (# lines) + # of that expression and its subexpressions. + # Note: The range for each total_lines row is because the expressions + # are longer if we need to assume subgradients (for base-level + # variables). In a large majority of the expression, unless it's + # very simple, it should usually NOT be assuming subgradients, + # so it'll be the shorter version. Still, using this lower value + # will make complexity() slightly optimistic. + total_lines = 0 + RHS = factorized[start].rhs + if exprtype(RHS) == ADD + total_lines += 34 # Ranges from 34--49 + for (key,val) in RHS.dict + new_ID = findfirst(x -> isequal(x.lhs, key), factorized) + if ~isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + end + elseif exprtype(RHS) == MUL + if ~isone(RHS.coeff) + total_lines += 36 # Ranges from 36--43 + for (key,val) in RHS.dict + new_ID = findfirst(x -> isequal(x.lhs, key), factorized) + if ~isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + end + else + total_lines += 340 # Ranges from 340--561 + for (key,val) in RHS.dict + new_ID = findfirst(x -> isequal(x.lhs, key), factorized) + if ~isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + end + end + elseif exprtype(RHS) == DIV + total_lines += 688 # Ranges from 688-960 + new_ID = findfirst(x -> isequal(x.lhs, RHS.den), factorized) + if !isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + elseif exprtype(RHS) == POW + if iseven(RHS.exp) + total_lines += 200 + elseif RHS.exp==3 + total_lines += 300 + elseif isinteger(RHS.exp) + total_lines += 450 + else + total_lines += 190 + end + elseif exprtype(RHS) == TERM + if RHS.f==exp + total_lines += 212 # Ranges from 212--310 + new_ID = findfirst(x -> isequal(x.lhs, RHS.arguments[1]), factorized) + if !isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + elseif RHS.f==log + total_lines += 378 # Ranges from 378--520 + new_ID = findfirst(x -> isequal(x.lhs, RHS.arguments[1]), factorized) + if !isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + elseif RHS.f==SCMC_sigmoid + total_lines += 1579 # Ranges from 1579--2008 + new_ID = findfirst(x -> isequal(x.lhs, RHS.arguments[1]), factorized) + if !isnothing(new_ID) + total_lines += _complexity(complexity, factorized, new_ID) + end + elseif RHS.f==sqrt + total_lines += 190 + else + error("Unknown function") + end + elseif exprtype(RHS) == SYM + nothing + else + error("Unknown type") + end + complexity[start] = total_lines + return total_lines +end + +# Use extract() to get the fully substituted form of each index +# of `factorized`, and then call pull_vars() on those forms to +# get the counts of unique variables. +function var_counts(factorized::Vector{Equation}) + vars = zeros(Int, length(factorized)) + for i in eachindex(factorized) + vars[i] = length(pull_vars(extract(factorized, i))) + end + return vars +end + + +# A test function to identify structures within an expression. This may be useful] +# in the future to, e.g., re-use kernels for multiple operations (note that we would +# need to disable sparsity in re-used kernels, or have it so that all potential re-uses +# are covered by the sparsity list). +function structure(expr::BasicSymbolic{Real}) + # We want to uniquely identify a given expression, but in + # a way that would allow any particular set of variables + # to be used in place of the existing variables without + # modifying the overall structure of the expression. + + vars = pull_vars(expr) + reordered_vars = Num[] + string_expr = string(expr) + locs = [findfirst(string(vars[i]), string_expr) for i in eachindex(vars)] + cleaned_locs = zeros(length(locs)) + cleaned_locs[(!).(isnothing.(locs))] .= getfield.(locs[(!).(isnothing.(locs))], 1) + cleaned_locs[isnothing.(locs)] .= Inf + complete = false + count = 1 + while !complete + complete = true + min_info = findmin(cleaned_locs) + if isfinite(min_info[1]) + complete = false + push!(reordered_vars, vars[min_info[2]]) + regex = "$(string(vars[min_info[2]]))(?!\\d)" + regex = replace(regex, r"\[" => "\\[") + regex = replace(regex, r"\]" => "\\]") + regex = replace(regex, r"\s" => "\\s") + string_expr = replace(string_expr, Regex(regex) => "unique_var_$count") + count += 1 + cleaned_locs[min_info[2]] = Inf + end + end + return string_expr, reordered_vars +end + +# A test function that can be used to genericize an expression. +# Base-level variables get called BASE_###, and auxiliary +# variables get called AUX_###. This might be useful for checking +# the structure, if kernels might be used for multiple subexpressions +generic(expr::Num) = generic(expr.val) +function generic(expr::BasicSymbolic{Real}) + output = string(expr) + all_vars = pull_vars(expr) + base_count = 1 + aux_count = 1 + for var in all_vars + if startswith(string(var), "aux") + if aux_count < 10 + output = replace(output, "$var" => "AUX_0$aux_count") + else + output = replace(output, "$var" => "AUX_$aux_count") + end + aux_count += 1 + else + if base_count < 10 + output = replace(output, "$var" => "BASE_0$base_count") + else + output = replace(output, "$var" => "BASE_$base_count") + end + base_count += 1 + end + end + return output +end \ No newline at end of file diff --git a/src/kernel_writer/math_kernels.jl b/src/kernel_writer/math_kernels.jl new file mode 100644 index 0000000..103952c --- /dev/null +++ b/src/kernel_writer/math_kernels.jl @@ -0,0 +1,5124 @@ + +# This file contains testable versions of kernels that accept matrices for each +# variable, with elements in the order: [cv, cc, lo, hi, cvgrad, ccgrad]. +# These kernels do not get used within `kgen`, but should be essentially the same +# as what gets written to the generated kernels. "string_math_kernels.jl" contains +# these same functions, but in buffer/string form for the purposes of writing +# new kernels. + +#= +Unitary Rules +=# +# Addition with a constant +# max threads: 1024 +function SCMC_cadd_kernel(OUT::CuDeviceMatrix, CONST::Real, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Addition + OUT[idx,3] = x[idx,3] + CONST + OUT[idx,4] = x[idx,4] + CONST + OUT[idx,1] = x[idx,1] + CONST + OUT[idx,2] = x[idx,2] + CONST + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Addition to an existing variable +# max threads: 1024 +function SCMC_add_to_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Negation + OUT[idx,3] += x[idx,3] + OUT[idx,4] += x[idx,4] + OUT[idx,1] += x[idx,1] + OUT[idx,2] += x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] += x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] += x[idx,end-1*colmax+col] + col += Int32(1) + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Negating (equivalent to multiplication by a constant if constant==-1) +# max threads: 1024 +function SCMC_negate_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Negation + OUT[idx,3] = -x[idx,4] + OUT[idx,4] = -x[idx,3] + OUT[idx,1] = -x[idx,2] + OUT[idx,2] = -x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = -x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = -x[idx,end-2*colmax+col] + col += Int32(1) + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Exponential +# max threads: 896 +function SCMC_exp_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Begin exponential + OUT[idx,3] = exp(x[idx,3]) + OUT[idx,4] = exp(x[idx,4]) + if x[idx,2] >= x[idx,1] + if x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,2] == x[idx,1] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + OUT[idx,1] = exp(x[idx,2]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,2])*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = exp(x[idx,3]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,2]) + exp(x[idx,4])*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + OUT[idx,1] = exp(x[idx,2]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,2]) + exp(x[idx,4])*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,2])*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = exp(x[idx,3]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,2]) + exp(x[idx,4])*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-1*colmax+col] + col += Int32(1) + end + end + else + if x[idx,1] >= x[idx,3] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = exp(x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + OUT[idx,1] = exp(x[idx,2]) + OUT[idx,2] = exp(x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,2])*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = exp(x[idx,3]) + OUT[idx,2] = exp(x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + OUT[idx,1] = exp(x[idx,2]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,2])*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = exp(x[idx,3]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,1]) + exp(x[idx,4])*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-2*colmax+col] + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,2]) + exp(x[idx,4])*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + OUT[idx,1] = exp(x[idx,2]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,2]) + exp(x[idx,4])*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,2])*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = exp(x[idx,3]) + OUT[idx,2] = (exp(x[idx,3])*(x[idx,4] - x[idx,2]) + exp(x[idx,4])*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (exp(x[idx,4]) - exp(x[idx,3]))/(x[idx,4] - x[idx,3])*x[idx,end-1*colmax+col] + col += Int32(1) + end + end + else + if x[idx,3] >= x[idx,1] + OUT[idx,1] = exp(x[idx,1]) + OUT[idx,2] = exp(x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,1])*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + OUT[idx,1] = exp(x[idx,2]) + OUT[idx,2] = exp(x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = exp(x[idx,2])*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = exp(x[idx,3]) + OUT[idx,2] = exp(x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + + # Check if x is degenerate, and if so, set the concave relaxation subgradient to 0.0 + if x[idx,4] == x[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Logarithm +# max threads: 896 +function SCMC_log_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Logarithm + OUT[idx,3] = log(max(x[idx,3], 0.0)) + OUT[idx,4] = log(max(x[idx,4], 0.0)) + if x[idx,2] >= x[idx,1] + if x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,2] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,2] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + end + else + if x[idx,1] >= x[idx,3] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,2] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,2] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,1], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1/x[idx,1]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,2] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,2], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1/x[idx,2]) + col += Int32(1) + end + end + else + if x[idx,3] >= x[idx,1] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,1] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,4] > x[idx,3] + OUT[idx,1] = (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) * (x[idx,2] - x[idx,3]) + log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (log(max(x[idx,4], 0.0)) - log(max(x[idx,3], 0.0)))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + OUT[idx,1] = log(max(x[idx,3], 0.0)) + OUT[idx,2] = log(max(x[idx,4], 0.0)) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + + # Convert domain errors to NaNs + if x[idx,3] < 0.0 + OUT[idx,1] = NaN + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = NaN + col += Int32(1) + end + end + if x[idx,1] < 0.0 + OUT[idx,1] = NaN + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = NaN + col += Int32(1) + end + end + if x[idx,2] < 0.0 + OUT[idx,2] = NaN + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = NaN + col += Int32(1) + end + end + if x[idx,4] < 0.0 + OUT[idx,2] = NaN + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = NaN + col += Int32(1) + end + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Inversion +# max threads: 768 +function SCMC_inv_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Begin inversion + if x[idx,3] > 0.0 # inv1(x) + OUT[idx,3] = inv(x[idx,4]) + OUT[idx,4] = inv(x[idx,3]) + if x[idx,2] >= x[idx,1] + if x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,2] == x[idx,1] + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,2])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (1.0 / x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + OUT[idx,1] = (1.0 / x[idx,2]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,2]*x[idx,2]) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + OUT[idx,1] = (1.0 / x[idx,2]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,2])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,2]*x[idx,2]) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (1.0 / x[idx,2]) + OUT[idx,2] = (1.0 / x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,2]*x[idx,2]) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,1] >= x[idx,3] + OUT[idx,1] = (1.0 / x[idx,4]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + OUT[idx,1] = (1.0 / x[idx,4]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,2])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (1.0 / x[idx,4]) + OUT[idx,2] = (1.0 / x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,2])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (1.0 / x[idx,1]) + OUT[idx,2] = (1.0 / x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,1]*x[idx,1]) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + OUT[idx,1] = (1.0 / x[idx,2]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,2]*x[idx,2]) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + OUT[idx,1] = (1.0 / x[idx,2]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,2])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,2]*x[idx,2]) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (1.0 / x[idx,2]) + OUT[idx,2] = (1.0 / x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = -1.0/(x[idx,2]*x[idx,2]) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] >= x[idx,1] + OUT[idx,1] = (1.0 / x[idx,4]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,1])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-2*colmax+col] + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + OUT[idx,1] = (1.0 / x[idx,4]) + OUT[idx,2] = (x[idx,4] + x[idx,3] - x[idx,2])/(x[idx,3]*x[idx,4]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = -1.0/(x[idx,3]*x[idx,4]) * x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (1.0 / x[idx,4]) + OUT[idx,2] = (1.0 / x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + elseif x[idx,4] < 0.0 # -inv(-x) + OUT[idx,3] = -inv(-x[idx,4]) + OUT[idx,4] = -inv(-x[idx,3]) + if x[idx,1] <= x[idx,2] + if x[idx,2]== x[idx,1] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,2] <= x[idx,4] + if x[idx,2] <= x[idx,3] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,3] <= x[idx,1] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,1]*x[idx,1])) * x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,3] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,4] <= x[idx,1] + if x[idx,2] <= x[idx,3] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,1])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,3] <= x[idx,1] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,1])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,1]*x[idx,1])) * x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,1])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,3] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,2] <= x[idx,3] + OUT[idx,1] = 1.0/x[idx,4] + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,3] <= x[idx,1] + OUT[idx,1] = 1.0/x[idx,4] + OUT[idx,2] = 1.0/x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,1]*x[idx,1])) * x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = 1.0/x[idx,4] + OUT[idx,2] = 1.0/x[idx,3] + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + elseif x[idx,4] <= x[idx,2] + if x[idx,3] <= x[idx,2] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,1] <= x[idx,3] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,1]*x[idx,1])) * x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,2])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,3] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,1] <= x[idx,4] + if x[idx,3] <= x[idx,2] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,1])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,1] <= x[idx,3] + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,1])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,1]*x[idx,1])) * x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = (x[idx,3] + x[idx,4] - x[idx,1])/(x[idx,3]*x[idx,4]) + OUT[idx,2] = 1.0/x[idx,3] + while col <= colmax + OUT[idx,end-2*colmax+col] = (-1.0/(x[idx,3]*x[idx,4])) * x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] <= x[idx,2] + OUT[idx,1] = 1.0/x[idx,4] + OUT[idx,2] = 1.0/x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,2]*x[idx,2])) * x[idx,end-1*colmax+col] + col += Int32(1) + end + elseif x[idx,1] <= x[idx,3] + OUT[idx,1] = 1.0/x[idx,4] + OUT[idx,2] = 1.0/x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = (-1.0/(x[idx,1]*x[idx,1])) * x[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = 1.0/x[idx,4] + OUT[idx,2] = 1.0/x[idx,3] + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + else #invalid + OUT[idx,3] = NaN + OUT[idx,4] = NaN + OUT[idx,1] = NaN + OUT[idx,2] = NaN + while col <= colmax + OUT[idx,end-2*colmax+col] = NaN + OUT[idx,end-1*colmax+col] = NaN + col += Int32(1) + end + end + + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Multiplication by a constant +# max threads: 640 +function SCMC_cmul_kernel(OUT::CuDeviceMatrix, CONST::Real, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Begin multiplication by a constant + if CONST >= 0.0 + OUT[idx,3] = CONST*x[idx,3] + OUT[idx,4] = CONST*x[idx,4] + OUT[idx,1] = CONST*x[idx,1] + OUT[idx,2] = CONST*x[idx,2] + while col <= colmax + OUT[idx,end-2*colmax+col] = CONST*x[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = CONST*x[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,3] = CONST*x[idx,4] + OUT[idx,4] = CONST*x[idx,3] + OUT[idx,1] = CONST*x[idx,2] + OUT[idx,2] = CONST*x[idx,1] + while col <= colmax + OUT[idx,end-2*colmax+col] = CONST*x[idx,end-1*colmax+col] + OUT[idx,end-1*colmax+col] = CONST*x[idx,end-2*colmax+col] + col += Int32(1) + end + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Sigmoid function +# max threads: 640 +function SCMC_sigmoid_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Interval is independent of the rest + OUT[idx,3] = 1.0/(1.0+exp(-x[idx,3])) + OUT[idx,4] = 1.0/(1.0+exp(-x[idx,4])) + + + if x[idx,3] >= 0.0 + if x[idx,2] >= x[idx,1] + if x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,3]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + end + elseif x[idx,2] == x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,3]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + end + end + else + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,3]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,3]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,3]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + end + end + else + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,3]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,3] - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,4] <= 0.0 + if x[idx,2] >= x[idx,1] + if x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] == x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,1] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,3] >= x[idx,2] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,1]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,1] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,3])))*(x[idx,4] - x[idx,2]) + (1.0/(1.0 + exp(-x[idx,4])))*(x[idx,2] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3])))/(x[idx,4] - x[idx,3]) + col += Int32(1) + end + end + end + else + if x[idx,3] >= x[idx,1] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,3] + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + else + if x[idx,3] == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + OUT[idx,2] = ((1.0/(1.0 + exp(-x[idx,4])))*(x[idx,4] - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + else + # This is the hard one. + + # Do the whole cv/cc thing to get CV (midcv) and CC (midcc) + + # cv, dcv, cv_p = cv_sigmoid(midcv, xL, xU, cv_p) + # cc, dcc, cc_p = cc_sigmoid(midcc, xL, xU, cc_p) + # cvgrad = midgrad(ccgrad, cvgrad, cv_id)*dcv + # ccgrad = midgrad(ccgrad, cvgrad, cc_id)*dcc + + # FOR CV + xkm = x[idx,3] # max(x_lo, min(x_hi, x_lo)). x_lo 0.0) + flag = false + break # use xk_cv + elseif (xk_cv == 0.0) && (fk/Bk < 0.0) + flag = false + break # use xk_cv + end + xkm = xk_cv + fkm = fk + xk_cv = max(x[idx,3], min(0.0, xk_cv - fk/Bk)) + iter += Int32(1) + end + + # If flag, we need to do golden section instead. + if flag + a_sigmoid = x[idx,3] + fa_sigmoid = (x[idx,3] - x[idx,4])*exp(-x[idx,3])/(1.0 + exp(-x[idx,3]))^2 - (1.0/(1.0 + exp(-x[idx,3])) - 1.0/(1.0 + exp(-x[idx,4]))) + c_sigmoid = 0.0 + fc_sigmoid = (0.0 - x[idx,4])*exp(0.0)/(1.0 + exp(0.0))^2 - (1.0/(1.0 + exp(0.0)) - 1.0/(1.0 + exp(-x[idx,4]))) + + if fa_sigmoid*fc_sigmoid > 0.0 + xk_cv = NaN + end + b_sigmoid = 0.0 - (2.0 - Base.MathConstants.golden)*(0.0 - x[idx,3]) + fb_sigmoid = (b_sigmoid - x[idx,4])*exp(-b_sigmoid)/(1.0 + exp(-b_sigmoid))^2 - (1.0/(1.0 + exp(-b_sigmoid)) - 1.0/(1.0 + exp(-x[idx,4]))) + + iter = Int32(1) + while iter <= Int32(100) + if (c_sigmoid - b_sigmoid > b_sigmoid - a_sigmoid) + x_sigmoid = b_sigmoid + (2.0 - Base.MathConstants.golden)*(c_sigmoid - b_sigmoid) + if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100) + xk_cv = (c_sigmoid + a_sigmoid)/2.0 + break + end + iter += Int32(1) + fx_sigmoid = (x_sigmoid - x[idx,4])*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-x[idx,4]))) + if fa_sigmoid*fx_sigmoid < 0.0 + c_sigmoid = x_sigmoid + fc_sigmoid = fx_sigmoid + else + a_sigmoid = b_sigmoid + fa_sigmoid = fb_sigmoid + b_sigmoid = x_sigmoid + fb_sigmoid = fx_sigmoid + end + else + x_sigmoid = b_sigmoid - (2.0 - Base.MathConstants.golden)*(b_sigmoid - a_sigmoid) + if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100) + xk_cv = (c_sigmoid + a_sigmoid)/2.0 + break + end + iter += Int32(1) + fx_sigmoid = (x_sigmoid - x[idx,4])*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-x[idx,4]))) + if fa_sigmoid*fb_sigmoid < 0.0 + c_sigmoid = b_sigmoid + fc_sigmoid = fb_sigmoid + b_sigmoid = x_sigmoid + fb_sigmoid = fx_sigmoid + else + a_sigmoid = x_sigmoid + fa_sigmoid = fx_sigmoid + end + end + end + end + + # FOR CC + xkm = 0.0 # max(x_lo, min(x_hi, 0.0)). x_hi is positive in this condition, and x_lo is negative. So 0.0. + xk_cc = x[idx,4] # max(x_lo, min(x_hi, x_hi)) == max(x_lo, x_hi), and x_hi>x_lo by definition. + fkm = (xkm - x[idx,3])*exp(-xkm)/(1.0 + exp(-xkm))^2 - (1.0/(1.0 + exp(-xkm)) - 1.0/(1.0 + exp(-x[idx,3]))) + flag = true + iter = Int32(1) + while iter <= Int32(100) + fk = (xk_cc - x[idx,3])*exp(-xk_cc)/(1.0 + exp(-xk_cc))^2 - (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3]))) + Bk = (fk - fkm)/(xk_cc - xkm) + if (abs(fk) < 1.0e-10) + flag = false + break # use xk_cc + elseif (Bk == 0.0) + xk_cc = 0.0 + break # Need to do golden section + elseif (xk_cc == 0.0) && (fk/Bk > 0.0) + flag = false + break # use xk_cc + elseif (xk_cc == x[idx,4]) && (fk/Bk < 0.0) + flag = false + break # use xk_cc + end + xkm = xk_cc + fkm = fk + xk_cc = max(0.0, min(x[idx,4], xk_cc - fk/Bk)) + iter += Int32(1) + end + + # If flag, we need to do golden section instead. + if flag + a_sigmoid = 0.0 + fa_sigmoid = (0.0 - x[idx,3])*exp(0.0)/(1.0 + exp(0.0))^2 - (1.0/(1.0 + exp(0.0)) - 1.0/(1.0 + exp(-x[idx,3]))) + c_sigmoid = x[idx,4] + fc_sigmoid = (x[idx,4] - x[idx,3])*exp(-x[idx,4])/(1.0 + exp(-x[idx,4]))^2 - (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-x[idx,3]))) + + if fa_sigmoid*fc_sigmoid > 0.0 + xk_cc = NaN + end + + b_sigmoid = x[idx,4] - (2.0 - Base.MathConstants.golden)*(x[idx,4] - 0.0) + fb_sigmoid = (b_sigmoid - x[idx,3])*exp(-b_sigmoid)/(1.0 + exp(-b_sigmoid))^2 - (1.0/(1.0 + exp(-b_sigmoid)) - 1.0/(1.0 + exp(-x[idx,3]))) + + iter = Int32(1) + while iter <= Int32(100) + if (c_sigmoid - b_sigmoid > b_sigmoid - a_sigmoid) + x_sigmoid = b_sigmoid + (2.0 - Base.MathConstants.golden)*(c_sigmoid - b_sigmoid) + if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100) + xk_cc = (c_sigmoid + a_sigmoid)/2.0 + break + end + iter += Int32(1) + fx_sigmoid = (x_sigmoid - x[idx,3])*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-x[idx,3]))) + if fa_sigmoid*fx_sigmoid < 0.0 + c_sigmoid = x_sigmoid + fc_sigmoid = fx_sigmoid + else + a_sigmoid = b_sigmoid + fa_sigmoid = fb_sigmoid + b_sigmoid = x_sigmoid + fb_sigmoid = fx_sigmoid + end + else + x_sigmoid = b_sigmoid - (2.0 - Base.MathConstants.golden)*(b_sigmoid - a_sigmoid) + if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100) + xk_cc = (c_sigmoid + a_sigmoid)/2.0 + break + end + iter += Int32(1) + fx_sigmoid = (x_sigmoid - x[idx,3])*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-x[idx,3]))) + if fa_sigmoid*fb_sigmoid < 0.0 + c_sigmoid = b_sigmoid + fc_sigmoid = fb_sigmoid + b_sigmoid = x_sigmoid + fb_sigmoid = fx_sigmoid + else + a_sigmoid = x_sigmoid + fa_sigmoid = fx_sigmoid + end + end + end + end + + # Now that we have xk_cv and xk_cc, we can go through the midcv/midcc rules + if x[idx,2] >= x[idx,1] + if x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + elseif x[idx,2] == x[idx,1] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,2] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,2], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,2]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,2] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + else + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,3] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,3], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,3]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,3] - xk_cv))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + end + elseif x[idx,2] == x[idx,1] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,2] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,2], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,2]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,2] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * dcc + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,2] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,2], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,2]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,2] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,2] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,2], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,2]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,2] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * dcc + col += Int32(1) + end + else + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,3] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,3], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,3]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,3] - xk_cv))/(x[idx,4] - xk_cv) + end + end + + if x[idx,2] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,2], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,2]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,2] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * dcc + col += Int32(1) + end + end + else + if x[idx,1] >= x[idx,3] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,4] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,4], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,4]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,4] - x[idx,3]))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + elseif x[idx,3] >= x[idx,2] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,2] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,2], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,2]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,2] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,4] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,4], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,4]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,4] - x[idx,3]))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,3] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,3], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,3]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,3] - xk_cv))/(x[idx,4] - xk_cv) + end + end + + if x[idx,4] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,4], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,4]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,4] - x[idx,3]))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,2] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,2], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,2]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,2] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + else + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,3] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,3], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,3]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,3] - xk_cv))/(x[idx,4] - xk_cv) + end + end + + if x[idx,1] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,1], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,1]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,1] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,1])) + dcc = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * dcc + col += Int32(1) + end + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,2] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,2], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,2]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,2] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * dcc + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,2] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,2], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,2]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,2] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,2] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,2], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,2]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,2] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * dcc + col += Int32(1) + end + else + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,3] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,3], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,3]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,3] - xk_cv))/(x[idx,4] - xk_cv) + end + end + + if x[idx,2] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,2], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,2]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,2] - x[idx,3]))/(xk_cc - x[idx,3]) + dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-x[idx,3])))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,2])) + dcc = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * dcc + col += Int32(1) + end + end + else + if x[idx,3] >= x[idx,1] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,1] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,1], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,1])) + dcv = exp(-x[idx,1])/(1.0 + exp(-x[idx,1]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,1]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,1] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,4] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,4], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,4]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,4] - x[idx,3]))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + elseif x[idx,2] >= x[idx,3] + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,2] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,2], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,2])) + dcv = exp(-x[idx,2])/(1.0 + exp(-x[idx,2]))^2 + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,2]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,2] - xk_cv))/(x[idx,4] - xk_cv) + dcv = (1.0/(1.0 + exp(-x[idx,4])) - 1.0/(1.0 + exp(-xk_cv)))/(x[idx,4] - xk_cv) + end + end + + if x[idx,4] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,4], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,4]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,4] - x[idx,3]))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * dcv + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + else + # Use the results of xk to determine what OUT_cv and dcv should be + if x[idx,3] <= xk_cv + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, x[idx,3], p (now xk_cv), xU) + if xk_cv == x[idx,4] + OUT[idx,1] = 1.0/(1.0 + exp(-x[idx,3])) + else + OUT[idx,1] = (1.0/(1.0 + exp(-xk_cv))*(x[idx,4] - x[idx,3]) + 1.0/(1.0 + exp(-x[idx,4]))*(x[idx,3] - xk_cv))/(x[idx,4] - xk_cv) + end + end + + if x[idx,4] <= xk_cc + # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, x[idx,4], xL, p) + if xk_cc == x[idx,3] + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + else + OUT[idx,2] = (1.0/(1.0 + exp(-x[idx,3]))*(xk_cc - x[idx,4]) + 1.0/(1.0 + exp(-xk_cc))*(x[idx,4] - x[idx,3]))/(xk_cc - x[idx,3]) + end + + else + OUT[idx,2] = 1.0/(1.0 + exp(-x[idx,4])) + end + + # Now use the information about dcv and dcc to calculate subgradients + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + end + end + + idx += stride + end + return nothing +end + +# Positive even integer powers +# max threads: ??? +# NOTE: You can reduce the number of temporary variables by combining the various +# if-else blocks into one another, which increases the kernel speed, but at the +# expense of significantly longer compilation times. The following times were +# recorded using my workstation, in the format: +# Method +# Compilation/first run time +# Kernel runtime (8192-length inputs) +# +# Default (~200 line function) +# 0.751169 seconds (680.11 k CPU allocations: 32.493 MiB) +# 138.600 μs (12 allocations: 256 bytes) +# +# Med-length (Keeping eps_min/max in its own if-else tree, combining midcc/cv +# cc/cv_id and final assignment trees; ~400 line function) +# 7.573736 seconds (3.19 M CPU allocations: 141.522 MiB, 0.46% gc time) +# 136.000 μs (12 allocations: 256 bytes) +# +# Max-length (Combining eps_min/max, midcc/cv, cc/cv_id, and assignments into +# one deep if-else tree; ~1470 line function) +# 115.306541 seconds (12.22 M CPU allocations: 529.422 MiB, 0.13% gc time) +# 124.800 μs (12 allocations: 256 bytes) +# +# (For now, these examples are saved in the even_power_example.jl file) +# For the purposes of using this kernel as a part of a larger kernel for more +# complicated functions, the extra 12 μs being saved individually likely is +# irrelevant in the face of making the kernel much longer. I.e., if the larger +# kernel needs to be split, more individual kernels need to be launched, which +# is a major factor in the overall time. The 12 μs saved here could mean 100 μs +# lost to requiring an additional kernel launch. Thus, I'll be using the short +# version of the kernel. + +function SCMC_even_power_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix, z::Integer) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,4] <= 0.0 + eps_min = x[idx,4] + eps_max = x[idx,3] + elseif x[idx,3] >= 0.0 + eps_min = x[idx,3] + eps_max = x[idx,4] + elseif abs(x[idx,3]) >= abs(x[idx,4]) + eps_min = 0.0 + eps_max = x[idx,3] + else + eps_min = 0.0 + eps_max = x[idx,4] + end + OUT[idx,3] = eps_min^z + OUT[idx,4] = eps_max^z + + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,1] >= eps_max + if x[idx,1] >= eps_min + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif eps_min >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif eps_max >= x[idx,2] + if x[idx,1] >= eps_min + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif eps_min >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,1] >= eps_min + midcv = x[idx,1] + cv_id = Int32(2) + midcc = eps_max + cc_id = Int32(3) + elseif eps_min >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = eps_max + cc_id = Int32(3) + else + midcv = eps_min + cv_id = Int32(3) + midcc = eps_max + cc_id = Int32(3) + end + end + elseif eps_max >= x[idx,1] + if eps_min >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,2] >= eps_min + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,2] >= eps_max + if eps_min >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,2] >= eps_min + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if eps_min >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = eps_max + cc_id = Int32(3) + elseif x[idx,2] >= eps_min + midcv = x[idx,2] + cv_id = Int32(1) + midcc = eps_max + cc_id = Int32(3) + else + midcv = eps_min + cv_id = Int32(3) + midcc = eps_max + cc_id = Int32(3) + end + end + + if x[idx,3] == x[idx,4] + OUT[idx,1] = midcv*midcv^(z-1) + OUT[idx,2] = midcc^z + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*midcc^(z-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*midcc^(z-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else + OUT[idx,1] = midcv*midcv^(z-1) + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - midcc) + x[idx,4]^z*(midcc - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Special case of the even power kernel that should be slightly faster +# (We can also remove exponentiation if the power would be (z-1) == (2-1) == 1. +# Also, we can apply this simplification to remove some math: +# (xU^2 - xL^2)/(xU - xL) +# (xU - xL)*(xU + xL)/(xU - xL) +# (xU + xL) +function SCMC_squared_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,4] <= 0.0 + eps_min = x[idx,4] + eps_max = x[idx,3] + elseif x[idx,3] >= 0.0 + eps_min = x[idx,3] + eps_max = x[idx,4] + elseif abs(x[idx,3]) >= abs(x[idx,4]) + eps_min = 0.0 + eps_max = x[idx,3] + else + eps_min = 0.0 + eps_max = x[idx,4] + end + OUT[idx,3] = eps_min^2 + OUT[idx,4] = eps_max^2 + + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,1] >= eps_max + if x[idx,1] >= eps_min + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif eps_min >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif eps_max >= x[idx,2] + if x[idx,1] >= eps_min + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif eps_min >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,1] >= eps_min + midcv = x[idx,1] + cv_id = Int32(2) + midcc = eps_max + cc_id = Int32(3) + elseif eps_min >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = eps_max + cc_id = Int32(3) + else + midcv = eps_min + cv_id = Int32(3) + midcc = eps_max + cc_id = Int32(3) + end + end + elseif eps_max >= x[idx,1] + if eps_min >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,2] >= eps_min + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,2] >= eps_max + if eps_min >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,2] >= eps_min + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = eps_min + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if eps_min >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = eps_max + cc_id = Int32(3) + elseif x[idx,2] >= eps_min + midcv = x[idx,2] + cv_id = Int32(1) + midcc = eps_max + cc_id = Int32(3) + else + midcv = eps_min + cv_id = Int32(3) + midcc = eps_max + cc_id = Int32(3) + end + end + + if x[idx,3] == x[idx,4] + OUT[idx,1] = midcv*midcv + OUT[idx,2] = midcc^2 + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * 2*midcv + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * 2*midcv + else + OUT[idx,end-2*colmax+col] = 0.0 + end + + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * 2*midcc + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * 2*midcc + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else + OUT[idx,1] = midcv*midcv + OUT[idx,2] = (x[idx,3]^2*(x[idx,4] - midcc) + x[idx,4]^2*(midcc - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * 2*midcv + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * 2*midcv + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4] + x[idx,3]) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4] + x[idx,3]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +function SCMC_odd_power_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix, z::Integer) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + OUT[idx,3] = x[idx,3]^z + OUT[idx,4] = x[idx,4]^z + + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + + # Now we have midcv/cc, cv/cc_id. + if x[idx,4] <= 0.0 + if x[idx,3]==x[idx,4] # Both are function itself + OUT[idx,1] = midcv^z + OUT[idx,2] = midcc^z + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*midcc^(z-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*midcc^(z-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else # cv uses line segment + OUT[idx,1] = (x[idx,3]^z*(x[idx,4] - midcv) + x[idx,4]^z*(midcv - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = midcc^z + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*midcc^(z-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*midcc^(z-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + elseif 0.0 <= x[idx,3] + if x[idx,3]==x[idx,4] # Both are function itself + OUT[idx,1] = midcv^z + OUT[idx,2] = midcc^z + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*midcc^(z-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*midcc^(z-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else # cc uses line segment + OUT[idx,1] = midcv^z + OUT[idx,2] = (x[idx,3]^z*(x[idx,4] - midcc) + x[idx,4]^z*(midcc - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - x[idx,3]^z)/(x[idx,4] - x[idx,3]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + else + # The inflection point can be determined analytically. + # Use these values up to z=15 (could go higher if we need) + if z==3 + xk_cv = min(-0.5*x[idx,3], x[idx,4]) + xk_cc = max(-0.5*x[idx,4], x[idx,3]) + elseif z==5 + xk_cv = min(-0.6058295861882683*x[idx,3], x[idx,4]) + xk_cc = max(-0.6058295861882683*x[idx,4], x[idx,3]) + elseif z==7 + xk_cv = min(-0.6703320476030968*x[idx,3], x[idx,4]) + xk_cc = max(-0.6703320476030968*x[idx,4], x[idx,3]) + elseif z==9 + xk_cv = min(-0.7145377271673349*x[idx,3], x[idx,4]) + xk_cc = max(-0.7145377271673349*x[idx,4], x[idx,3]) + elseif z==11 + xk_cv = min(-0.7470540748651559*x[idx,3], x[idx,4]) + xk_cc = max(-0.7470540748651559*x[idx,4], x[idx,3]) + elseif z==13 + xk_cv = min(-0.7721416355234655*x[idx,3], x[idx,4]) + xk_cc = max(-0.7721416355234655*x[idx,4], x[idx,3]) + elseif z==15 + xk_cv = min(-0.7921778546056709*x[idx,3], x[idx,4]) + xk_cc = max(-0.7921778546056709*x[idx,4], x[idx,3]) + elseif z==17 + xk_cv = min(-0.8086048978723027*x[idx,3], x[idx,4]) + xk_cc = max(-0.8086048978723027*x[idx,4], x[idx,3]) + elseif z==19 + xk_cv = min(-0.8223534102385287*x[idx,3], x[idx,4]) + xk_cc = max(-0.8223534102385287*x[idx,4], x[idx,3]) + elseif z==21 + xk_cv = min(-0.8340533675507736*x[idx,3], x[idx,4]) + xk_cc = max(-0.8340533675507736*x[idx,4], x[idx,3]) + elseif z==23 + xk_cv = min(-0.8441478047418446*x[idx,3], x[idx,4]) + xk_cc = max(-0.8441478047418446*x[idx,4], x[idx,3]) + elseif z==25 + xk_cv = min(-0.8529581643906964*x[idx,3], x[idx,4]) + xk_cc = max(-0.8529581643906964*x[idx,4], x[idx,3]) + elseif z==27 + xk_cv = min(-0.8607238145679608*x[idx,3], x[idx,4]) + xk_cc = max(-0.8607238145679608*x[idx,4], x[idx,3]) + elseif z==29 + xk_cv = min(-0.8676269762720762*x[idx,3], x[idx,4]) + xk_cc = max(-0.8676269762720762*x[idx,4], x[idx,3]) + elseif z==31 + xk_cv = min(-0.8738090154215446*x[idx,3], x[idx,4]) + xk_cc = max(-0.8738090154215446*x[idx,4], x[idx,3]) + elseif z==33 + xk_cv = min(-0.8793814183583145*x[idx,3], x[idx,4]) + xk_cc = max(-0.8793814183583145*x[idx,4], x[idx,3]) + elseif z==35 + xk_cv = min(-0.8844333818207290*x[idx,3], x[idx,4]) + xk_cc = max(-0.8844333818207290*x[idx,4], x[idx,3]) + elseif z==37 + xk_cv = min(-0.8890371830149935*x[idx,3], x[idx,4]) + xk_cc = max(-0.8890371830149935*x[idx,4], x[idx,3]) + elseif z==39 + xk_cv = min(-0.8932520563312301*x[idx,3], x[idx,4]) + xk_cc = max(-0.8932520563312301*x[idx,4], x[idx,3]) + elseif z==41 + xk_cv = min(-0.8971270424799359*x[idx,3], x[idx,4]) + xk_cc = max(-0.8971270424799359*x[idx,4], x[idx,3]) + elseif z==43 + xk_cv = min(-0.9007031161732270*x[idx,3], x[idx,4]) + xk_cc = max(-0.9007031161732270*x[idx,4], x[idx,3]) + elseif z==45 + xk_cv = min(-0.9040147980608216*x[idx,3], x[idx,4]) + xk_cc = max(-0.9040147980608216*x[idx,4], x[idx,3]) + elseif z==47 + xk_cv = min(-0.9070913919345662*x[idx,3], x[idx,4]) + xk_cc = max(-0.9070913919345662*x[idx,4], x[idx,3]) + elseif z==49 + xk_cv = min(-0.9099579456198456*x[idx,3], x[idx,4]) + xk_cc = max(-0.9099579456198456*x[idx,4], x[idx,3]) + else + # Apply Newton/golden section methods for the convex part, + # to get x_cv (the inflection point for the convex relaxation) + dfk = 0.0 + xk_cv = max(0.0, x[idx,4]) + fk = (xk_cv^z - x[idx,3]^z) - (xk_cv-x[idx,3])*(z)*(xk_cv^(z-1)) + flag = true + iter = Int32(1) + while iter <= Int32(100) + dfk = (z-1)*z*xk_cv^(z-2)*(x[idx,3]-xk_cv) + if abs(fk) < 1e-10 + flag = false + break # use xk_cv + end + if iszero(dfk) + xk_cv = 0.0 + break # Need to do golden section + end + if (xk_cv == 0.0) && (fk/dfk > 0.0) + flag = false + break # use xk_cv + elseif (xk_cv == x[idx,4]) && (fk/dfk < 0.0) + flag = false + break # use xk_cv + end + xk_cv = max(0.0, min(x[idx,4], xk_cv - fk/dfk)) + fk = (xk_cv^z - x[idx,3]^z) - (xk_cv-x[idx,3])*(z)*(xk_cv^(z-1)) + iter += Int32(1) + end + + # If flag, we need to do golden section instead + if flag + a_golden = x[idx,3] + fa_golden = (a_golden^z - x[idx,3]^z) - (a_golden-x[idx,3])*(z)*(a_golden^(z-1)) + c_golden = x[idx,4] + fc_golden = (c_golden^z - x[idx,3]^z) - (c_golden-x[idx,3])*(z)*(c_golden^(z-1)) + + if fa_golden*fc_golden > 0 + xk_cv = NaN + end + + b_golden = x[idx,4] - (2.0 - Base.MathConstants.golden)*(x[idx,4] - x[idx,3]) + fb_golden = (b_golden^z - x[idx,3]^z) - (b_golden-x[idx,3])*(z)*(b_golden^(z-1)) + + iter = Int32(1) + while iter <= Int32(100) + if (c_golden - b_golden > b_golden - a_golden) + x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden) + if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100) + xk_cv = (c_golden + a_golden)/2.0 + break + end + iter += Int32(1) + fx_golden = (x_golden^z - x[idx,3]^z) - (x_golden-x[idx,3])*(z)*(x_golden^(z-1)) + if fa_golden*fx_golden < 0.0 + c_golden = x_golden + fc_golden = fx_golden + else + a_golden = b_golden + fa_golden = fb_golden + b_golden = x_golden + fb_golden = fx_golden + end + else + x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden) + if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100) + xk_cv = (c_golden + a_golden)/2.0 + break + end + iter += Int32(1) + fx_golden = (x_golden^z - x[idx,3]^z) - (x_golden-x[idx,3])*(z)*(x_golden^(z-1)) + if fa_golden*fb_golden < 0.0 + c_golden = b_golden + fc_golden = fb_golden + b_golden = x_golden + fb_golden = fx_golden + else + a_golden = x_golden + fa_golden = fx_golden + end + end + end + end + + # Apply Newton/golden section methods for the concave part, + # to get x_cc (the inflection point for the concave relaxation) + dfk = 0.0 + xk_cc = x[idx,3] + fk = (x[idx,4]^z-xk_cc^z) - (x[idx,4]-xk_cc)*(z)*(xk_cc^(z-1)) + flag = true + iter = Int32(1) + while iter <= Int32(100) + dfk = (z-1)*z*xk_cc^(z-2)*(xk_cc-x[idx,4]); + if abs(fk) < 1e-10 + flag = false + break # use xk_cc + end + if iszero(dfk) + xk_cc = 0.0 + break # Need to do golden section + end + if (xk_cc == x[idx,3]) && (fk/dfk > 0.0) + flag = false + break # use xk_cc + elseif (xk_cc == 0.0) && (fk/dfk < 0.0) + flag = false + break # use xk_cc + end + xk_cc = max(x[idx,3], min(0.0, xk_cc - fk/dfk)) + fk = (x[idx,4]^z-xk_cc^z) - (x[idx,4]-xk_cc)*(z)*(xk_cc^(z-1)) + iter += Int32(1) + end + + # If flag, we need to do golden section instead + if flag + a_golden = x[idx,3] + fa_golden = (x[idx,4]^z-x[idx,3]^z) - (x[idx,4]-x[idx,3])*(z)*(x[idx,3]^(z-1)) + c_golden = x[idx,4] + fc_golden = 0.0 + + if fa_golden*fc_golden > 0 + xk_cc = NaN + end + + b_golden = x[idx,4] - (2.0 - Base.MathConstants.golden)*(x[idx,4] - x[idx,3]) + fb_golden = (x[idx,4]^z-b_golden^z) - (x[idx,4]-b_golden)*(z)*(b_golden^(z-1)) + + iter = Int32(1) + while iter <= Int32(100) + if (c_golden - b_golden > b_golden - a_golden) + x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden) + if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100) + xk_cc = (c_golden + a_golden)/2.0 + break + end + iter += Int32(1) + fx_golden = (x[idx,4]^z-x_golden^z) - (x[idx,4]-x_golden)*(z)*(x_golden^(z-1)) + if fa_golden*fx_golden < 0.0 + c_golden = x_golden + fc_golden = fx_golden + else + a_golden = b_golden + fa_golden = fb_golden + b_golden = x_golden + fb_golden = fx_golden + end + else + x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden) + if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100) + xk_cc = (c_golden + a_golden)/2.0 + break + end + iter += Int32(1) + fx_golden = (x[idx,4]^z-x_golden^z) - (x[idx,4]-x_golden)*(z)*(x_golden^(z-1)) + if fa_golden*fb_golden < 0.0 + c_golden = b_golden + fc_golden = fb_golden + b_golden = x_golden + fb_golden = fx_golden + else + a_golden = x_golden + fa_golden = fx_golden + end + end + end + end + end + + # Now we have the inflection points, so we either + # look at the line segment or the function itself + if (midcv <= xk_cv) && (x[idx,3] != xk_cv) # cv uses line segment + OUT[idx,1] = (x[idx,3]^z*(xk_cv - midcv) + xk_cv^z*(midcv - x[idx,3]))/(xk_cv - x[idx,3]) + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (xk_cv^z - x[idx,3]^z)/(xk_cv - x[idx,3]) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (xk_cv^z - x[idx,3]^z)/(xk_cv - x[idx,3]) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + col += Int32(1) + end + else # cv uses the function itself + OUT[idx,1] = midcv^z + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * z*midcv^(z-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * z*midcv^(z-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + col += Int32(1) + end + end + + # Reset the column counter + col = Int32(1) + + # Now do the cc side + if (midcc > xk_cc) && (x[idx,4] != xk_cc) # cc uses line segment + OUT[idx,2] = (xk_cc^z*(x[idx,4] - midcc) + x[idx,4]^z*(midcc - xk_cc))/(x[idx,4] - xk_cc) + while col <= colmax + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^z - xk_cc^z)/(x[idx,4] - xk_cc) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^z - xk_cc^z)/(x[idx,4] - xk_cc) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else # cc uses the function itself + OUT[idx,2] = midcc^z + while col <= colmax + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * z*midcc^(z-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * z*midcc^(z-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + + +# Power function for small floating-point values. This function is ONLY VALID FOR +# 0 < c < 1 AND xL > 0, NOT FOR ANYTHING OUTSIDE THIS RANGE. +function SCMC_small_float_power_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix, c::T) where T<:Real + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,3] < 0.0 + error("This kernel is not meant to be used for negative lower bounded variables") + end + + OUT[idx,3] = x[idx,3]^c + OUT[idx,4] = x[idx,4]^c + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + + if x[idx,3] == x[idx,4] + OUT[idx,1] = midcv^c + OUT[idx,2] = midcc^c + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * c*midcv^(c-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * c*midcv^(c-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * c*midcc^(c-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * c*midcc^(c-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else + OUT[idx,1] = (x[idx,3]^c*(x[idx,4] - midcv) + x[idx,4]^c*(midcv - x[idx,3]))/(x[idx,4] - x[idx,3]) + OUT[idx,2] = midcc^c + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^c - x[idx,3]^c)/(x[idx,4] - x[idx,3]) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^c - x[idx,3]^c)/(x[idx,4] - x[idx,3]) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * c*midcc^(c-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * c*midcc^(c-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Special case of floating-point power rule for 0.5. Some math can be simplified. +function SCMC_sqrt_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + OUT[idx,3] = sqrt(x[idx,3]) + OUT[idx,4] = sqrt(x[idx,4]) + + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + + if x[idx,3] == x[idx,4] + OUT[idx,1] = sqrt(x[idx,3]) + OUT[idx,2] = sqrt(midcc) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 # Why? Different from other powers. E.g., x^0.5 != sqrt(x)? + + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * 0.5/sqrt(x[idx,1]) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * 0.5/sqrt(x[idx,1]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else + OUT[idx,1] = ((sqrt(x[idx,4]) - sqrt(x[idx,3]))/(x[idx,4] - x[idx,3]))*(midcv - x[idx,3]) + sqrt(x[idx,3]) + OUT[idx,2] = sqrt(midcc) + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * ((sqrt(x[idx,4]) - sqrt(x[idx,3]))/(x[idx,4] - x[idx,3])) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * ((sqrt(x[idx,4]) - sqrt(x[idx,3]))/(x[idx,4] - x[idx,3])) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * 0.5/sqrt(x[idx,1]) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * 0.5/sqrt(x[idx,1]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Power function for large floating-point values. This function is ONLY MEANT FOR +# USE OUTSIDE OF 0 < c < 1. For that, use SCMC_small_float_power_kernel. +function SCMC_large_float_power_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix, c::T) where T<:Real + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + if isinteger(c) + error("c is an integer, but it's calling a floating-point kernel") + end + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,3] <= 0.0 + OUT[idx,1] = NaN + OUT[idx,2] = NaN + OUT[idx,3] = NaN + OUT[idx,4] = NaN + while col <= colmax + OUT[idx,end-2*colmax+col] = NaN + OUT[idx,end-1*colmax+col] = NaN + col += Int32(1) + end + elseif x[idx,3]==x[idx,4] # Both are function itself + # Should be that x[idx,1]==x[idx,2]==x[idx,3]==x[idx,4], + # so the choice of which to use in each case is arbitrary + OUT[idx,1] = x[idx,1]^c + OUT[idx,2] = x[idx,2]^c + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * c*x[idx,1]^(c-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * c*x[idx,1]^(c-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * c*x[idx,2]^(c-1) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * c*x[idx,2]^(c-1) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + else + if x[idx,2] >= x[idx,1] + if x[idx,1] == x[idx,2] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,1] >= x[idx,4] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,4] >= x[idx,2] + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,1] >= x[idx,3] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,3] >= x[idx,2] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + elseif x[idx,4] >= x[idx,1] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,1] + cc_id = Int32(2) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,1] + cc_id = Int32(2) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,1] + cc_id = Int32(2) + end + elseif x[idx,2] >= x[idx,4] + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,2] + cc_id = Int32(1) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,2] + cc_id = Int32(1) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,2] + cc_id = Int32(1) + end + else + if x[idx,3] >= x[idx,1] + midcv = x[idx,1] + cv_id = Int32(2) + midcc = x[idx,4] + cc_id = Int32(3) + elseif x[idx,2] >= x[idx,3] + midcv = x[idx,2] + cv_id = Int32(1) + midcc = x[idx,4] + cc_id = Int32(3) + else + midcv = x[idx,3] + cv_id = Int32(3) + midcc = x[idx,4] + cc_id = Int32(3) + end + end + + # Now we have midcv/cc, cv/cc_id. + # cv uses the function itself, cc uses a line segment between the bounds + OUT[idx,1] = midcv^c + OUT[idx,2] = (x[idx,3]^c*(x[idx,4] - midcc) + x[idx,4]^c*(midcc - x[idx,3]))/(x[idx,4] - x[idx,3]) + while col <= colmax + if cv_id==Int32(1) + OUT[idx,end-2*colmax+col] = x[idx,end-1*colmax+col] * c*midcv^(c-1) + elseif cv_id==Int32(2) + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] * c*midcv^(c-1) + else + OUT[idx,end-2*colmax+col] = 0.0 + end + if cc_id==Int32(1) + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] * (x[idx,4]^c - x[idx,3]^c)/(x[idx,4] - x[idx,3]) + elseif cc_id==Int32(2) + OUT[idx,end-1*colmax+col] = x[idx,end-2*colmax+col] * (x[idx,4]^c - x[idx,3]^c)/(x[idx,4] - x[idx,3]) + else + OUT[idx,end-1*colmax+col] = 0.0 + end + col += Int32(1) + end + end + + ############################ + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +#= +Binary Rules +=# +# Multiplication of two variables +# max threads: 384 +function SCMC_mult_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix, y::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Begin multiplication + if x[idx,3] >= 0.0 + if y[idx,3] >= 0.0 + # x and y strictly positive + OUT[idx,3] = x[idx,3]*y[idx,3] + OUT[idx,4] = x[idx,4]*y[idx,4] + t1_cv_left = y[idx,4]*x[idx,1] + x[idx,4]*y[idx,1] - x[idx,4]*y[idx,4] + t1_cv_right = y[idx,3]*x[idx,1] + x[idx,3]*y[idx,1] - x[idx,3]*y[idx,3] + t1_cc_left = y[idx,3]*x[idx,2] + x[idx,4]*y[idx,2] - x[idx,4]*y[idx,3] + t1_cc_right = y[idx,4]*x[idx,2] + x[idx,3]*y[idx,2] - x[idx,3]*y[idx,4] + if t1_cv_left > t1_cv_right + OUT[idx,1] = t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = y[idx,4]*x[idx,end-2*colmax+col] + x[idx,4]*y[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = y[idx,3]*x[idx,end-2*colmax+col] + x[idx,3]*y[idx,end-2*colmax+col] + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left < t1_cc_right + OUT[idx,2] = t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = y[idx,3]*x[idx,end-1*colmax+col] + x[idx,4]*y[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,2] = t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = y[idx,4]*x[idx,end-1*colmax+col] + x[idx,3]*y[idx,end-1*colmax+col] + col += Int32(1) + end + end + elseif y[idx,4] <= 0.0 + # x strictly positive, y strictly negative + OUT[idx,3] = x[idx,4]*y[idx,3] + OUT[idx,4] = x[idx,3]*y[idx,4] + t1_cv_left = (-y[idx,4])*x[idx,2] + x[idx,4]*(-y[idx,1]) - x[idx,4]*(-y[idx,4]) + t1_cv_right = (-y[idx,3])*x[idx,2] + x[idx,3]*(-y[idx,1]) - x[idx,3]*(-y[idx,3]) + t1_cc_left = (-y[idx,3])*x[idx,1] + x[idx,4]*(-y[idx,2]) - x[idx,4]*(-y[idx,3]) + t1_cc_right = (-y[idx,4])*x[idx,1] + x[idx,3]*(-y[idx,2]) - x[idx,3]*(-y[idx,4]) + if t1_cv_left < t1_cv_right + OUT[idx,1] = -t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = -((-y[idx,4])*x[idx,end-1*colmax+col] + x[idx,4]*(-y[idx,end-2*colmax+col])) + col += Int32(1) + end + else + OUT[idx,1] = -t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = -((-y[idx,3])*x[idx,end-1*colmax+col] + x[idx,3]*(-y[idx,end-2*colmax+col])) + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left > t1_cc_right + OUT[idx,2] = -t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = -((-y[idx,3])*x[idx,end-2*colmax+col] + x[idx,4]*(-y[idx,end-1*colmax+col])) + col += Int32(1) + end + else + OUT[idx,2] = -t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = -((-y[idx,4])*x[idx,end-2*colmax+col] + x[idx,3]*(-y[idx,end-1*colmax+col])) + col += Int32(1) + end + end + else + # x strictly positive, y mixed + OUT[idx,3] = x[idx,4]*y[idx,3] + OUT[idx,4] = x[idx,4]*y[idx,4] + t1_cv_left = y[idx,4]*x[idx,1] + x[idx,4]*y[idx,1] - x[idx,4]*y[idx,4] + t1_cv_right = y[idx,3]*x[idx,2] + x[idx,3]*y[idx,1] - x[idx,3]*y[idx,3] + t1_cc_left = y[idx,3]*x[idx,1] + x[idx,4]*y[idx,2] - x[idx,4]*y[idx,3] + t1_cc_right = y[idx,4]*x[idx,2] + x[idx,3]*y[idx,2] - x[idx,3]*y[idx,4] + if t1_cv_left > t1_cv_right + OUT[idx,1] = t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = y[idx,4]*x[idx,end-2*colmax+col] + x[idx,4]*y[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = y[idx,3]*x[idx,end-1*colmax+col] + x[idx,3]*y[idx,end-2*colmax+col] + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left < t1_cc_right + OUT[idx,2] = t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = y[idx,3]*x[idx,end-2*colmax+col] + x[idx,4]*y[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,2] = t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = y[idx,4]*x[idx,end-1*colmax+col] + x[idx,3]*y[idx,end-1*colmax+col] + col += Int32(1) + end + end + end + elseif x[idx,4] <= 0.0 + if y[idx,3] >= 0.0 + # x strictly negative, y strictly positive + OUT[idx,3] = x[idx,3]*y[idx,4] + OUT[idx,4] = x[idx,4]*y[idx,3] + t1_cv_left = y[idx,3]*(-x[idx,1]) + (-x[idx,3])*y[idx,2] - (-x[idx,3])*y[idx,3] + t1_cv_right = y[idx,4]*(-x[idx,1]) + (-x[idx,4])*y[idx,2] - (-x[idx,4])*y[idx,4] + t1_cc_left = y[idx,4]*(-x[idx,2]) + (-x[idx,3])*y[idx,1] - (-x[idx,3])*y[idx,4] + t1_cc_right = y[idx,3]*(-x[idx,2]) + (-x[idx,4])*y[idx,1] - (-x[idx,4])*y[idx,3] + if t1_cv_left < t1_cv_right + OUT[idx,1] = -t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = -(y[idx,3]*(-x[idx,end-2*colmax+col]) + (-x[idx,3])*y[idx,end-1*colmax+col]) + col += Int32(1) + end + else + OUT[idx,1] = -t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = -(y[idx,4]*(-x[idx,end-2*colmax+col]) + (-x[idx,4])*y[idx,end-1*colmax+col]) + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left > t1_cc_right + OUT[idx,2] = -t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = -(y[idx,4]*(-x[idx,end-1*colmax+col]) + (-x[idx,3])*y[idx,end-2*colmax+col]) + col += Int32(1) + end + else + OUT[idx,2] = -t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = -(y[idx,3]*(-x[idx,end-1*colmax+col]) + (-x[idx,4])*y[idx,end-2*colmax+col]) + col += Int32(1) + end + end + elseif y[idx,4] <= 0.0 + # x and y strictly negative + OUT[idx,3] = x[idx,4]*y[idx,4] + OUT[idx,4] = x[idx,3]*y[idx,3] + t1_cv_left = y[idx,3]*x[idx,2] + x[idx,3]*y[idx,2] - x[idx,3]*y[idx,3] + t1_cv_right = y[idx,4]*x[idx,2] + x[idx,4]*y[idx,2] - x[idx,4]*y[idx,4] + t1_cc_left = y[idx,4]*x[idx,1] + x[idx,3]*y[idx,1] - x[idx,3]*y[idx,4] + t1_cc_right = y[idx,3]*x[idx,1] + x[idx,4]*y[idx,1] - x[idx,4]*y[idx,3] + if t1_cv_left > t1_cv_right + OUT[idx,1] = t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = (-y[idx,3])*(-x[idx,end-1*colmax+col]) + (-x[idx,3])*(-y[idx,end-1*colmax+col]) + col += Int32(1) + end + else + OUT[idx,1] = t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = (-y[idx,4])*(-x[idx,end-1*colmax+col]) + (-x[idx,4])*(-y[idx,end-1*colmax+col]) + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left < t1_cc_right + OUT[idx,2] = t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = (-y[idx,4])*(-x[idx,end-2*colmax+col]) + (-x[idx,3])*(-y[idx,end-2*colmax+col]) + col += Int32(1) + end + else + OUT[idx,2] = t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = (-y[idx,3])*(-x[idx,end-2*colmax+col]) + (-x[idx,4])*(-y[idx,end-2*colmax+col]) + col += Int32(1) + end + end + else + # x strictly negative, y mixed + OUT[idx,3] = x[idx,3]*y[idx,4] + OUT[idx,4] = x[idx,3]*y[idx,3] + t1_cv_left = y[idx,3]*(-x[idx,2]) + (-x[idx,3])*y[idx,2] - (-x[idx,3])*y[idx,3] + t1_cv_right = y[idx,4]*(-x[idx,1]) + (-x[idx,4])*y[idx,2] - (-x[idx,4])*y[idx,4] + t1_cc_left = y[idx,4]*(-x[idx,2]) + (-x[idx,3])*y[idx,1] - (-x[idx,3])*y[idx,4] + t1_cc_right = y[idx,3]*(-x[idx,1]) + (-x[idx,4])*y[idx,1] - (-x[idx,4])*y[idx,3] + if t1_cv_left < t1_cv_right + OUT[idx,1] = -t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = -(y[idx,3]*(-x[idx,end-1*colmax+col]) + (-x[idx,3])*y[idx,end-1*colmax+col]) + col += Int32(1) + end + else + OUT[idx,1] = -t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = -(y[idx,4]*(-x[idx,end-2*colmax+col]) + (-x[idx,4])*y[idx,end-1*colmax+col]) + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left > t1_cc_right + OUT[idx,2] = -t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = -((-x[idx,3])*(y[idx,end-2*colmax+col]) + (y[idx,4])*(-x[idx,end-1*colmax+col])) + col += Int32(1) + end + else + OUT[idx,2] = -t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = -((-x[idx,4])*(y[idx,end-2*colmax+col]) + (y[idx,3])*(-x[idx,end-2*colmax+col])) + col += Int32(1) + end + end + end + else + if y[idx,3] >= 0.0 + # x mixed, y strictly positive + OUT[idx,3] = x[idx,3]*y[idx,4] + OUT[idx,4] = x[idx,4]*y[idx,4] + t1_cv_left = x[idx,4]*y[idx,1] + y[idx,4]*x[idx,1] - y[idx,4]*x[idx,4] + t1_cv_right = x[idx,3]*y[idx,2] + y[idx,3]*x[idx,1] - y[idx,3]*x[idx,3] + t1_cc_left = x[idx,3]*y[idx,1] + y[idx,4]*x[idx,2] - y[idx,4]*x[idx,3] + t1_cc_right = x[idx,4]*y[idx,2] + y[idx,3]*x[idx,2] - y[idx,3]*x[idx,4] + if t1_cv_left > t1_cv_right + OUT[idx,1] = t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = (x[idx,4])*(y[idx,end-2*colmax+col]) + (y[idx,4])*(x[idx,end-2*colmax+col]) + col += Int32(1) + end + else + OUT[idx,1] = t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = (x[idx,3])*(y[idx,end-1*colmax+col]) + (y[idx,3])*(x[idx,end-2*colmax+col]) + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left < t1_cc_right + OUT[idx,2] = t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = (x[idx,3])*(y[idx,end-2*colmax+col]) + (y[idx,4])*(x[idx,end-1*colmax+col]) + col += Int32(1) + end + else + OUT[idx,2] = t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = (x[idx,4])*(y[idx,end-1*colmax+col]) + (y[idx,3])*(x[idx,end-1*colmax+col]) + col += Int32(1) + end + end + elseif y[idx,4] <= 0.0 + # x mixed, y strictly negative + OUT[idx,3] = x[idx,4]*y[idx,3] + OUT[idx,4] = x[idx,3]*y[idx,3] + t1_cv_left = x[idx,3]*(-y[idx,2]) + (-y[idx,3])*x[idx,2] - (-y[idx,3])*x[idx,3] + t1_cv_right = x[idx,4]*(-y[idx,1]) + (-y[idx,4])*x[idx,2] - (-y[idx,4])*x[idx,4] + t1_cc_left = x[idx,4]*(-y[idx,2]) + (-y[idx,3])*x[idx,1] - (-y[idx,3])*x[idx,4] + t1_cc_right = x[idx,3]*(-y[idx,1]) + (-y[idx,4])*x[idx,1] - (-y[idx,4])*x[idx,3] + if t1_cv_left < t1_cv_right + OUT[idx,1] = -t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = -((x[idx,3])*(-y[idx,end-1*colmax+col]) + (-y[idx,3])*(x[idx,end-1*colmax+col])) + col += Int32(1) + end + else + OUT[idx,1] = -t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = -((x[idx,4])*(-y[idx,end-2*colmax+col]) + (-y[idx,4])*(x[idx,end-1*colmax+col])) + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left > t1_cc_right + OUT[idx,2] = -t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = -((x[idx,4])*(-y[idx,end-1*colmax+col]) + (-y[idx,3])*(x[idx,end-2*colmax+col])) + col += Int32(1) + end + else + OUT[idx,2] = -t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = -((x[idx,3])*(-y[idx,end-2*colmax+col]) + (-y[idx,4])*(x[idx,end-2*colmax+col])) + col += Int32(1) + end + end + else + # x and y both mixed + OUT[idx,3] = min(x[idx,3]*y[idx,4], x[idx,4]*y[idx,3]) + OUT[idx,4] = max(x[idx,3]*y[idx,3], x[idx,4]*y[idx,4]) + t1_cv_left = y[idx,4]*x[idx,1] + x[idx,4]*y[idx,1] - x[idx,4]*y[idx,4] + t1_cv_right = y[idx,3]*x[idx,2] + x[idx,3]*y[idx,2] - x[idx,3]*y[idx,3] + t1_cc_left = y[idx,3]*x[idx,1] + x[idx,4]*y[idx,2] - x[idx,4]*y[idx,3] + t1_cc_right = y[idx,4]*x[idx,2] + x[idx,3]*y[idx,1] - x[idx,3]*y[idx,4] + if t1_cv_left > t1_cv_right + OUT[idx,1] = t1_cv_left + while col <= colmax + OUT[idx,end-2*colmax+col] = y[idx,4]*x[idx,end-2*colmax+col] + x[idx,4]*y[idx,end-2*colmax+col] + col += Int32(1) + end + else + OUT[idx,1] = t1_cv_right + while col <= colmax + OUT[idx,end-2*colmax+col] = y[idx,3]*x[idx,end-1*colmax+col] + x[idx,3]*y[idx,end-1*colmax+col] + col += Int32(1) + end + end + col = Int32(1) + if t1_cc_left < t1_cc_right + OUT[idx,2] = t1_cc_left + while col <= colmax + OUT[idx,end-1*colmax+col] = y[idx,3]*x[idx,end-2*colmax+col] + x[idx,4]*y[idx,end-1*colmax+col] + col += Int32(1) + end + else + OUT[idx,2] = t1_cc_right + while col <= colmax + OUT[idx,end-1*colmax+col] = y[idx,4]*x[idx,end-1*colmax+col] + x[idx,3]*y[idx,end-2*colmax+col] + col += Int32(1) + end + end + end + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +# Addition of two variables +# max threads: 1024 +function SCMC_add_kernel(OUT::CuDeviceMatrix, x::CuDeviceMatrix, y::CuDeviceMatrix) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + # Begin addition + OUT[idx,1] = x[idx,1] + y[idx,1] + OUT[idx,2] = x[idx,2] + y[idx,2] + OUT[idx,3] = x[idx,3] + y[idx,3] + OUT[idx,4] = x[idx,4] + y[idx,4] + while col <= colmax + OUT[idx,end-2*colmax+col] = x[idx,end-2*colmax+col] + y[idx,end-2*colmax+col] + OUT[idx,end-1*colmax+col] = x[idx,end-1*colmax+col] + y[idx,end-1*colmax+col] + col += Int32(1) + end + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + + + +################## +# Some templates that are useful for writing new kernels. + +function TEMPLATE_KERNEL(OUT::CuDeviceMatrix, x::CuDeviceMatrix, z::Integer) + idx = threadIdx().x + (blockIdx().x - Int32(1)) * blockDim().x + stride = blockDim().x * gridDim().x + colmax = Int32((size(OUT,2)-4)/2) + + while idx <= Int32(size(OUT,1)) + # Reset the column counter + col = Int32(1) + + if x[idx,4] <= 0.0 + eps_min = x[idx,4] + eps_max = x[idx,3] + elseif x[idx,3] >= 0.0 + eps_min = x[idx,3] + eps_max = x[idx,4] + elseif abs(x[idx,3]) >= abs(x[idx,4]) + eps_min = 0.0 + eps_max = x[idx,3] + else + eps_min = 0.0 + eps_max = x[idx,4] + end + + if xcc >= xcv + if xcv == xcc + midcc = xcv + cc_id = Int32(2) + midcv = xcv + cv_id = Int32(2) + elseif xcv >= eps_max + if xcv >= eps_min + midcc = xcv + cc_id = Int32(2) + midcv = xcv + cv_id = Int32(2) + elseif eps_min >= xcc + midcc = xcv + cc_id = Int32(2) + midcv = xcc + cv_id = Int32(1) + else + midcc = xcv + cc_id = Int32(2) + midcv = eps_min + cv_id = Int32(3) + end + elseif eps_max >= xcc + if xcv >= eps_min + midcc = xcc + cc_id = Int32(1) + midcv = xcv + cv_id = Int32(2) + elseif eps_min >= xcc + midcc = xcc + cc_id = Int32(1) + midcv = xcc + cv_id = Int32(1) + else + midcc = xcc + cc_id = Int32(1) + midcv = eps_min + cv_id = Int32(3) + end + else + if xcv >= eps_min + midcc = eps_max + cc_id = Int32(3) + midcv = xcv + cv_id = Int32(2) + elseif eps_min >= xcc + midcc = eps_max + cc_id = Int32(3) + midcv = xcc + cv_id = Int32(1) + else + midcc = eps_max + cc_id = Int32(3) + midcv = eps_min + cv_id = Int32(3) + end + end + elseif eps_max >= xcv + if eps_min >= xcv + midcc = xcv + cc_id = Int32(2) + midcv = xcv + cv_id = Int32(2) + elseif xcc >= eps_min + midcc = xcv + cc_id = Int32(2) + midcv = xcc + cv_id = Int32(1) + else + midcc = xcv + cc_id = Int32(2) + midcv = eps_min + cv_id = Int32(3) + end + elseif xcc >= eps_max + if eps_min >= xcv + midcc = xcc + cc_id = Int32(1) + midcv = xcv + cv_id = Int32(2) + elseif xcc >= eps_min + midcc = xcc + cc_id = Int32(1) + midcv = xcc + cv_id = Int32(1) + else + midcc = xcc + cc_id = Int32(1) + midcv = eps_min + cv_id = Int32(3) + end + else + if eps_min >= xcv + midcc = eps_max + cc_id = Int32(3) + midcv = xcv + cv_id = Int32(2) + elseif xcc >= eps_min + midcc = eps_max + cc_id = Int32(3) + midcv = xcc + cv_id = Int32(1) + else + midcc = eps_max + cc_id = Int32(3) + midcv = eps_min + cv_id = Int32(3) + end + end + + cv = midcv*midcv^(z-1) + dcv = z*midcv*^(z-1) + if xL == xU + cc = midcc^z + dcc = z*midcc^(z-1) + else + cc = (xL^z*(xU - midcc) + xU^z*(midcc - xL))/(xU - xL) + dcc = (xU^z - zL^z)/(xU - xL) + end + + while col <= colmax + OUT[idx,end-2*colmax+col] = cv_id * dcv + OUT[idx,end-1*colmax+col] = cc_id * dcc + col += Int32(1) + end + + + # Perform the cut operation + if OUT[idx,1] < OUT[idx,3] + OUT[idx,1] = OUT[idx,3] + col = Int32(1) + while col <= colmax + OUT[idx,end-2*colmax+col] = 0.0 + col += Int32(1) + end + end + if OUT[idx,2] > OUT[idx,4] + OUT[idx,2] = OUT[idx,4] + col = Int32(1) + while col <= colmax + OUT[idx,end-1*colmax+col] = 0.0 + col += Int32(1) + end + end + + idx += stride + end + return nothing +end + +function newton_or_golden_section_TEMPLATE(x0, xL, xU, f, df, envp1, envp2) + dfk = 0.0 + xk_CV_OR_CC = max(xL, min(x0, xU)) + fk = f(xk, envp1, envp2) + flag = true + iter = Int32(1) + while iter <= Int32(100) + dfk = df(xk_CV_OR_CC, envp1, envp2) + if abs(fk) < 1e-10 + flag = false + break # use xk_CV_OR_CC + end + if iszero(dfk) + xk_CV_OR_CC = 0.0 + break # Need to do golden section + end + if (xk_CV_OR_CC == xL) && (fk/dfk > 0.0) + flag = false + break # use xk_CV_OR_CC + elseif (xk_CV_OR_CC == xU) && (fk/dfk < 0.0) + flag = false + break # use xk_CV_OR_CC + end + xk_CV_OR_CC = max(xL, min(xU, xk_CV_OR_CC - dk/dfk)) + fk = f(xk_CV_OR_CC, envp1, envp2) + iter += Int32(1) + end + + # If flag, we need to do golden section instead + if flag + a_golden = xL + fa_golden = f(a_golden, envp1, envp2) + c_golden = xU + fc_golden = f(c_golden, envp1, envp2) + + if fa_golden*fc_golden > 0 + xk_CV_OR_CC = NaN + end + + b_golden = xU - (2.0 - Base.MathConstants.golden)*(xU - xL) + fb_golden = f(b_golden, envp1, envp2) + + iter = Int32(1) + while iter <= Int32(100) + if (c_golden - b_golden > b_golden - a_golden) + x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden) + if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100) + xk_CV_OR_CC = (c_golden + a_golden)/2.0 + break + end + iter += Int32(1) + fx_golden = f(x_golden, envp1, envp2) + if fa_golden*fx_golden < 0.0 + c_golden = x_golden + fc_golden = fx_golden + else + a_golden = b_golden + fa_golden = fb_golden + b_golden = x_golden + fb_golden = fx_golden + end + else + x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden) + if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100) + xk_CV_OR_CC = (c_golden + a_golden)/2.0 + break + end + iter += Int32(1) + fx_golden = f(x_golden, envp1, envp2) + if fa_golden*fb_golden < 0.0 + c_golden = b_golden + fc_golden = fb_golden + b_golden = x_golden + fb_golden = fx_golden + else + a_golden = x_golden + fa_golden = fx_golden + end + end + end + end +end \ No newline at end of file diff --git a/src/kernel_writer/storage/.gitignore b/src/kernel_writer/storage/.gitignore new file mode 100644 index 0000000..86d0cb2 --- /dev/null +++ b/src/kernel_writer/storage/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/src/kernel_writer/string_math_kernels.jl b/src/kernel_writer/string_math_kernels.jl new file mode 100644 index 0000000..869b6e1 --- /dev/null +++ b/src/kernel_writer/string_math_kernels.jl @@ -0,0 +1,14242 @@ + +# String versions of math_kernels_short_inputs.jl + +# These functions return strings of the inside portion +# of the original kernel, where the inputs are the +# variables being used and, optionally, whether the +# output is summed or simply set equal to the calculation +# result. The `sum_output` option may be useful for reducing +# the number of temporary variables being used, since, +# for example, McCormick information can be added to an +# existing temporary variable instead of making a new one. + +# Order for inputs of generated kernels is: +# [cv, cc, lo, hi, cvgrad, ccgrad]. + +#= +Unitary Rules +=# +# Addition of a constant +function SCMC_cadd_kernel(OUT::String, v1::String, CONST::Real, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + v1_cvgrad = "1.0" + v1_ccgrad = "1.0" + # Saving this here, for future kernels, in case this breaks something + # v1_cv = "$(v1)[idx,1]" + # v1_cc = "$(v1)[idx,2]" + # v1_lo = "$(v1)[idx,3]" + # v1_hi = "$(v1)[idx,4]" + # v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + # v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[" + OUT_ccgrad = "$(OUT)_ccgrad[" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + write(buffer, " ############################\n") + write(buffer, " ## Addition of a constant ##\n") + write(buffer, " ############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq $v1_lo + $CONST\n") + write(buffer, " $OUT_hi $eq $v1_hi + $CONST\n") + write(buffer, " $OUT_cv $eq $v1_cv + $CONST\n") + write(buffer, " $OUT_cc $eq $v1_cc + $CONST\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $(OUT_cvgrad)col] = $v1_cvgrad\n") + write(buffer, " $(OUT_ccgrad)col] = $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $(OUT_cvgrad)col] = 0.0\n") + write(buffer, " $(OUT_ccgrad)col] = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $(OUT_cvgrad)col] = 0.0\n") + write(buffer, " $(OUT_ccgrad)col] = 0.0\n") + write(buffer, " else\n") + write(buffer, " $(OUT_cvgrad)col] = $v1_cvgrad\n") + write(buffer, " $(OUT_ccgrad)col] = $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $(OUT_cvgrad)col] = $v1_cvgrad\n") + write(buffer, " $(OUT_ccgrad)col] = $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $(OUT_cvgrad)col] = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $(OUT_ccgrad)col] = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + return String(take!(buffer)) +end + +# Addition to an existing variable +# max threads: 1024 +function SCMC_add_to_kernel(OUT::String, v1::String, varlist::Vector{String}, sparsity::Vector{Int}) + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + v1_cvgrad = "1.0" + v1_ccgrad = "1.0" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[" # THIS IS INTENTIONAL. We can shorten subgradient calculations if + OUT_ccgrad = "$(OUT)_ccgrad[" # v1 is a base-level variable. + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + write(buffer, " ############################\n") + write(buffer, " ## Addition to a variable ##\n") + write(buffer, " ############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo += $v1_lo\n") + write(buffer, " $OUT_hi += $v1_hi\n") + write(buffer, " $OUT_cv += $v1_cv\n") + write(buffer, " $OUT_cc += $v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $(OUT_cvgrad)col] += $v1_cvgrad\n") + write(buffer, " $(OUT_ccgrad)col] += $v1_ccgrad\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " nothing\n") + write(buffer, " else\n") + write(buffer, " $(OUT_cvgrad)col] += $v1_cvgrad\n") + write(buffer, " $(OUT_ccgrad)col] += $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $(OUT_cvgrad)col] += $v1_cvgrad\n") + write(buffer, " $(OUT_ccgrad)col] += $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $(OUT_cvgrad)col] = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $(OUT_ccgrad)col] = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + return String(take!(buffer)) +end + +# Negating (equivalent to multiplication by a constant if constant==-1) +# max threads: 1024 +function SCMC_negate_kernel(OUT::String, v1::String, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + v1_cvgrad = "1.0" + v1_ccgrad = "1.0" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + write(buffer, " ##############\n") + write(buffer, " ## Negation ##\n") + write(buffer, " ##############\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq -$v1_hi\n") + write(buffer, " $OUT_hi $eq -$v1_lo\n") + write(buffer, " $OUT_cv $eq -$v1_cc\n") + write(buffer, " $OUT_cc $eq -$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad $eq -$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad $eq -$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad $eq -$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + return String(take!(buffer)) +end + +# Exponential (Note: Can't do sum output, because of the degeneracy check at the end) +# max threads: 896 +function SCMC_exp_kernel(OUT::String, v1::String, varlist::Vector{String}, sparsity::Vector{Int}) + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + v1_cvgrad = "1.0" + v1_ccgrad = "1.0" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + if startswith(v1, r"aux|temp") + # If the variable is an auxiliary, we can't necessarily simplify the if-else tree + write(buffer, " #################\n") + write(buffer, " ## Exponential ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo = exp($v1_lo)\n") + write(buffer, " $OUT_hi = exp($v1_hi)\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " $OUT_cv = exp($v1_cc)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = exp($v1_lo)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cc) + exp($v1_hi)*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " $OUT_cv = exp($v1_cc)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cc) + exp($v1_hi)*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = exp($v1_lo)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cc) + exp($v1_hi)*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = exp($v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " $OUT_cv = exp($v1_cc)\n") + write(buffer, " $OUT_cc = exp($v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = exp($v1_lo)\n") + write(buffer, " $OUT_cc = exp($v1_hi)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " $OUT_cv = exp($v1_cc)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = exp($v1_lo)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cc) + exp($v1_hi)*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " $OUT_cv = exp($v1_cc)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cc) + exp($v1_hi)*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = exp($v1_lo)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cc) + exp($v1_hi)*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = exp($v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cv)*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " $OUT_cv = exp($v1_cc)\n") + write(buffer, " $OUT_cc = exp($v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = exp($v1_cc)*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = exp($v1_lo)\n") + write(buffer, " $OUT_cc = exp($v1_hi)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Check if interval is degenerate, and if so, set the concave relaxation subgradient to 0.0\n") + write(buffer, " if $v1_hi == $v1_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " #################\n") + write(buffer, " ## Exponential ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo = exp($v1_lo)\n") + write(buffer, " $OUT_hi = exp($v1_hi)\n") + write(buffer, " $OUT_cv = exp($v1_cv)\n") + write(buffer, " $OUT_cc = (exp($v1_lo)*($v1_hi - $v1_cv) + exp($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = exp($v1_cv)\n") + write(buffer, " $OUT_ccgrad = (exp($v1_hi) - exp($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Check if interval is degenerate, and if so, set the concave relaxation subgradient to 0.0\n") + write(buffer, " if $v1_hi == $v1_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + + +# Logarithm +# max threads: 896 +function SCMC_log_kernel(OUT::String, v1::String, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + if startswith(v1, r"aux|temp") + write(buffer, " ###############\n") + write(buffer, " ## Logarithm ##\n") + write(buffer, " ###############\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_hi $eq log(max($v1_hi, 0.0))\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cc - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cc - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cc - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cc - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1/$v1_cv)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cc - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cc, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1/$v1_cc)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cc - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_hi, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Convert domain errors to NaNs\n") + write(buffer, " if $v1_lo < 0.0\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv < 0.0\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc < 0.0\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi < 0.0\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " ###############\n") + write(buffer, " ## Logarithm ##\n") + write(buffer, " ###############\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_hi $eq log(max($v1_hi, 0.0))\n") + write(buffer, " if $v1_hi > $v1_lo\n") + write(buffer, " $OUT_cv $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo) * ($v1_cv - $v1_lo) + log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (log(max($v1_hi, 0.0)) - log(max($v1_lo, 0.0)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq log(max($v1_lo, 0.0))\n") + write(buffer, " $OUT_cc $eq log(max($v1_cv, 0.0))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq (1/$v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Convert domain errors to NaNs\n") + write(buffer, " if $v1_lo < 0.0\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv < 0.0\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc < 0.0\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi < 0.0\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + +# Inversion (DONE) +# max threads: 768 +function SCMC_inv_kernel(OUT::String, v1::String, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + if startswith(v1, r"aux|temp") + write(buffer, " ##############################\n") + write(buffer, " ## Multiplicative Inversion ##\n") + write(buffer, " ##############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo > 0.0 # inv1(x)\n") + write(buffer, " $OUT_lo = inv($v1_hi)\n") + write(buffer, " $OUT_hi = inv($v1_lo)\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = (1.0 / $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cc)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cc)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cc)\n") + write(buffer, " $OUT_cc = (1.0 / $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " $OUT_cv = (1.0 / $v1_hi)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " $OUT_cv = (1.0 / $v1_hi)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = (1.0 / $v1_hi)\n") + write(buffer, " $OUT_cc = (1.0 / $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = (1.0 / $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cc)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cc)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cc)\n") + write(buffer, " $OUT_cc = (1.0 / $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = -1.0/($v1_cc*$v1_cc) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " $OUT_cv = (1.0 / $v1_hi)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " $OUT_cv = (1.0 / $v1_hi)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = (1.0 / $v1_hi)\n") + write(buffer, " $OUT_cc = (1.0 / $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi < 0.0 # -inv(-x)\n") + write(buffer, " $OUT_lo = -inv(-$v1_hi)\n") + write(buffer, " $OUT_hi = -inv(-$v1_lo)\n") + write(buffer, " if $v1_cv <= $v1_cc\n") + write(buffer, " if $v1_cc== $v1_cv\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc <= $v1_hi\n") + write(buffer, " if $v1_cc <= $v1_lo\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo <= $v1_cv\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_lo \n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= $v1_cv\n") + write(buffer, " if $v1_cc <= $v1_lo\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo <= $v1_cv\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_lo \n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cc <= $v1_lo\n") + write(buffer, " $OUT_cv = 1.0/$v1_hi\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo <= $v1_cv\n") + write(buffer, " $OUT_cv = 1.0/$v1_hi\n") + write(buffer, " $OUT_cc = 1.0/$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = 1.0/$v1_hi\n") + write(buffer, " $OUT_cc = 1.0/$v1_lo\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= $v1_cc\n") + write(buffer, " if $v1_lo <= $v1_cc\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cv <= $v1_lo\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_lo \n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_ccgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cv <= $v1_hi\n") + write(buffer, " if $v1_lo <= $v1_cc\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cv <= $v1_lo\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_lo \n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi)) * $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo <= $v1_cc\n") + write(buffer, " $OUT_cv = 1.0/$v1_hi\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc)) * $v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cv <= $v1_lo\n") + write(buffer, " $OUT_cv = 1.0/$v1_hi\n") + write(buffer, " $OUT_cc = 1.0/$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cv*$v1_cv)) * $v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv = 1.0/$v1_hi\n") + write(buffer, " $OUT_cc = 1.0/$v1_lo\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else #invalid\n") + write(buffer, " $OUT_lo = NaN\n") + write(buffer, " $OUT_hi = NaN\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " ##############################\n") + write(buffer, " ## Multiplicative Inversion ##\n") + write(buffer, " ##############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo > 0.0 # inv1(x)\n") + write(buffer, " $OUT_lo = inv($v1_hi)\n") + write(buffer, " $OUT_hi = inv($v1_lo)\n") + write(buffer, " $OUT_cv = (1.0 / $v1_cv)\n") + write(buffer, " $OUT_cc = ($v1_hi + $v1_lo - $v1_cv)/($v1_lo*$v1_hi)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = -1.0/($v1_cv*$v1_cv)\n") + write(buffer, " $OUT_ccgrad = -1.0/($v1_lo*$v1_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi < 0.0 # -inv(-x)\n") + write(buffer, " $OUT_lo = -inv(-$v1_hi)\n") + write(buffer, " $OUT_hi = -inv(-$v1_lo)\n") + write(buffer, " $OUT_cv = ($v1_lo + $v1_hi - $v1_cc)/($v1_lo*$v1_hi)\n") + write(buffer, " $OUT_cc = 1.0/$v1_cc\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = (-1.0/($v1_lo*$v1_hi))\n") + write(buffer, " $OUT_ccgrad = (-1.0/($v1_cc*$v1_cc))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else #invalid\n") + write(buffer, " $OUT_lo = NaN\n") + write(buffer, " $OUT_hi = NaN\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + +# Multiplication by a constant +# max threads: 640 +function SCMC_cmul_kernel(OUT::String, v1::String, CONST::Real, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + + if CONST >= 0.0 + if startswith(v1, r"aux|temp") + write(buffer, " ###########################################\n") + write(buffer, " ## Multiplication by a Positive Constant ##\n") + write(buffer, " ###########################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq $CONST*$v1_lo\n") + write(buffer, " $OUT_hi $eq $CONST*$v1_hi\n") + write(buffer, " $OUT_cv $eq $CONST*$v1_cv\n") + write(buffer, " $OUT_cc $eq $CONST*$v1_cc\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $CONST*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $CONST*$v1_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $CONST*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $CONST*$v1_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $CONST*$v1_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $CONST*$v1_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " ###########################################\n") + write(buffer, " ## Multiplication by a Positive Constant ##\n") + write(buffer, " ###########################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq $CONST*$v1_lo\n") + write(buffer, " $OUT_hi $eq $CONST*$v1_hi\n") + write(buffer, " $OUT_cv $eq $CONST*$v1_cv\n") + write(buffer, " $OUT_cc $eq $CONST*$v1_cc\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $CONST\n") + write(buffer, " $OUT_ccgrad $eq $CONST\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + else + if startswith(v1, r"aux|temp") + write(buffer, " ###########################################\n") + write(buffer, " ## Multiplication by a Negative Constant ##\n") + write(buffer, " ###########################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq $CONST*$v1_hi\n") + write(buffer, " $OUT_hi $eq $CONST*$v1_lo\n") + write(buffer, " $OUT_cv $eq $CONST*$v1_cc\n") + write(buffer, " $OUT_cc $eq $CONST*$v1_cv\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $CONST*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad $eq $CONST*$v1_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $CONST*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad $eq $CONST*$v1_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $CONST*$v1_ccgrad\n") + write(buffer, " $OUT_ccgrad $eq $CONST*$v1_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " ###########################################\n") + write(buffer, " ## Multiplication by a Negative Constant ##\n") + write(buffer, " ###########################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_lo $eq $CONST*$v1_hi\n") + write(buffer, " $OUT_hi $eq $CONST*$v1_lo\n") + write(buffer, " $OUT_cv $eq $CONST*$v1_cc\n") + write(buffer, " $OUT_cc $eq $CONST*$v1_cv\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $CONST\n") + write(buffer, " $OUT_ccgrad $eq $CONST\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + end + return String(take!(buffer)) +end + +# Sigmoid function +# max threads: 640 +function SCMC_sigmoid_kernel(OUT::String, v1::String, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + + if startswith(v1, r"aux|temp") + write(buffer, " #############\n") + write(buffer, " ## Sigmoid ##\n") + write(buffer, " #############\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Calculate the interval separately\n") + write(buffer, " $OUT_lo $eq 1.0/(1.0+exp(-$v1_lo))\n") + write(buffer, " $OUT_hi $eq 1.0/(1.0+exp(-$v1_hi))\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo >= 0.0\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_lo) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_lo - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_lo) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_lo - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_lo) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_lo - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_lo) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_lo - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_lo) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_lo - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_lo) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_lo - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= 0.0\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cc) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_hi)))*($v1_hi - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " # FOR CV\n") + write(buffer, " xkm = $v1_lo # max(x_lo, min(x_hi, x_lo)). x_lo 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " elseif (xk_cv == 0.0) && (fk/Bk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " xkm = xk_cv\n") + write(buffer, " fkm = fk\n") + write(buffer, " xk_cv = max($v1_lo, min(0.0, xk_cv - fk/Bk))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead.\n") + write(buffer, " if flag\n") + write(buffer, " a_sigmoid = $v1_lo\n") + write(buffer, " fa_sigmoid = ($v1_lo - $v1_hi)*exp(-$v1_lo)/(1.0 + exp(-$v1_lo))^2 - (1.0/(1.0 + exp(-$v1_lo)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, " c_sigmoid = 0.0\n") + write(buffer, " fc_sigmoid = (0.0 - $v1_hi)*exp(0.0)/(1.0 + exp(0.0))^2 - (1.0/(1.0 + exp(0.0)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, "\n") + write(buffer, " if fa_sigmoid*fc_sigmoid > 0.0\n") + write(buffer, " xk_cv = NaN\n") + write(buffer, " end\n") + write(buffer, " b_sigmoid = 0.0 - (2.0 - Base.MathConstants.golden)*(0.0 - $v1_lo)\n") + write(buffer, " fb_sigmoid = (b_sigmoid - $v1_hi)*exp(-b_sigmoid)/(1.0 + exp(-b_sigmoid))^2 - (1.0/(1.0 + exp(-b_sigmoid)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_sigmoid - b_sigmoid > b_sigmoid - a_sigmoid)\n") + write(buffer, " x_sigmoid = b_sigmoid + (2.0 - Base.MathConstants.golden)*(c_sigmoid - b_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_hi)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, " if fa_sigmoid*fx_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = x_sigmoid\n") + write(buffer, " fc_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = b_sigmoid\n") + write(buffer, " fa_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_sigmoid = b_sigmoid - (2.0 - Base.MathConstants.golden)*(b_sigmoid - a_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_hi)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, " if fa_sigmoid*fb_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = b_sigmoid\n") + write(buffer, " fc_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = x_sigmoid\n") + write(buffer, " fa_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # FOR CC\n") + write(buffer, " xkm = 0.0 # max(x_lo, min(x_hi, 0.0)). x_hi is positive in this condition, and x_lo is negative. So 0.0.\n") + write(buffer, " xk_cc = $v1_hi # max(x_lo, min(x_hi, x_hi)) == max(x_lo, x_hi), and x_hi>x_lo by definition.\n") + write(buffer, " fkm = (xkm - $v1_lo)*exp(-xkm)/(1.0 + exp(-xkm))^2 - (1.0/(1.0 + exp(-xkm)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " flag = true\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " fk = (xk_cc - $v1_lo)*exp(-xk_cc)/(1.0 + exp(-xk_cc))^2 - (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " Bk = (fk - fkm)/(xk_cc - xkm)\n") + write(buffer, " if (abs(fk) < 1.0e-10)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " elseif (Bk == 0.0)\n") + write(buffer, " xk_cc = 0.0\n") + write(buffer, " break\n") + write(buffer, " elseif (xk_cc == 0.0) && (fk/Bk > 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " elseif (xk_cc == $v1_hi) && (fk/Bk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " xkm = xk_cc\n") + write(buffer, " fkm = fk\n") + write(buffer, " xk_cc = max(0.0, min($v1_hi, xk_cc - fk/Bk))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead.\n") + write(buffer, " if flag\n") + write(buffer, " a_sigmoid = 0.0\n") + write(buffer, " fa_sigmoid = (0.0 - $v1_lo)*exp(0.0)/(1.0 + exp(0.0))^2 - (1.0/(1.0 + exp(0.0)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " c_sigmoid = $v1_hi\n") + write(buffer, " fc_sigmoid = ($v1_hi - $v1_lo)*exp(-$v1_hi)/(1.0 + exp(-$v1_hi))^2 - (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, "\n") + write(buffer, " if fa_sigmoid*fc_sigmoid > 0.0\n") + write(buffer, " xk_cc = NaN\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " b_sigmoid = $v1_hi - (2.0 - Base.MathConstants.golden)*($v1_hi - 0.0)\n") + write(buffer, " fb_sigmoid = (b_sigmoid - $v1_lo)*exp(-b_sigmoid)/(1.0 + exp(-b_sigmoid))^2 - (1.0/(1.0 + exp(-b_sigmoid)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_sigmoid - b_sigmoid > b_sigmoid - a_sigmoid)\n") + write(buffer, " x_sigmoid = b_sigmoid + (2.0 - Base.MathConstants.golden)*(c_sigmoid - b_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_lo)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " if fa_sigmoid*fx_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = x_sigmoid\n") + write(buffer, " fc_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = b_sigmoid\n") + write(buffer, " fa_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_sigmoid = b_sigmoid - (2.0 - Base.MathConstants.golden)*(b_sigmoid - a_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_lo)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " if fa_sigmoid*fb_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = b_sigmoid\n") + write(buffer, " fc_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = x_sigmoid\n") + write(buffer, " fa_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # With xk_cv and xk_cc, continue the rules\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Now use the information about dcv and dcc to calculate subgradients\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, $v1_cv, p (now xk_cv), xU)\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, $v1_cv, xL, p)\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Now use the information about dcv and dcc to calculate subgradients\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " # Use the results of xk to determine what OUT_cv and dcv should be\n") + write(buffer, " if $v1_cc <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, $v1_cc, p (now xk_cv), xU)\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cc) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cc - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, $v1_cv, xL, p)\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Now use the information about dcv and dcc to calculate subgradients\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " # Use the results of xk to determine what OUT_cv and dcv should be\n") + write(buffer, " if $v1_lo <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, $v1_lo, p (now xk_cv), xU)\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_lo) + 1.0/(1.0 + exp(-$v1_hi))*($v1_lo - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, $v1_cv, xL, p)\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Now use the information about dcv and dcc to calculate subgradients\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc == $v1_cv\n") + write(buffer, " # Use the results of xk to determine what OUT_cv and dcv should be\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, $v1_cv, p (now xk_cv), xU)\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, $v1_cv, xL, p)\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Now use the information about dcv and dcc to calculate subgradients\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " # Use the results of xk to determine what OUT_cv and dcv should be\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " # cv, dcv = dline_seg(sigmoid, sigmoid_deriv, $v1_cv, p (now xk_cv), xU)\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " if $v1_cc <= xk_cc\n") + write(buffer, " # cc, dcc = dline_seg(ssigmoid, sigmoid_deriv, $v1_cc, xL, p)\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cc) + 1.0/(1.0 + exp(-xk_cc))*($v1_cc - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_cc <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cc) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cc - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cc) + 1.0/(1.0 + exp(-xk_cc))*($v1_cc - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_lo) + 1.0/(1.0 + exp(-$v1_hi))*($v1_lo - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cc) + 1.0/(1.0 + exp(-xk_cc))*($v1_cc - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_hi) + 1.0/(1.0 + exp(-xk_cc))*($v1_hi - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " if $v1_cc <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cc) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cc - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_hi) + 1.0/(1.0 + exp(-xk_cc))*($v1_hi - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_lo) + 1.0/(1.0 + exp(-$v1_hi))*($v1_lo - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_hi) + 1.0/(1.0 + exp(-xk_cc))*($v1_hi - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_cc <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cc) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cc - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_lo) + 1.0/(1.0 + exp(-$v1_hi))*($v1_lo - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cc) + 1.0/(1.0 + exp(-xk_cc))*($v1_cc - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_cc <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cc) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cc - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cc) + 1.0/(1.0 + exp(-xk_cc))*($v1_cc - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_lo) + 1.0/(1.0 + exp(-$v1_hi))*($v1_lo - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cc <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cc) + 1.0/(1.0 + exp(-xk_cc))*($v1_cc - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcc = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * dcc\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_hi) + 1.0/(1.0 + exp(-xk_cc))*($v1_hi - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " if $v1_cc <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cc))\n") + write(buffer, " dcv = exp(-$v1_cc)/(1.0 + exp(-$v1_cc))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cc) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cc - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_hi) + 1.0/(1.0 + exp(-xk_cc))*($v1_hi - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * dcv\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_lo) + 1.0/(1.0 + exp(-$v1_hi))*($v1_lo - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_hi <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_hi) + 1.0/(1.0 + exp(-xk_cc))*($v1_hi - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_hi))\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " #############\n") + write(buffer, " ## Sigmoid ##\n") + write(buffer, " #############\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Calculate the interval separately\n") + write(buffer, " $OUT_lo $eq 1.0/(1.0+exp(-$v1_lo))\n") + write(buffer, " $OUT_hi $eq 1.0/(1.0+exp(-$v1_hi))\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo >= 0.0\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= 0.0\n") + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " $OUT_cc $eq ((1.0/(1.0 + exp(-$v1_lo)))*($v1_hi - $v1_cv) + (1.0/(1.0 + exp(-$v1_hi)))*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " $OUT_ccgrad $eq (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " # FOR CV\n") + write(buffer, " xkm = $v1_lo # max(x_lo, min(x_hi, x_lo)). x_lo 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " elseif (xk_cv == 0.0) && (fk/Bk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " xkm = xk_cv\n") + write(buffer, " fkm = fk\n") + write(buffer, " xk_cv = max($v1_lo, min(0.0, xk_cv - fk/Bk))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead.\n") + write(buffer, " if flag\n") + write(buffer, " a_sigmoid = $v1_lo\n") + write(buffer, " fa_sigmoid = ($v1_lo - $v1_hi)*exp(-$v1_lo)/(1.0 + exp(-$v1_lo))^2 - (1.0/(1.0 + exp(-$v1_lo)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, " c_sigmoid = 0.0\n") + write(buffer, " fc_sigmoid = (0.0 - $v1_hi)*exp(0.0)/(1.0 + exp(0.0))^2 - (1.0/(1.0 + exp(0.0)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, "\n") + write(buffer, " if fa_sigmoid*fc_sigmoid > 0.0\n") + write(buffer, " xk_cv = NaN\n") + write(buffer, " end\n") + write(buffer, " b_sigmoid = 0.0 - (2.0 - Base.MathConstants.golden)*(0.0 - $v1_lo)\n") + write(buffer, " fb_sigmoid = (b_sigmoid - $v1_hi)*exp(-b_sigmoid)/(1.0 + exp(-b_sigmoid))^2 - (1.0/(1.0 + exp(-b_sigmoid)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_sigmoid - b_sigmoid > b_sigmoid - a_sigmoid)\n") + write(buffer, " x_sigmoid = b_sigmoid + (2.0 - Base.MathConstants.golden)*(c_sigmoid - b_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_hi)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, " if fa_sigmoid*fx_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = x_sigmoid\n") + write(buffer, " fc_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = b_sigmoid\n") + write(buffer, " fa_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_sigmoid = b_sigmoid - (2.0 - Base.MathConstants.golden)*(b_sigmoid - a_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_hi)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_hi)))\n") + write(buffer, " if fa_sigmoid*fb_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = b_sigmoid\n") + write(buffer, " fc_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = x_sigmoid\n") + write(buffer, " fa_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # FOR CC\n") + write(buffer, " xkm = 0.0 # max(x_lo, min(x_hi, 0.0)). x_hi is positive in this condition, and x_lo is negative. So 0.0.\n") + write(buffer, " xk_cc = $v1_hi # max(x_lo, min(x_hi, x_hi)) == max(x_lo, x_hi), and x_hi>x_lo by definition.\n") + write(buffer, " fkm = (xkm - $v1_lo)*exp(-xkm)/(1.0 + exp(-xkm))^2 - (1.0/(1.0 + exp(-xkm)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " flag = true\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " fk = (xk_cc - $v1_lo)*exp(-xk_cc)/(1.0 + exp(-xk_cc))^2 - (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " Bk = (fk - fkm)/(xk_cc - xkm)\n") + write(buffer, " if (abs(fk) < 1.0e-10)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " elseif (Bk == 0.0)\n") + write(buffer, " xk_cc = 0.0\n") + write(buffer, " break\n") + write(buffer, " elseif (xk_cc == 0.0) && (fk/Bk > 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " elseif (xk_cc == $v1_hi) && (fk/Bk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " xkm = xk_cc\n") + write(buffer, " fkm = fk\n") + write(buffer, " xk_cc = max(0.0, min($v1_hi, xk_cc - fk/Bk))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead.\n") + write(buffer, " if flag\n") + write(buffer, " a_sigmoid = 0.0\n") + write(buffer, " fa_sigmoid = (0.0 - $v1_lo)*exp(0.0)/(1.0 + exp(0.0))^2 - (1.0/(1.0 + exp(0.0)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " c_sigmoid = $v1_hi\n") + write(buffer, " fc_sigmoid = ($v1_hi - $v1_lo)*exp(-$v1_hi)/(1.0 + exp(-$v1_hi))^2 - (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, "\n") + write(buffer, " if fa_sigmoid*fc_sigmoid > 0.0\n") + write(buffer, " xk_cc = NaN\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " b_sigmoid = $v1_hi - (2.0 - Base.MathConstants.golden)*($v1_hi - 0.0)\n") + write(buffer, " fb_sigmoid = (b_sigmoid - $v1_lo)*exp(-b_sigmoid)/(1.0 + exp(-b_sigmoid))^2 - (1.0/(1.0 + exp(-b_sigmoid)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_sigmoid - b_sigmoid > b_sigmoid - a_sigmoid)\n") + write(buffer, " x_sigmoid = b_sigmoid + (2.0 - Base.MathConstants.golden)*(c_sigmoid - b_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_lo)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " if fa_sigmoid*fx_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = x_sigmoid\n") + write(buffer, " fc_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = b_sigmoid\n") + write(buffer, " fa_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_sigmoid = b_sigmoid - (2.0 - Base.MathConstants.golden)*(b_sigmoid - a_sigmoid)\n") + write(buffer, " if abs(c_sigmoid-a_sigmoid) < 1.0e-10*(abs(b_sigmoid) + abs(x_sigmoid)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_sigmoid + a_sigmoid)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_sigmoid = (x_sigmoid - $v1_lo)*exp(-x_sigmoid)/(1.0 + exp(-x_sigmoid))^2 - (1.0/(1.0 + exp(-x_sigmoid)) - 1.0/(1.0 + exp(-$v1_lo)))\n") + write(buffer, " if fa_sigmoid*fb_sigmoid < 0.0\n") + write(buffer, " c_sigmoid = b_sigmoid\n") + write(buffer, " fc_sigmoid = fb_sigmoid\n") + write(buffer, " b_sigmoid = x_sigmoid\n") + write(buffer, " fb_sigmoid = fx_sigmoid\n") + write(buffer, " else\n") + write(buffer, " a_sigmoid = x_sigmoid\n") + write(buffer, " fa_sigmoid = fx_sigmoid\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # With xk_cv and xk_cc, continue the rules\n") + write(buffer, " if $v1_cv <= xk_cv\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " if xk_cv == $v1_hi\n") + write(buffer, " $OUT_cv $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcv = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq (1.0/(1.0 + exp(-xk_cv))*($v1_hi - $v1_cv) + 1.0/(1.0 + exp(-$v1_hi))*($v1_cv - xk_cv))/($v1_hi - xk_cv)\n") + write(buffer, " dcv = (1.0/(1.0 + exp(-$v1_hi)) - 1.0/(1.0 + exp(-xk_cv)))/($v1_hi - xk_cv)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_cv <= xk_cc\n") + write(buffer, " if xk_cc == $v1_lo\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq (1.0/(1.0 + exp(-$v1_lo))*(xk_cc - $v1_cv) + 1.0/(1.0 + exp(-xk_cc))*($v1_cv - $v1_lo))/(xk_cc - $v1_lo)\n") + write(buffer, " dcc = (1.0/(1.0 + exp(-xk_cc)) - 1.0/(1.0 + exp(-$v1_lo)))/(xk_cc - $v1_lo)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq 1.0/(1.0 + exp(-$v1_cv))\n") + write(buffer, " dcc = exp(-$v1_cv)/(1.0 + exp(-$v1_cv))^2\n") + write(buffer, " end\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq dcv\n") + write(buffer, " $OUT_ccgrad $eq dcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + +# Positive integer powers +# max threads: ??? +function SCMC_int_power_kernel(OUT::String, v1::String, POW::Int, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + if startswith(v1, r"aux|temp") + if iseven(POW) + if POW==2 + write(buffer, " #############\n") + write(buffer, " ## Squared ##\n") + write(buffer, " #############\n") + write(buffer, "\n") + else + L = length(string(POW)) + write(buffer, " ###############$("#"^L)#####\n") + write(buffer, " ## Even Power ($POW) ##\n") + write(buffer, " ###############$("#"^L)#####\n") + write(buffer, "\n") + end + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_hi <= 0.0\n") + write(buffer, " eps_min = $v1_hi\n") + write(buffer, " eps_max = $v1_lo\n") + write(buffer, " elseif $v1_lo >= 0.0\n") + write(buffer, " eps_min = $v1_lo\n") + write(buffer, " eps_max = $v1_hi\n") + write(buffer, " elseif abs($v1_lo) >= abs($v1_hi)\n") + write(buffer, " eps_min = 0.0\n") + write(buffer, " eps_max = $v1_lo\n") + write(buffer, " else\n") + write(buffer, " eps_min = 0.0\n") + write(buffer, " eps_max = $v1_hi\n") + write(buffer, " end\n") + write(buffer, " $OUT_lo $eq eps_min^$POW\n") + write(buffer, " $OUT_hi $eq eps_max^$POW\n") + write(buffer, "\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv == $v1_cc\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_cv >= eps_max\n") + write(buffer, " if $v1_cv >= eps_min\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif eps_min >= $v1_cc\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " else\n") + write(buffer, " midcv = eps_min\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " end\n") + write(buffer, " elseif eps_max >= $v1_cc\n") + write(buffer, " if $v1_cv >= eps_min\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " elseif eps_min >= $v1_cc\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " else\n") + write(buffer, " midcv = eps_min\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= eps_min\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = eps_max\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " elseif eps_min >= $v1_cc\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = eps_max\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " else\n") + write(buffer, " midcv = eps_min\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = eps_max\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif eps_max >= $v1_cv\n") + write(buffer, " if eps_min >= $v1_cv\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_cc >= eps_min\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " else\n") + write(buffer, " midcv = eps_min\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= eps_max\n") + write(buffer, " if eps_min >= $v1_cv\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " elseif $v1_cc >= eps_min\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " else\n") + write(buffer, " midcv = eps_min\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if eps_min >= $v1_cv\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = eps_max\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " elseif $v1_cc >= eps_min\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = eps_max\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " else\n") + write(buffer, " midcv = eps_min\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = eps_max\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + if POW==2 + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq midcv*midcv\n") + write(buffer, " $OUT_cc $eq midcc^2\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * 2*midcv\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * 2*midcv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * 2*midcc\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * 2*midcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * 2*midcv\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * 2*midcv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * 2*midcc\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * 2*midcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * 2*midcv\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * 2*midcv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * 2*midcc\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * 2*midcc\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq midcv*midcv\n") + write(buffer, " $OUT_cc $eq ($v1_lo^2*($v1_hi - midcc) + $v1_hi^2*(midcc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * 2*midcv\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * 2*midcv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^2 - $v1_lo^2)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^2 - $v1_lo^2)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * 2*midcv\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * 2*midcv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^2 - $v1_lo^2)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^2 - $v1_lo^2)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * 2*midcv\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * 2*midcv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^2 - $v1_lo^2)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^2 - $v1_lo^2)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq midcv*midcv^$(POW-1)\n") + write(buffer, " $OUT_cc $eq midcc^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq midcv*midcv^$(POW-1)\n") + write(buffer, " $OUT_cc $eq ($v1_lo^$POW*($v1_hi - midcc) + $v1_hi^$POW*(midcc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + end + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv $eq $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc $eq $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + if POW==3 + write(buffer, " ###########\n") + write(buffer, " ## Cubed ##\n") + write(buffer, " ###########\n") + write(buffer, "\n") + else + L = length(string(POW)) + write(buffer, " ##############$("#"^L)#####\n") + write(buffer, " ## Odd Power ($POW) ##\n") + write(buffer, " ##############$("#"^L)#####\n") + write(buffer, "\n") + end + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " $OUT_lo $eq $v1_lo^$POW\n") + write(buffer, " $OUT_hi $eq $v1_hi^$POW\n") + write(buffer, "\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv == $v1_cc\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_hi\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_hi\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_hi\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cv\n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cc\n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " midcv = $v1_cv\n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_hi\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " midcv = $v1_cc\n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_hi\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo\n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_hi\n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " if $v1_hi <= 0.0\n") + write(buffer, " if $v1_lo==$v1_hi\n") + write(buffer, " $OUT_cv $eq midcv^$POW\n") + write(buffer, " $OUT_cc $eq midcc^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ($v1_lo^$POW*($v1_hi - midcv) + $v1_hi^$POW*(midcv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq midcc^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif 0.0 <= $v1_lo\n") + write(buffer, " if $v1_lo==$v1_hi\n") + write(buffer, " $OUT_cv $eq midcv^$POW\n") + write(buffer, " $OUT_cc $eq midcc^$POW\n") + write(buffer, " while col <= colmax\n") + + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq midcv^$POW\n") + write(buffer, " $OUT_cc $eq ($v1_lo^$POW*($v1_hi - midcc) + $v1_hi^$POW*(midcc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, "\n") + if POW==3 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.5*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.5*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==5 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.6058295861882683*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.6058295861882683*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==7 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.6703320476030968*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.6703320476030968*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==9 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7145377271673349*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7145377271673349*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==11 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7470540748651559*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7470540748651559*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==13 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7721416355234655*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7721416355234655*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==15 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7921778546056709*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7921778546056709*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==17 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8086048978723027*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8086048978723027*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==19 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8223534102385287*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8223534102385287*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==21 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8340533675507736*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8340533675507736*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==23 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8441478047418446*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8441478047418446*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==25 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8529581643906964*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8529581643906964*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==27 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8607238145679608*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8607238145679608*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==29 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8676269762720762*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8676269762720762*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==31 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8738090154215446*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8738090154215446*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==33 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8793814183583145*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8793814183583145*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==35 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8844333818207290*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8844333818207290*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==37 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8890371830149935*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8890371830149935*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==39 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8932520563312301*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8932520563312301*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==41 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8971270424799359*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8971270424799359*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==43 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9007031161732270*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9007031161732270*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==45 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9040147980608216*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9040147980608216*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==47 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9070913919345662*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9070913919345662*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==49 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9099579456198456*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9099579456198456*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + else + write(buffer, " # Apply Newton/golden section methods for the convex part,\n") + write(buffer, " # to get x_cv (the inflection point for the convex relaxation)\n") + write(buffer, " dfk = 0.0\n") + write(buffer, " xk_cv = max(0.0, $v1_hi)\n") + write(buffer, " fk = (xk_cv^$POW - $v1_lo^$POW) - (xk_cv-$v1_lo)*$POW*(xk_cv^$(POW-1))\n") + write(buffer, " flag = true\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " dfk = $(POW-1)*$POW*xk_cv^$(POW-2)*($v1_lo-xk_cv);\n") + write(buffer, " if abs(fk) < 1e-10\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cv\n") + write(buffer, " end\n") + write(buffer, " if iszero(dfk)\n") + write(buffer, " xk_cv = 0.0\n") + write(buffer, " break # Need to do golden section\n") + write(buffer, " end\n") + write(buffer, " if (xk_cv == 0.0) && (fk/dfk > 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cv\n") + write(buffer, " elseif (xk_cv == $v1_hi) && (fk/dfk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cv\n") + write(buffer, " end\n") + write(buffer, " xk_cv = max(0.0, min($v1_hi, xk_cv - fk/dfk))\n") + write(buffer, " fk = (xk_cv^$POW - $v1_lo^$POW) - (xk_cv-$v1_lo)*$POW*(xk_cv^$(POW-1))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead\n") + write(buffer, " if flag\n") + write(buffer, " a_golden = $v1_lo\n") + write(buffer, " fa_golden = (a_golden^$POW - $v1_lo^$POW) - (a_golden-$v1_lo)*$POW*(a_golden^$(POW-1))\n") + write(buffer, " c_golden = $v1_hi\n") + write(buffer, " fc_golden = (c_golden^$POW - $v1_lo^$POW) - (c_golden-$v1_lo)*$POW*(c_golden^$(POW-1))\n") + write(buffer, "\n") + write(buffer, " if fa_golden*fc_golden > 0\n") + write(buffer, " xk_cv = NaN\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " b_golden = $v1_hi - (2.0 - Base.MathConstants.golden)*($v1_hi - $v1_lo)\n") + write(buffer, " fb_golden = (b_golden^$POW - $v1_lo^$POW) - (b_golden-$v1_lo)*$POW*(b_golden^$(POW-1))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_golden - b_golden > b_golden - a_golden)\n") + write(buffer, " x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = (x_golden^$POW - $v1_lo^$POW) - (x_golden-$v1_lo)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fx_golden < 0.0\n") + write(buffer, " c_golden = x_golden\n") + write(buffer, " fc_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = b_golden\n") + write(buffer, " fa_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = (x_golden^$POW - $v1_lo^$POW) - (x_golden-$v1_lo)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fb_golden < 0.0\n") + write(buffer, " c_golden = b_golden\n") + write(buffer, " fc_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = x_golden\n") + write(buffer, " fa_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Apply Newton/golden section methods for the concave part,\n") + write(buffer, " # to get x_cc (the inflection point for the concave relaxation)\n") + write(buffer, " dfk = 0.0\n") + write(buffer, " xk_cc = $v1_lo\n") + write(buffer, " fk = ($v1_hi^$POW-xk_cc^$POW) - ($v1_hi-xk_cc)*$POW*(xk_cc^$(POW-1))\n") + write(buffer, " flag = true\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " dfk = $(POW-1)*$POW*xk_cc^$(POW-2)*(xk_cc-$v1_hi);\n") + write(buffer, " if abs(fk) < 1e-10\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cc\n") + write(buffer, " end\n") + write(buffer, " if iszero(dfk)\n") + write(buffer, " xk_cc = 0.0\n") + write(buffer, " break # Need to do golden section\n") + write(buffer, " end\n") + write(buffer, " if (xk_cc == $v1_lo) && (fk/dfk > 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cc\n") + write(buffer, " elseif (xk_cc == 0.0) && (fk/dfk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cc\n") + write(buffer, " end\n") + write(buffer, " xk_cc = max($v1_lo, min(0.0, xk_cc - fk/dfk))\n") + write(buffer, " fk = ($v1_hi^$POW-xk_cc^$POW) - ($v1_hi-xk_cc)*$POW*(xk_cc^$(POW-1))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead\n") + write(buffer, " if flag\n") + write(buffer, " a_golden = $v1_lo\n") + write(buffer, " fa_golden = ($v1_hi^$POW-$v1_lo^$POW) - ($v1_hi-$v1_lo)*$POW*($v1_lo^$(POW-1))\n") + write(buffer, " c_golden = $v1_hi\n") + write(buffer, " fc_golden = 0.0\n") + write(buffer, "\n") + write(buffer, " if fa_golden*fc_golden > 0\n") + write(buffer, " xk_cc = NaN\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " b_golden = $v1_hi - (2.0 - Base.MathConstants.golden)*($v1_hi - $v1_lo)\n") + write(buffer, " fb_golden = ($v1_hi^$POW-b_golden^$POW) - ($v1_hi-b_golden)*$POW*(b_golden^$(POW-1))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_golden - b_golden > b_golden - a_golden)\n") + write(buffer, " x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = ($v1_hi^$POW-x_golden^$POW) - ($v1_hi-x_golden)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fx_golden < 0.0\n") + write(buffer, " c_golden = x_golden\n") + write(buffer, " fc_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = b_golden\n") + write(buffer, " fa_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = ($v1_hi^$POW-x_golden^$POW) - ($v1_hi-x_golden)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fb_golden < 0.0\n") + write(buffer, " c_golden = b_golden\n") + write(buffer, " fc_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = x_golden\n") + write(buffer, " fa_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + write(buffer, " # Now we have the inflection points, so we either\n") + write(buffer, " # look at the line segment or the function itself\n") + write(buffer, " if (midcv <= xk_cv) && ($v1_lo != xk_cv) # cv uses line segment\n") + write(buffer, " $OUT_cv $eq ($v1_lo^$POW*(xk_cv - midcv) + xk_cv^$POW*(midcv - $v1_lo))/(xk_cv - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else # cv uses the function itself\n") + write(buffer, " $OUT_cv $eq midcv^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad $eq $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Now do the cc side\n") + write(buffer, " if (midcc > xk_cc) && ($v1_hi != xk_cc)\n") + write(buffer, " $OUT_cc $eq (xk_cc^$POW*($v1_hi - midcc) + $v1_hi^$POW*(midcc - xk_cc))/($v1_hi - xk_cc)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq midcc^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv $eq $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc $eq $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + if iseven(POW) + if POW==2 + write(buffer, " #############\n") + write(buffer, " ## Squared ##\n") + write(buffer, " #############\n") + write(buffer, "\n") + else + L = length(string(POW)) + write(buffer, " ###############$("#"^L)#####\n") + write(buffer, " ## Even Power ($POW) ##\n") + write(buffer, " ###############$("#"^L)#####\n") + write(buffer, "\n") + end + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_hi <= 0.0\n") + write(buffer, " eps_min = $v1_hi\n") + write(buffer, " eps_max = $v1_lo\n") + write(buffer, " elseif $v1_lo >= 0.0\n") + write(buffer, " eps_min = $v1_lo\n") + write(buffer, " eps_max = $v1_hi\n") + write(buffer, " elseif abs($v1_lo) >= abs($v1_hi)\n") + write(buffer, " eps_min = 0.0\n") + write(buffer, " eps_max = $v1_lo\n") + write(buffer, " else\n") + write(buffer, " eps_min = 0.0\n") + write(buffer, " eps_max = $v1_hi\n") + write(buffer, " end\n") + write(buffer, " $OUT_lo $eq eps_min^$POW\n") + write(buffer, " $OUT_hi $eq eps_max^$POW\n") + write(buffer, "\n") + if POW==2 + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq $v1_cv*$v1_cv\n") + write(buffer, " $OUT_cc $eq $v1_cv^2\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq 2*$v1_cv\n") + write(buffer, " $OUT_ccgrad $eq 2*$v1_cv\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq $v1_cv*$v1_cv\n") + write(buffer, " $OUT_cc $eq ($v1_lo^2*($v1_hi - $v1_cv) + $v1_hi^2*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq 2*$v1_cv\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi + $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if $v1_lo == $v1_hi\n") + write(buffer, " $OUT_cv $eq $v1_cv*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_cc $eq $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq $v1_cv*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_cc $eq ($v1_lo^$POW*($v1_hi - $v1_cv) + $v1_hi^$POW*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + end + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv $eq $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc $eq $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + if POW==3 + write(buffer, " ###########\n") + write(buffer, " ## Cubed ##\n") + write(buffer, " ###########\n") + write(buffer, "\n") + else + L = length(string(POW)) + write(buffer, " ##############$("#"^L)#####\n") + write(buffer, " ## Odd Power ($POW) ##\n") + write(buffer, " ##############$("#"^L)#####\n") + write(buffer, "\n") + end + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " $OUT_lo $eq $v1_lo^$POW\n") + write(buffer, " $OUT_hi $eq $v1_hi^$POW\n") + write(buffer, "\n") + write(buffer, " if $v1_hi <= 0.0\n") + write(buffer, " if $v1_lo==$v1_hi\n") + write(buffer, " $OUT_cv $eq $v1_cv^$POW\n") + write(buffer, " $OUT_cc $eq $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq ($v1_lo^$POW*($v1_hi - $v1_cv) + $v1_hi^$POW*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc $eq $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif 0.0 <= $v1_lo\n") + write(buffer, " if $v1_lo==$v1_hi\n") + write(buffer, " $OUT_cv $eq $v1_cv^$POW\n") + write(buffer, " $OUT_cc $eq $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq $v1_cv^$POW\n") + write(buffer, " $OUT_cc $eq ($v1_lo^$POW*($v1_hi - $v1_cv) + $v1_hi^$POW*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, "\n") + if POW==3 + write(buffer, " # We know inflection points algebraically\n") + write(buffer, " xk_cv = min(-0.5*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.5*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==5 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.6058295861882683*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.6058295861882683*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==7 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.6703320476030968*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.6703320476030968*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==9 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7145377271673349*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7145377271673349*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==11 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7470540748651559*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7470540748651559*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==13 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7721416355234655*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7721416355234655*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==15 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.7921778546056709*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.7921778546056709*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==17 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8086048978723027*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8086048978723027*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==19 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8223534102385287*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8223534102385287*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==21 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8340533675507736*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8340533675507736*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==23 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8441478047418446*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8441478047418446*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==25 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8529581643906964*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8529581643906964*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==27 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8607238145679608*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8607238145679608*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==29 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8676269762720762*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8676269762720762*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==31 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8738090154215446*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8738090154215446*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==33 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8793814183583145*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8793814183583145*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==35 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8844333818207290*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8844333818207290*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==37 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8890371830149935*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8890371830149935*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==39 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8932520563312301*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8932520563312301*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==41 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.8971270424799359*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.8971270424799359*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==43 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9007031161732270*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9007031161732270*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==45 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9040147980608216*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9040147980608216*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==47 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9070913919345662*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9070913919345662*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + elseif POW==49 + write(buffer, " # We know inflection points analytically\n") + write(buffer, " xk_cv = min(-0.9099579456198456*$v1_lo, $v1_hi)\n") + write(buffer, " xk_cc = max(-0.9099579456198456*$v1_hi, $v1_lo)\n") + write(buffer, "\n") + else + write(buffer, " # Apply Newton/golden section methods for the convex part,\n") + write(buffer, " # to get x_cv (the inflection point for the convex relaxation)\n") + write(buffer, " dfk = 0.0\n") + write(buffer, " xk_cv = max(0.0, $v1_hi)\n") + write(buffer, " fk = (xk_cv^$POW - $v1_lo^$POW) - (xk_cv-$v1_lo)*$POW*(xk_cv^$(POW-1))\n") + write(buffer, " flag = true\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " dfk = $(POW-1)*$POW*xk_cv^$(POW-2)*($v1_lo-xk_cv);\n") + write(buffer, " if abs(fk) < 1e-10\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cv\n") + write(buffer, " end\n") + write(buffer, " if iszero(dfk)\n") + write(buffer, " xk_cv = 0.0\n") + write(buffer, " break # Need to do golden section\n") + write(buffer, " end\n") + write(buffer, " if (xk_cv == 0.0) && (fk/dfk > 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cv\n") + write(buffer, " elseif (xk_cv == $v1_hi) && (fk/dfk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cv\n") + write(buffer, " end\n") + write(buffer, " xk_cv = max(0.0, min($v1_hi, xk_cv - fk/dfk))\n") + write(buffer, " fk = (xk_cv^$POW - $v1_lo^$POW) - (xk_cv-$v1_lo)*$POW*(xk_cv^$(POW-1))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead\n") + write(buffer, " if flag\n") + write(buffer, " a_golden = $v1_lo\n") + write(buffer, " fa_golden = (a_golden^$POW - $v1_lo^$POW) - (a_golden-$v1_lo)*$POW*(a_golden^$(POW-1))\n") + write(buffer, " c_golden = $v1_hi\n") + write(buffer, " fc_golden = (c_golden^$POW - $v1_lo^$POW) - (c_golden-$v1_lo)*$POW*(c_golden^$(POW-1))\n") + write(buffer, "\n") + write(buffer, " if fa_golden*fc_golden > 0\n") + write(buffer, " xk_cv = NaN\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " b_golden = $v1_hi - (2.0 - Base.MathConstants.golden)*($v1_hi - $v1_lo)\n") + write(buffer, " fb_golden = (b_golden^$POW - $v1_lo^$POW) - (b_golden-$v1_lo)*$POW*(b_golden^$(POW-1))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_golden - b_golden > b_golden - a_golden)\n") + write(buffer, " x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = (x_golden^$POW - $v1_lo^$POW) - (x_golden-$v1_lo)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fx_golden < 0.0\n") + write(buffer, " c_golden = x_golden\n") + write(buffer, " fc_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = b_golden\n") + write(buffer, " fa_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cv = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = (x_golden^$POW - $v1_lo^$POW) - (x_golden-$v1_lo)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fb_golden < 0.0\n") + write(buffer, " c_golden = b_golden\n") + write(buffer, " fc_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = x_golden\n") + write(buffer, " fa_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Apply Newton/golden section methods for the concave part,\n") + write(buffer, " # to get x_cc (the inflection point for the concave relaxation)\n") + write(buffer, " dfk = 0.0\n") + write(buffer, " xk_cc = $v1_lo\n") + write(buffer, " fk = ($v1_hi^$POW-xk_cc^$POW) - ($v1_hi-xk_cc)*$POW*(xk_cc^$(POW-1))\n") + write(buffer, " flag = true\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " dfk = $(POW-1)*$POW*xk_cc^$(POW-2)*(xk_cc-$v1_hi);\n") + write(buffer, " if abs(fk) < 1e-10\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cc\n") + write(buffer, " end\n") + write(buffer, " if iszero(dfk)\n") + write(buffer, " xk_cc = 0.0\n") + write(buffer, " break # Need to do golden section\n") + write(buffer, " end\n") + write(buffer, " if (xk_cc == $v1_lo) && (fk/dfk > 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cc\n") + write(buffer, " elseif (xk_cc == 0.0) && (fk/dfk < 0.0)\n") + write(buffer, " flag = false\n") + write(buffer, " break # use xk_cc\n") + write(buffer, " end\n") + write(buffer, " xk_cc = max($v1_lo, min(0.0, xk_cc - fk/dfk))\n") + write(buffer, " fk = ($v1_hi^$POW-xk_cc^$POW) - ($v1_hi-xk_cc)*$POW*(xk_cc^$(POW-1))\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # If flag, we need to do golden section instead\n") + write(buffer, " if flag\n") + write(buffer, " a_golden = $v1_lo\n") + write(buffer, " fa_golden = ($v1_hi^$POW-$v1_lo^$POW) - ($v1_hi-$v1_lo)*$POW*($v1_lo^$(POW-1))\n") + write(buffer, " c_golden = $v1_hi\n") + write(buffer, " fc_golden = 0.0\n") + write(buffer, "\n") + write(buffer, " if fa_golden*fc_golden > 0\n") + write(buffer, " xk_cc = NaN\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " b_golden = $v1_hi - (2.0 - Base.MathConstants.golden)*($v1_hi - $v1_lo)\n") + write(buffer, " fb_golden = ($v1_hi^$POW-b_golden^$POW) - ($v1_hi-b_golden)*$POW*(b_golden^$(POW-1))\n") + write(buffer, "\n") + write(buffer, " iter = Int32(1)\n") + write(buffer, " while iter <= Int32(100)\n") + write(buffer, " if (c_golden - b_golden > b_golden - a_golden)\n") + write(buffer, " x_golden = b_golden + (2.0 - Base.MathConstants.golden)*(c_golden - b_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = ($v1_hi^$POW-x_golden^$POW) - ($v1_hi-x_golden)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fx_golden < 0.0\n") + write(buffer, " c_golden = x_golden\n") + write(buffer, " fc_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = b_golden\n") + write(buffer, " fa_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " x_golden = b_golden - (2.0 - Base.MathConstants.golden)*(b_golden - a_golden)\n") + write(buffer, " if abs(c_golden-a_golden) < 1.0e-10*(abs(b_golden) + abs(x_golden)) || iter == Int32(100)\n") + write(buffer, " xk_cc = (c_golden + a_golden)/2.0\n") + write(buffer, " break\n") + write(buffer, " end\n") + write(buffer, " iter += Int32(1)\n") + write(buffer, " fx_golden = ($v1_hi^$POW-x_golden^$POW) - ($v1_hi-x_golden)*$POW*(x_golden^$(POW-1))\n") + write(buffer, " if fa_golden*fb_golden < 0.0\n") + write(buffer, " c_golden = b_golden\n") + write(buffer, " fc_golden = fb_golden\n") + write(buffer, " b_golden = x_golden\n") + write(buffer, " fb_golden = fx_golden\n") + write(buffer, " else\n") + write(buffer, " a_golden = x_golden\n") + write(buffer, " fa_golden = fx_golden\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + write(buffer, " # Now we have the inflection points, so we either\n") + write(buffer, " # look at the line segment or the function itself\n") + write(buffer, " if ($v1_cv <= xk_cv) && ($v1_lo != xk_cv) # cv uses line segment\n") + write(buffer, " $OUT_cv $eq ($v1_lo^$POW*(xk_cv - $v1_cv) + xk_cv^$POW*($v1_cv - $v1_lo))/(xk_cv - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (xk_cv^$POW - $v1_lo^$POW)/(xk_cv - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else # cv uses the function itself\n") + write(buffer, " $OUT_cv $eq $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Now do the cc side\n") + write(buffer, " if ($v1_cv > xk_cc) && ($v1_hi != xk_cc)\n") + write(buffer, " $OUT_cc $eq (xk_cc^$POW*($v1_hi - $v1_cv) + $v1_hi^$POW*($v1_cv - xk_cc))/($v1_hi - xk_cc)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi^$POW - xk_cc^$POW)/($v1_hi - xk_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv $eq $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc $eq $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + end + return String(take!(buffer)) +end + +# Positive floating-point powers +# max threads: ??? +function SCMC_float_power_kernel(OUT::String, v1::String, POW::T, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) where T<:Real + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + if startswith(v1, r"aux|temp") + if POW==0.5 + write(buffer, " #################\n") + write(buffer, " ## Square Root ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + else + L = length(string(POW)) + write(buffer, " ###################$("#"^L)####\n") + write(buffer, " ## Floating Power ($POW) ##\n") + write(buffer, " ###################$("#"^L)####\n") + write(buffer, "\n") + end + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " if $v1_lo < 0.0\n") + write(buffer, " $OUT_lo = NaN\n") + write(buffer, " $OUT_hi = NaN\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cc >= $v1_cv\n") + write(buffer, " if $v1_cv == $v1_cc\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_cv >= $v1_hi\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " midcv = $v1_cc \n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo \n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cc\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cc \n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " midcv = $v1_cc \n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cc \n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo \n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cc \n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_cv >= $v1_lo\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_hi \n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " elseif $v1_lo >= $v1_cc\n") + write(buffer, " midcv = $v1_cc \n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_hi \n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo \n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_hi \n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi >= $v1_cv\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " midcv = $v1_cc \n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo \n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cv \n") + write(buffer, " cc_id = Int32(2)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_cc >= $v1_hi\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_cc \n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " midcv = $v1_cc \n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_cc \n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo \n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_cc \n") + write(buffer, " cc_id = Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v1_lo >= $v1_cv\n") + write(buffer, " midcv = $v1_cv \n") + write(buffer, " cv_id = Int32(2)\n") + write(buffer, " midcc = $v1_hi \n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " elseif $v1_cc >= $v1_lo\n") + write(buffer, " midcv = $v1_cc \n") + write(buffer, " cv_id = Int32(1)\n") + write(buffer, " midcc = $v1_hi \n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " else\n") + write(buffer, " midcv = $v1_lo \n") + write(buffer, " cv_id = Int32(3)\n") + write(buffer, " midcc = $v1_hi \n") + write(buffer, " cc_id = Int32(3)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $v1_lo == $v1_hi\n") + if POW==0.5 + write(buffer, " $OUT_lo = sqrt($v1_lo)\n") + write(buffer, " $OUT_hi = sqrt($v1_hi)\n") + write(buffer, " $OUT_cv = sqrt($v1_cv)\n") + write(buffer, " $OUT_cc = sqrt($v1_cc)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * 0.5 / sqrt($v1_cv)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * 0.5 / sqrt($v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * 0.5 / sqrt($v1_cc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * 0.5 / sqrt($v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * 0.5 / sqrt($v1_cv)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * 0.5 / sqrt($v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * 0.5 / sqrt($v1_cc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * 0.5 / sqrt($v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * 0.5 / sqrt($v1_cv)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * 0.5 / sqrt($v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * 0.5 / sqrt($v1_cc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * 0.5 / sqrt($v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_lo = $v1_lo^$POW\n") + write(buffer, " $OUT_hi = $v1_hi^$POW\n") + write(buffer, " $OUT_cv = $v1_cv^$POW\n") + write(buffer, " $OUT_cc = $v1_cc^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * $POW*$v1_cv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * $POW*$v1_cc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * $POW*$v1_cc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * $POW*$v1_cv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * $POW*$v1_cc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * $POW*$v1_cc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * $POW*$v1_cv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * $POW*$v1_cc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * $POW*$v1_cc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + end + write(buffer, " else\n") + if POW==0.5 + write(buffer, " $OUT_lo = sqrt($v1_lo)\n") + write(buffer, " $OUT_hi = sqrt($v1_hi)\n") + write(buffer, " $OUT_cv = (sqrt($v1_lo)*($v1_hi - midcv) + sqrt($v1_hi)*(midcv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc = sqrt(midcc)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * 0.5 / sqrt(midcc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * 0.5 / sqrt(midcc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * 0.5 / sqrt(midcc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * 0.5 / sqrt(midcc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * 0.5 / sqrt(midcc)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * 0.5 / sqrt(midcc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + elseif POW < 1.0 + write(buffer, " $OUT_lo = $v1_lo^$POW\n") + write(buffer, " $OUT_hi = $v1_hi^$POW\n") + write(buffer, " $OUT_cv = ($v1_lo^$POW*($v1_hi - midcv) + $v1_hi^$POW*(midcv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc = midcc^$POW\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * $POW*midcc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_lo = $v1_lo^$POW\n") + write(buffer, " $OUT_hi = $v1_hi^$POW\n") + write(buffer, " $OUT_cv = midcv^$POW\n") + write(buffer, " $OUT_cc = ($v1_lo^$POW*($v1_hi - midcc) + $v1_hi^$POW*(midcc - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if cv_id==Int32(1)\n") + write(buffer, " $OUT_cvgrad = $v1_ccgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " elseif cv_id==Int32(2)\n") + write(buffer, " $OUT_cvgrad = $v1_cvgrad * $POW*midcv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " end\n") + write(buffer, " if cc_id==Int32(1)\n") + write(buffer, " $OUT_ccgrad = $v1_ccgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " elseif cc_id==Int32(2)\n") + write(buffer, " $OUT_ccgrad = $v1_cvgrad * ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + end + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv $eq $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc $eq $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + if POW==0.5 + write(buffer, " #################\n") + write(buffer, " ## Square Root ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + else + L = length(string(POW)) + write(buffer, " ###################$("#"^L)####\n") + write(buffer, " ## Floating Power ($POW) ##\n") + write(buffer, " ###################$("#"^L)####\n") + write(buffer, "\n") + end + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " if $v1_lo < 0.0\n") + write(buffer, " $OUT_lo = NaN\n") + write(buffer, " $OUT_hi = NaN\n") + write(buffer, " $OUT_cv = NaN\n") + write(buffer, " $OUT_cc = NaN\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = NaN\n") + write(buffer, " $OUT_ccgrad = NaN\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_lo == $v1_hi\n") + if POW==0.5 + write(buffer, " $OUT_lo = sqrt($v1_lo)\n") + write(buffer, " $OUT_hi = sqrt($v1_hi)\n") + write(buffer, " $OUT_cv = sqrt($v1_cv)\n") + write(buffer, " $OUT_cc = sqrt($v1_cc)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = 0.5 / sqrt($v1_cv)\n") + write(buffer, " $OUT_ccgrad = 0.5 / sqrt($v1_cc)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_lo = $v1_lo^$POW\n") + write(buffer, " $OUT_hi = $v1_hi^$POW\n") + write(buffer, " $OUT_cv = $v1_cv^$POW\n") + write(buffer, " $OUT_cc = $v1_cc^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad = $POW*$v1_cc^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + end + write(buffer, " else\n") + if POW==0.5 + write(buffer, " $OUT_lo = sqrt($v1_lo)\n") + write(buffer, " $OUT_hi = sqrt($v1_hi)\n") + write(buffer, " $OUT_cv = (sqrt($v1_lo)*($v1_hi - $v1_cv) + sqrt($v1_hi)*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc = sqrt($v1_cv)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = (sqrt($v1_hi) - sqrt($v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad = 0.5 / sqrt($v1_cv)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + elseif POW < 1.0 + write(buffer, " $OUT_lo = $v1_lo^$POW\n") + write(buffer, " $OUT_hi = $v1_hi^$POW\n") + write(buffer, " $OUT_cv = ($v1_lo^$POW*($v1_hi - $v1_cv) + $v1_hi^$POW*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_cc = $v1_cv^$POW\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " $OUT_ccgrad = $POW*$v1_cv^$(POW-1)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_lo = $v1_lo^$POW\n") + write(buffer, " $OUT_hi = $v1_hi^$POW\n") + write(buffer, " $OUT_cv = $v1_cv^$POW\n") + write(buffer, " $OUT_cc = ($v1_lo^$POW*($v1_hi - $v1_cv) + $v1_hi^$POW*($v1_cv - $v1_lo))/($v1_hi - $v1_lo)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad = $POW*$v1_cv^$(POW-1)\n") + write(buffer, " $OUT_ccgrad = ($v1_hi^$POW - $v1_lo^$POW)/($v1_hi - $v1_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + end + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv $eq $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc $eq $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + +#= +Binary Rules +=# +# Multiplication of two variables +# max threads: 384 +function SCMC_mult_kernel(OUT::String, v1::String, v2::String, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(v2, "temp") + v2_cv = "$(v2)_cv" + v2_cc = "$(v2)_cc" + v2_lo = "$(v2)_lo" + v2_hi = "$(v2)_hi" + v2_cvgrad = "$(v2)_cvgrad[col]" + v2_ccgrad = "$(v2)_ccgrad[col]" + elseif startswith(v2, "aux") + v2_cv = "$(v2)[idx,1]" + v2_cc = "$(v2)[idx,2]" + v2_lo = "$(v2)[idx,3]" + v2_hi = "$(v2)[idx,4]" + v2_cvgrad = "$(v2)[idx,end-2*colmax+col]" + v2_ccgrad = "$(v2)[idx,end-1*colmax+col]" + else + v2_cv = "$(v2)[idx,1]" + v2_cc = "$(v2)[idx,1]" + v2_lo = "$(v2)[idx,2]" + v2_hi = "$(v2)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + + if (startswith(v1, r"aux|temp") && startswith(v2, r"aux|temp")) + write(buffer, " #####################################\n") + write(buffer, " ## Multiplication of Two Variables ##\n") + write(buffer, " #####################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo >= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad + $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad + $v1_lo*$v2_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad + $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad + $v1_hi*$v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_hi\n") + write(buffer, " t1_cv_left = (-$v2_hi)*$v1_cc + $v1_hi*(-$v2_cv) - $v1_hi*(-$v2_hi)\n") + write(buffer, " t1_cv_right = (-$v2_lo)*$v1_cc + $v1_lo*(-$v2_cv) - $v1_lo*(-$v2_lo)\n") + write(buffer, " t1_cc_left = (-$v2_lo)*$v1_cv + $v1_hi*(-$v2_cc) - $v1_hi*(-$v2_lo)\n") + write(buffer, " t1_cc_right = (-$v2_hi)*$v1_cv + $v1_lo*(-$v2_cc) - $v1_lo*(-$v2_hi)\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad + $v1_hi*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad + $v1_hi*(-$v2_cvgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad + $v1_hi*(-$v2_cvgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad + $v1_lo*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad + $v1_lo*(-$v2_cvgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad + $v1_lo*(-$v2_cvgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad + $v1_hi*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad + $v1_hi*(-$v2_ccgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad + $v1_hi*(-$v2_ccgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad + $v1_lo*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad + $v1_lo*(-$v2_ccgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad + $v1_lo*(-$v2_ccgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo*$v2_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi*$v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cv) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cc) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad) + (-$v1_lo)*$v2_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi)*$v2_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad) + (-$v1_lo)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad) + (-$v1_lo)*$v2_cvgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad) + (-$v1_lo)*$v2_cvgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_hi)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_hi)*$v2_cvgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_hi)*$v2_cvgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_lo\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad) + (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad) + (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad) + (-$v1_lo)*(-$v2_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad) + (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad) + (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad) + (-$v1_hi)*(-$v2_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad) + (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad) + (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad) + (-$v1_lo)*(-$v2_cvgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad) + (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad) + (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad) + (-$v1_hi)*(-$v2_cvgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cc) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cv) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_lo)*$v2_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi)*$v2_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo)*($v2_cvgrad) + ($v2_hi)*(-$v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo)*($v2_cvgrad) + ($v2_hi)*(-$v1_ccgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo)*($v2_cvgrad) + ($v2_hi)*(-$v1_ccgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi)*($v2_cvgrad) + ($v2_lo)*(-$v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi)*($v2_cvgrad) + ($v2_lo)*(-$v1_cvgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi)*($v2_cvgrad) + ($v2_lo)*(-$v1_cvgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v1_hi*$v2_cv + $v2_hi*$v1_cv - $v2_hi*$v1_hi\n") + write(buffer, " t1_cv_right = $v1_lo*$v2_cc + $v2_lo*$v1_cv - $v2_lo*$v1_lo\n") + write(buffer, " t1_cc_left = $v1_lo*$v2_cv + $v2_hi*$v1_cc - $v2_hi*$v1_lo\n") + write(buffer, " t1_cc_right = $v1_hi*$v2_cc + $v2_lo*$v1_cc - $v2_lo*$v1_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad) + ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad) + ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad) + ($v2_hi)*($v1_cvgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad) + ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad) + ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad) + ($v2_lo)*($v1_cvgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad) + ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad) + ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad) + ($v2_hi)*($v1_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad) + ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad) + ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad) + ($v2_lo)*($v1_ccgrad)\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v1_lo*(-$v2_cc) + (-$v2_lo)*$v1_cc - (-$v2_lo)*$v1_lo\n") + write(buffer, " t1_cv_right = $v1_hi*(-$v2_cv) + (-$v2_hi)*$v1_cc - (-$v2_hi)*$v1_hi\n") + write(buffer, " t1_cc_left = $v1_hi*(-$v2_cc) + (-$v2_lo)*$v1_cv - (-$v2_lo)*$v1_hi\n") + write(buffer, " t1_cc_right = $v1_lo*(-$v2_cv) + (-$v2_hi)*$v1_cv - (-$v2_hi)*$v1_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-$v2_ccgrad) + (-$v2_lo)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-$v2_ccgrad) + (-$v2_lo)*($v1_ccgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-$v2_ccgrad) + (-$v2_lo)*($v1_ccgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-$v2_cvgrad) + (-$v2_hi)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-$v2_cvgrad) + (-$v2_hi)*($v1_ccgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-$v2_cvgrad) + (-$v2_hi)*($v1_ccgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-$v2_ccgrad) + (-$v2_lo)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-$v2_ccgrad) + (-$v2_lo)*($v1_cvgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-$v2_ccgrad) + (-$v2_lo)*($v1_cvgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-$v2_cvgrad) + (-$v2_hi)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-$v2_cvgrad) + (-$v2_hi)*($v1_cvgrad))\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-$v2_cvgrad) + (-$v2_hi)*($v1_cvgrad))\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq min($v1_lo*$v2_hi, $v1_hi*$v2_lo)\n") + write(buffer, " $OUT_hi $eq max($v1_lo*$v2_lo, $v1_hi*$v2_hi)\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi*$v2_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo*$v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi*$v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo*$v2_cvgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + elseif (startswith(v1, r"aux|temp") && !startswith(v2, r"aux|temp")) + ID = findfirst(==(v2), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " #####################################\n") + write(buffer, " ## Multiplication of Two Variables ##\n") + write(buffer, " #####################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo >= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_hi\n") + write(buffer, " t1_cv_left = (-$v2_hi)*$v1_cc + $v1_hi*(-$v2_cv) - $v1_hi*(-$v2_hi)\n") + write(buffer, " t1_cv_right = (-$v2_lo)*$v1_cc + $v1_lo*(-$v2_cv) - $v1_lo*(-$v2_lo)\n") + write(buffer, " t1_cc_left = (-$v2_lo)*$v1_cv + $v1_hi*(-$v2_cc) - $v1_hi*(-$v2_lo)\n") + write(buffer, " t1_cc_right = (-$v2_hi)*$v1_cv + $v1_lo*(-$v2_cc) - $v1_lo*(-$v2_hi)\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad + $v1_hi*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad + $v1_hi*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad + $v1_hi*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi)*$v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad + $v1_lo*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad + $v1_lo*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad + $v1_lo*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo)*$v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad + $v1_hi*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad + $v1_hi*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad + $v1_hi*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo)*$v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad + $v1_lo*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad + $v1_lo*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad + $v1_lo*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi)*$v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cv) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cc) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_cvgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-$v1_ccgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-$v1_ccgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_lo\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad) + (-$v1_lo)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad) + (-$v1_lo)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad) + (-$v1_lo)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad) + (-$v1_hi)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad) + (-$v1_hi)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad) + (-$v1_hi)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad) + (-$v1_lo)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad) + (-$v1_lo)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad) + (-$v1_lo)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad) + (-$v1_hi)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad) + (-$v1_hi)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad) + (-$v1_hi)*(-1.0)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cc) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cv) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad) + (-$v1_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-$v1_ccgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad) + (-$v1_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-$v1_cvgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo) + ($v2_hi)*(-$v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo) + ($v2_hi)*(-$v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo) + ($v2_hi)*(-$v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi)*(-$v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi) + ($v2_lo)*(-$v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi) + ($v2_lo)*(-$v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi) + ($v2_lo)*(-$v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo)*(-$v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v1_hi*$v2_cv + $v2_hi*$v1_cv - $v2_hi*$v1_hi\n") + write(buffer, " t1_cv_right = $v1_lo*$v2_cc + $v2_lo*$v1_cv - $v2_lo*$v1_lo\n") + write(buffer, " t1_cc_left = $v1_lo*$v2_cv + $v2_hi*$v1_cc - $v2_hi*$v1_lo\n") + write(buffer, " t1_cc_right = $v1_hi*$v2_cc + $v2_lo*$v1_cc - $v2_lo*$v1_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi) + ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi) + ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi) + ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo) + ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo) + ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo) + ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo) + ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo) + ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo) + ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi) + ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi) + ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi) + ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v1_lo*(-$v2_cc) + (-$v2_lo)*$v1_cc - (-$v2_lo)*$v1_lo\n") + write(buffer, " t1_cv_right = $v1_hi*(-$v2_cv) + (-$v2_hi)*$v1_cc - (-$v2_hi)*$v1_hi\n") + write(buffer, " t1_cc_left = $v1_hi*(-$v2_cc) + (-$v2_lo)*$v1_cv - (-$v2_lo)*$v1_hi\n") + write(buffer, " t1_cc_right = $v1_lo*(-$v2_cv) + (-$v2_hi)*$v1_cv - (-$v2_hi)*$v1_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-1.0) + (-$v2_lo)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(-$v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-1.0) + (-$v2_lo)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(-$v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-1.0) + (-$v2_lo)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(-$v2_lo)*($v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-1.0) + (-$v2_hi)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(-$v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-1.0) + (-$v2_hi)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(-$v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-1.0) + (-$v2_hi)*($v1_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -(-$v2_hi)*($v1_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-1.0) + (-$v2_lo)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(-$v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-1.0) + (-$v2_lo)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(-$v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-1.0) + (-$v2_lo)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(-$v2_lo)*($v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-1.0) + (-$v2_hi)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(-$v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-1.0) + (-$v2_hi)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(-$v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-1.0) + (-$v2_hi)*($v1_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -(-$v2_hi)*($v1_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq min($v1_lo*$v2_hi, $v1_hi*$v2_lo)\n") + write(buffer, " $OUT_hi $eq max($v1_lo*$v2_lo, $v1_hi*$v2_hi)\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi*$v1_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo*$v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad + $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo*$v1_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad + $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi*$v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + elseif (!startswith(v1, r"aux|temp") && startswith(v2, r"aux|temp")) + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " #####################################\n") + write(buffer, " ## Multiplication of Two Variables ##\n") + write(buffer, " #####################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo >= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_hi\n") + write(buffer, " t1_cv_left = (-$v2_hi)*$v1_cc + $v1_hi*(-$v2_cv) - $v1_hi*(-$v2_hi)\n") + write(buffer, " t1_cv_right = (-$v2_lo)*$v1_cc + $v1_lo*(-$v2_cv) - $v1_lo*(-$v2_lo)\n") + write(buffer, " t1_cc_left = (-$v2_lo)*$v1_cv + $v1_hi*(-$v2_cc) - $v1_hi*(-$v2_lo)\n") + write(buffer, " t1_cc_right = (-$v2_hi)*$v1_cv + $v1_lo*(-$v2_cc) - $v1_lo*(-$v2_hi)\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi) + $v1_hi*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_hi*(-$v2_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi) + $v1_hi*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_hi*(-$v2_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_hi) + $v1_hi*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_hi*(-$v2_cvgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo) + $v1_lo*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_lo*(-$v2_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo) + $v1_lo*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_lo*(-$v2_cvgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -((-$v2_lo) + $v1_lo*(-$v2_cvgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_lo*(-$v2_cvgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo) + $v1_hi*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_hi*(-$v2_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo) + $v1_hi*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_hi*(-$v2_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_lo) + $v1_hi*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_hi*(-$v2_ccgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi) + $v1_lo*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_lo*(-$v2_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi) + $v1_lo*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_lo*(-$v2_ccgrad))\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v2_hi) + $v1_lo*(-$v2_ccgrad))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_lo*(-$v2_ccgrad))\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cv) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cc) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-1.0) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-1.0) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-1.0) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-1.0) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-1.0) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-1.0) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-1.0) + (-$v1_lo)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-1.0) + (-$v1_lo)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_hi*(-1.0) + (-$v1_lo)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-1.0) + (-$v1_hi)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-1.0) + (-$v1_hi)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -($v2_lo*(-1.0) + (-$v1_hi)*$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_lo\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-1.0) + (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-1.0) + (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_lo)*(-1.0) + (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-1.0) + (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-1.0) + (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq (-$v2_hi)*(-1.0) + (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq (-$v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-1.0) + (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-1.0) + (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_hi)*(-1.0) + (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-1.0) + (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-1.0) + (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq (-$v2_lo)*(-1.0) + (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq (-$v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cc) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cv) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-1.0) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-1.0) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_lo*(-1.0) + (-$v1_lo)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-1.0) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-1.0) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -($v2_hi*(-1.0) + (-$v1_hi)*$v2_ccgrad)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo)*($v2_cvgrad) + ($v2_hi)*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo)*($v2_cvgrad) + ($v2_hi)*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_lo)*($v2_cvgrad) + ($v2_hi)*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi)*($v2_cvgrad) + ($v2_lo)*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi)*($v2_cvgrad) + ($v2_lo)*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -((-$v1_hi)*($v2_cvgrad) + ($v2_lo)*(-1.0))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v1_hi*$v2_cv + $v2_hi*$v1_cv - $v2_hi*$v1_hi\n") + write(buffer, " t1_cv_right = $v1_lo*$v2_cc + $v2_lo*$v1_cv - $v2_lo*$v1_lo\n") + write(buffer, " t1_cc_left = $v1_lo*$v2_cv + $v2_hi*$v1_cc - $v2_hi*$v1_lo\n") + write(buffer, " t1_cc_right = $v1_hi*$v2_cc + $v2_lo*$v1_cc - $v2_lo*$v1_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad) + ($v2_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad) + ($v2_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad) + ($v2_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_hi)*($v2_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad) + ($v2_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad) + ($v2_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad) + ($v2_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq ($v1_lo)*($v2_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad) + ($v2_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad) + ($v2_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad) + ($v2_hi)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_lo)*($v2_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad) + ($v2_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad) + ($v2_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad) + ($v2_lo)\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq ($v1_hi)*($v2_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v1_lo*(-$v2_cc) + (-$v2_lo)*$v1_cc - (-$v2_lo)*$v1_lo\n") + write(buffer, " t1_cv_right = $v1_hi*(-$v2_cv) + (-$v2_hi)*$v1_cc - (-$v2_hi)*$v1_hi\n") + write(buffer, " t1_cc_left = $v1_hi*(-$v2_cc) + (-$v2_lo)*$v1_cv - (-$v2_lo)*$v1_hi\n") + write(buffer, " t1_cc_right = $v1_lo*(-$v2_cv) + (-$v2_hi)*$v1_cv - (-$v2_hi)*$v1_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-$v2_ccgrad) + (-$v2_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-$v2_ccgrad) + (-$v2_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_lo)*(-$v2_ccgrad) + (-$v2_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_lo)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-$v2_cvgrad) + (-$v2_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-$v2_cvgrad) + (-$v2_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq -(($v1_hi)*(-$v2_cvgrad) + (-$v2_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq -($v1_hi)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-$v2_ccgrad) + (-$v2_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-$v2_ccgrad) + (-$v2_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_hi)*(-$v2_ccgrad) + (-$v2_lo))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_hi)*(-$v2_ccgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-$v2_cvgrad) + (-$v2_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-$v2_cvgrad) + (-$v2_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq -(($v1_lo)*(-$v2_cvgrad) + (-$v2_hi))\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq -($v1_lo)*(-$v2_cvgrad)\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq min($v1_lo*$v2_hi, $v1_hi*$v2_lo)\n") + write(buffer, " $OUT_hi $eq max($v1_lo*$v2_lo, $v1_hi*$v2_hi)\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi + $v1_hi*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo + $v1_lo*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo + $v1_hi*$v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi*$v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi + $v1_lo*$v2_cvgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo*$v2_cvgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID1 = findfirst(==(v1), varlist) + ID2 = findfirst(==(v2), varlist) + (ID1 == ID2) && error("Multiplying same variable") + isnothing(ID1) && error("Empty varlist") + isnothing(ID2) && error("Empty varlist") + write(buffer, " #####################################\n") + write(buffer, " ## Multiplication of Two Variables ##\n") + write(buffer, " #####################################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " if $v1_lo >= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_hi\n") + write(buffer, " t1_cv_left = (-$v2_hi)*$v1_cc + $v1_hi*(-$v2_cv) - $v1_hi*(-$v2_hi)\n") + write(buffer, " t1_cv_right = (-$v2_lo)*$v1_cc + $v1_lo*(-$v2_cv) - $v1_lo*(-$v2_lo)\n") + write(buffer, " t1_cc_left = (-$v2_lo)*$v1_cv + $v1_hi*(-$v2_cc) - $v1_hi*(-$v2_lo)\n") + write(buffer, " t1_cc_right = (-$v2_hi)*$v1_cv + $v1_lo*(-$v2_cc) - $v1_lo*(-$v2_hi)\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v1_hi <= 0.0\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cv) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cc) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*$v1_cc + $v1_hi*$v2_cc - $v1_hi*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*$v1_cv + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_lo\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v2_lo*(-$v1_cc) + (-$v1_lo)*$v2_cc - (-$v1_lo)*$v2_lo\n") + write(buffer, " t1_cv_right = $v2_hi*(-$v1_cv) + (-$v1_hi)*$v2_cc - (-$v1_hi)*$v2_hi\n") + write(buffer, " t1_cc_left = $v2_hi*(-$v1_cc) + (-$v1_lo)*$v2_cv - (-$v1_lo)*$v2_hi\n") + write(buffer, " t1_cc_right = $v2_lo*(-$v1_cv) + (-$v1_hi)*$v2_cv - (-$v1_hi)*$v2_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " if $v2_lo >= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_lo*$v2_hi\n") + write(buffer, " $OUT_hi $eq $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_left = $v1_hi*$v2_cv + $v2_hi*$v1_cv - $v2_hi*$v1_hi\n") + write(buffer, " t1_cv_right = $v1_lo*$v2_cc + $v2_lo*$v1_cv - $v2_lo*$v1_lo\n") + write(buffer, " t1_cc_left = $v1_lo*$v2_cv + $v2_hi*$v1_cc - $v2_hi*$v1_lo\n") + write(buffer, " t1_cc_right = $v1_hi*$v2_cc + $v2_lo*$v1_cc - $v2_lo*$v1_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " elseif $v2_hi <= 0.0\n") + write(buffer, " $OUT_lo $eq $v1_hi*$v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_lo*$v2_lo\n") + write(buffer, " t1_cv_left = $v1_lo*(-$v2_cc) + (-$v2_lo)*$v1_cc - (-$v2_lo)*$v1_lo\n") + write(buffer, " t1_cv_right = $v1_hi*(-$v2_cv) + (-$v2_hi)*$v1_cc - (-$v2_hi)*$v1_hi\n") + write(buffer, " t1_cc_left = $v1_hi*(-$v2_cc) + (-$v2_lo)*$v1_cv - (-$v2_lo)*$v1_hi\n") + write(buffer, " t1_cc_right = $v1_lo*(-$v2_cv) + (-$v2_hi)*$v1_cv - (-$v2_hi)*$v1_lo\n") + write(buffer, " if t1_cv_left < t1_cv_right\n") + write(buffer, " $OUT_cv $eq -t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq -t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left > t1_cc_right\n") + write(buffer, " $OUT_cc $eq -t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq -t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_lo $eq min($v1_lo*$v2_hi, $v1_hi*$v2_lo)\n") + write(buffer, " $OUT_hi $eq max($v1_lo*$v2_lo, $v1_hi*$v2_hi)\n") + write(buffer, " t1_cv_left = $v2_hi*$v1_cv + $v1_hi*$v2_cv - $v1_hi*$v2_hi\n") + write(buffer, " t1_cv_right = $v2_lo*$v1_cc + $v1_lo*$v2_cc - $v1_lo*$v2_lo\n") + write(buffer, " t1_cc_left = $v2_lo*$v1_cv + $v1_hi*$v2_cc - $v1_hi*$v2_lo\n") + write(buffer, " t1_cc_right = $v2_hi*$v1_cc + $v1_lo*$v2_cv - $v1_lo*$v2_hi\n") + write(buffer, " if t1_cv_left > t1_cv_right\n") + write(buffer, " $OUT_cv $eq t1_cv_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cv $eq t1_cv_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " if t1_cc_left < t1_cc_right\n") + write(buffer, " $OUT_cc $eq t1_cc_left\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_lo\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_hi\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cc $eq t1_cc_right\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_ccgrad $eq $v2_hi\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_ccgrad $eq $v1_lo\n") + write(buffer, " else\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + +# Addition of two variables +# max threads: 1024 +function SCMC_add_kernel(OUT::String, v1::String, v2::String, varlist::Vector{String}, sparsity::Vector{Int}; sum_output::Bool=false) + if sum_output + eq = "+=" + else + eq = "=" + end + + if startswith(v1, "temp") + v1_cv = "$(v1)_cv" + v1_cc = "$(v1)_cc" + v1_lo = "$(v1)_lo" + v1_hi = "$(v1)_hi" + v1_cvgrad = "$(v1)_cvgrad[col]" + v1_ccgrad = "$(v1)_ccgrad[col]" + elseif startswith(v1, "aux") + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,2]" + v1_lo = "$(v1)[idx,3]" + v1_hi = "$(v1)[idx,4]" + v1_cvgrad = "$(v1)[idx,end-2*colmax+col]" + v1_ccgrad = "$(v1)[idx,end-1*colmax+col]" + else + v1_cv = "$(v1)[idx,1]" + v1_cc = "$(v1)[idx,1]" + v1_lo = "$(v1)[idx,2]" + v1_hi = "$(v1)[idx,3]" + end + if startswith(v2, "temp") + v2_cv = "$(v2)_cv" + v2_cc = "$(v2)_cc" + v2_lo = "$(v2)_lo" + v2_hi = "$(v2)_hi" + v2_cvgrad = "$(v2)_cvgrad[col]" + v2_ccgrad = "$(v2)_ccgrad[col]" + elseif startswith(v2, "aux") + v2_cv = "$(v2)[idx,1]" + v2_cc = "$(v2)[idx,2]" + v2_lo = "$(v2)[idx,3]" + v2_hi = "$(v2)[idx,4]" + v2_cvgrad = "$(v2)[idx,end-2*colmax+col]" + v2_ccgrad = "$(v2)[idx,end-1*colmax+col]" + else + v2_cv = "$(v2)[idx,1]" + v2_cc = "$(v2)[idx,1]" + v2_lo = "$(v2)[idx,2]" + v2_hi = "$(v2)[idx,3]" + end + if startswith(OUT, "temp") + OUT_cv = "$(OUT)_cv" + OUT_cc = "$(OUT)_cc" + OUT_lo = "$(OUT)_lo" + OUT_hi = "$(OUT)_hi" + OUT_cvgrad = "$(OUT)_cvgrad[col]" + OUT_ccgrad = "$(OUT)_ccgrad[col]" + else + OUT_cv = "$(OUT)[idx,1]" + OUT_cc = "$(OUT)[idx,2]" + OUT_lo = "$(OUT)[idx,3]" + OUT_hi = "$(OUT)[idx,4]" + OUT_cvgrad = "$(OUT)[idx,end-2*colmax+col]" + OUT_ccgrad = "$(OUT)[idx,end-1*colmax+col]" + end + + # Get the anti-sparsity list (elements NOT being used) + antisparsity = collect(1:length(varlist)) + antisparsity = antisparsity[antisparsity .∉ Ref(sparsity)] + + # Determine the sparsity case: + # 1) Use sparsity list + # 2) Use antisparsity list (because it's shorter than the sparsity list) + # 3) Don't use either, simply calculate all elements + if length(sparsity) <= length(antisparsity) + sparsity_case = 1 + sparsity_string = join(["col == Int32($(x))" for x in sparsity], " || ") + elseif length(antisparsity) > 0 + antisparsity_string = join(["col == Int32($(x))" for x in antisparsity], " || ") + sparsity_case = 2 + else + sparsity_case = 3 + end + + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write all the lines to the buffer + + + if (startswith(v1, r"aux|temp") && startswith(v2, r"aux|temp")) + write(buffer, " ###############################\n") + write(buffer, " ## Addition of Two Variables ##\n") + write(buffer, " ###############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_cv $eq $v1_cv + $v2_cv\n") + write(buffer, " $OUT_cc $eq $v1_cc + $v2_cc\n") + write(buffer, " $OUT_lo $eq $v1_lo + $v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi + $v2_hi\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad + $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad + $v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad + $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad + $v2_ccgrad\n") + write(buffer, " end\n") + else + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad + $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad + $v2_ccgrad\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + elseif (startswith(v1, r"aux|temp") && !startswith(v2, r"aux|temp")) + ID = findfirst(==(v2), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " ###############################\n") + write(buffer, " ## Addition of Two Variables ##\n") + write(buffer, " ###############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_cv $eq $v1_cv + $v2_cv\n") + write(buffer, " $OUT_cc $eq $v1_cc + $v2_cc\n") + write(buffer, " $OUT_lo $eq $v1_lo + $v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi + $v2_hi\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad + 1.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad + 1.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad + 1.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad + 1.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad + 1.0\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad + 1.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v1_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v1_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + elseif (!startswith(v1, r"aux|temp") && startswith(v2, r"aux|temp")) + ID = findfirst(==(v1), varlist) + isnothing(ID) && error("Empty varlist") + write(buffer, " ###############################\n") + write(buffer, " ## Addition of Two Variables ##\n") + write(buffer, " ###############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_cv $eq $v1_cv + $v2_cv\n") + write(buffer, " $OUT_cc $eq $v1_cc + $v2_cc\n") + write(buffer, " $OUT_lo $eq $v1_lo + $v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi + $v2_hi\n") + write(buffer, " while col <= colmax\n") + if sparsity_case == 1 + write(buffer, " if $sparsity_string\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq 1.0 + $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq 1.0 + $v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + elseif sparsity_case == 2 + write(buffer, " if $antisparsity_string\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " else\n") + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq 1.0 + $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq 1.0 + $v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v2_ccgrad\n") + write(buffer, " end\n") + write(buffer, " end\n") + else + write(buffer, " if col == Int32($ID)\n") + write(buffer, " $OUT_cvgrad $eq 1.0 + $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq 1.0 + $v2_ccgrad\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq $v2_cvgrad\n") + write(buffer, " $OUT_ccgrad $eq $v2_ccgrad\n") + write(buffer, " end\n") + end + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + else + ID1 = findfirst(==(v1), varlist) + ID2 = findfirst(==(v2), varlist) + (ID1 == ID2) && error("Adding same variable") + isnothing(ID1) && error("Empty varlist") + isnothing(ID2) && error("Empty varlist") + write(buffer, " ###############################\n") + write(buffer, " ## Addition of Two Variables ##\n") + write(buffer, " ###############################\n") + write(buffer, "\n") + write(buffer, " # Reset the column counter\n") + write(buffer, " col = Int32(1)\n") + write(buffer, "\n") + write(buffer, " # Begin rule\n") + write(buffer, " $OUT_cv $eq $v1_cv + $v2_cv\n") + write(buffer, " $OUT_cc $eq $v1_cc + $v2_cc\n") + write(buffer, " $OUT_lo $eq $v1_lo + $v2_lo\n") + write(buffer, " $OUT_hi $eq $v1_hi + $v2_hi\n") + write(buffer, " while col <= colmax\n") + write(buffer, " if col == Int32($ID1)\n") + write(buffer, " $OUT_cvgrad $eq 1.0\n") + write(buffer, " $OUT_ccgrad $eq 1.0\n") + write(buffer, " elseif col == Int32($ID2)\n") + write(buffer, " $OUT_cvgrad $eq 1.0\n") + write(buffer, " $OUT_ccgrad $eq 1.0\n") + write(buffer, " else\n") + write(buffer, " $OUT_cvgrad $eq 0.0\n") + write(buffer, " $OUT_ccgrad $eq 0.0\n") + write(buffer, " end\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, "\n") + write(buffer, " # Cut\n") + write(buffer, " if $OUT_cv < $OUT_lo\n") + write(buffer, " $OUT_cv = $OUT_lo\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_cvgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, " if $OUT_cc > $OUT_hi\n") + write(buffer, " $OUT_cc = $OUT_hi\n") + write(buffer, " col = Int32(1)\n") + write(buffer, " while col <= colmax\n") + write(buffer, " $OUT_ccgrad = 0.0\n") + write(buffer, " col += Int32(1)\n") + write(buffer, " end\n") + write(buffer, " end\n") + write(buffer, "\n") + end + return String(take!(buffer)) +end + +#= +Affine Quadratic Rules +=# + +function SCMC_quadaff_initialize(CONST::Real) + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Write the initialization of the quadratic constants + # to the buffer + write(buffer, " #############################\n") + write(buffer, " ## Constant Initialization ##\n") + write(buffer, " #############################\n") + write(buffer, "\n") + write(buffer, " intercept_cv = $(Float64(CONST))\n") + write(buffer, " intercept_cc = $(Float64(CONST))\n") + write(buffer, "\n") + return String(take!(buffer)) +end + +function SCMC_quadaff_affine(v1::String, COEFF::Real, varlist::Vector{String}) + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Identify the index of the variable + ID = findfirst(==(v1), varlist) + + # Adjust the temporary subgradient fields for this variable + # (NOTE: With affine quadratic relaxations, there is only + # ever a single temporary variable. Hence, `temp1` instead + # of `temp$(i)`. + write(buffer, " #################\n") + write(buffer, " ## Affine Term ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + write(buffer, " temp1_cvgrad[$(ID)] += $COEFF\n") + write(buffer, " temp1_ccgrad[$(ID)] += $COEFF\n") + write(buffer, "\n") + return String(take!(buffer)) +end + +function SCMC_quadaff_squared(v1::String, COEFF::Real, varlist::Vector{String}) + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Identify the index of the variable + ID = findfirst(==(v1), varlist) + + # Adjust the temporary subgradient fields for this variable + # (NOTE: With affine quadratic relaxations, there is only + # ever a single temporary variable. Hence, `temp1` instead + # of `temp$(i)`. + if COEFF > 0.0 + write(buffer, " ##################\n") + write(buffer, " ## Squared Term ##\n") + write(buffer, " ##################\n") + write(buffer, "\n") + write(buffer, " intercept_cv -= $COEFF * $(v1)[idx,1] * $(v1)[idx,1]\n") + write(buffer, " intercept_cc -= $COEFF * $(v1)[idx,2] * $(v1)[idx,3]\n") + write(buffer, " temp1_cvgrad[$(ID)] += 2.0 * $COEFF * $(v1)[idx,1]\n") + write(buffer, " temp1_ccgrad[$(ID)] += $COEFF * ($(v1)[idx,2] + $(v1)[idx,3])\n") + write(buffer, "\n") + else + write(buffer, " ##################\n") + write(buffer, " ## Squared Term ##\n") + write(buffer, " ##################\n") + write(buffer, "\n") + write(buffer, " intercept_cv -= $COEFF * $(v1)[idx,2] * $(v1)[idx,3]\n") + write(buffer, " intercept_cc -= $COEFF * $(v1)[idx,1] * $(v1)[idx,1]\n") + write(buffer, " temp1_cvgrad[$(ID)] += $COEFF * ($(v1)[idx,2] + $(v1)[idx,3])\n") + write(buffer, " temp1_ccgrad[$(ID)] += 2.0 * $COEFF * $(v1)[idx,1]\n") + write(buffer, "\n") + end + + return String(take!(buffer)) +end + +function SCMC_quadaff_binary(v1::String, v2::String, COEFF::Real, varlist::Vector{String}) + # Create the buffer that we will write to + buffer = Base.IOBuffer() + + # Identify the indices of the variables + ID1 = findfirst(==(v1), varlist) + ID2 = findfirst(==(v2), varlist) + + # Adjust the temporary subgradient fields for this variable + # (NOTE: With affine quadratic relaxations, there is only + # ever a single temporary variable. Hence, `temp1` instead + # of `temp$(i)`. + if COEFF > 0.0 + write(buffer, " #################\n") + write(buffer, " ## Binary Term ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + write(buffer, " if ($(v1)[idx,3] - $(v1)[idx,2])*$(v2)[idx,1] + ($(v2)[idx,3] - $(v2)[idx,2])*$(v1)[idx,1] <= $(v1)[idx,3]*$(v2)[idx,3] - $(v1)[idx,2]*$(v2)[idx,2]\n") + write(buffer, " intercept_cv -= $COEFF * $(v1)[idx,2] * $(v2)[idx,2]\n") + write(buffer, " temp1_cvgrad[$(ID1)] += $COEFF * $(v2)[idx,2]\n") + write(buffer, " temp1_cvgrad[$(ID2)] += $COEFF * $(v1)[idx,2]\n") + write(buffer, " else\n") + write(buffer, " intercept_cv -= $COEFF * $(v1)[idx,3] * $(v2)[idx,3]\n") + write(buffer, " temp1_cvgrad[$(ID1)] += $COEFF * $(v2)[idx,3]\n") + write(buffer, " temp1_cvgrad[$(ID2)] += $COEFF * $(v1)[idx,3]\n") + write(buffer, " end\n") + write(buffer, " if ($(v1)[idx,3] - $(v1)[idx,2])*$(v2)[idx,1] - ($(v2)[idx,3] - $(v2)[idx,2])*$(v1)[idx,1] <= $(v1)[idx,3]*$(v2)[idx,2] - $(v1)[idx,2]*$(v2)[idx,3]\n") + write(buffer, " intercept_cc -= $COEFF * $(v1)[idx,3] * $(v2)[idx,2]\n") + write(buffer, " temp1_ccgrad[$(ID1)] += $COEFF * $(v2)[idx,2]\n") + write(buffer, " temp1_ccgrad[$(ID2)] += $COEFF * $(v1)[idx,3]\n") + write(buffer, " else\n") + write(buffer, " intercept_cc -= $COEFF * $(v1)[idx,2] * $(v2)[idx,3]\n") + write(buffer, " temp1_ccgrad[$(ID1)] += $COEFF * $(v2)[idx,3]\n") + write(buffer, " temp1_ccgrad[$(ID2)] += $COEFF * $(v1)[idx,2]\n") + write(buffer, " end\n") + write(buffer, "\n") + else + write(buffer, " #################\n") + write(buffer, " ## Binary Term ##\n") + write(buffer, " #################\n") + write(buffer, "\n") + write(buffer, " if ($(v1)[idx,3] - $(v1)[idx,2])*$(v2)[idx,1] - ($(v2)[idx,3] - $(v2)[idx,2])*$(v1)[idx,1] <= $(v1)[idx,3]*$(v2)[idx,2] - $(v1)[idx,2]*$(v2)[idx,3]\n") + write(buffer, " intercept_cv -= $COEFF * $(v1)[idx,3] * $(v2)[idx,2]\n") + write(buffer, " temp1_cvgrad[$(ID1)] += $COEFF * $(v2)[idx,2]\n") + write(buffer, " temp1_cvgrad[$(ID2)] += $COEFF * $(v1)[idx,3]\n") + write(buffer, " else\n") + write(buffer, " intercept_cv -= $COEFF * $(v1)[idx,2] * $(v2)[idx,3]\n") + write(buffer, " temp1_cvgrad[$(ID1)] += $COEFF * $(v2)[idx,3]\n") + write(buffer, " temp1_cvgrad[$(ID2)] += $COEFF * $(v1)[idx,2]\n") + write(buffer, " end\n") + write(buffer, " if ($(v1)[idx,3] - $(v1)[idx,2])*$(v2)[idx,1] + ($(v2)[idx,3] - $(v2)[idx,2])*$(v1)[idx,1] <= $(v1)[idx,3]*$(v2)[idx,3] - $(v1)[idx,2]*$(v2)[idx,2]\n") + write(buffer, " intercept_cc -= $COEFF * $(v1)[idx,2] * $(v2)[idx,2]\n") + write(buffer, " temp1_ccgrad[$(ID1)] += $COEFF * $(v2)[idx,2]\n") + write(buffer, " temp1_ccgrad[$(ID2)] += $COEFF * $(v1)[idx,2]\n") + write(buffer, " else\n") + write(buffer, " intercept_cc -= $COEFF * $(v1)[idx,3] * $(v2)[idx,3]\n") + write(buffer, " temp1_ccgrad[$(ID1)] += $COEFF * $(v2)[idx,3]\n") + write(buffer, " temp1_ccgrad[$(ID2)] += $COEFF * $(v1)[idx,3]\n") + write(buffer, " end\n") + write(buffer, "\n") + end + + return String(take!(buffer)) +end diff --git a/src/precompile.jl b/src/precompile.jl new file mode 100644 index 0000000..a96dc4f --- /dev/null +++ b/src/precompile.jl @@ -0,0 +1,25 @@ +function _precompile_() + # Individual string kernels + Base.precompile(SCMC_cadd_kernel, (String,String,Real)) # Time: 0.00023 + Base.precompile(SCMC_add_to_kernel, (String,String)) # Time: 0.004736 + Base.precompile(SCMC_negate_kernel, (String,String)) # Time: 0.003571 + Base.precompile(SCMC_exp_kernel, (String,String)) # Time: 0.035821 + Base.precompile(SCMC_log_kernel, (String,String)) # Time: 0.040379 + Base.precompile(SCMC_inv_kernel, (String,String)) # Time: 0.104374 + Base.precompile(SCMC_cmul_kernel, (String,String)) # Time: 0.000003 + Base.precompile(SCMC_sigmoid_kernel, (String,String)) # Time: 0.453531 + Base.precompile(SCMC_mult_kernel, (String,String,String)) # Time: 0.123286 + Base.precompile(SCMC_add_kernel, (String,String,String)) # Time: 0.008387 + + # Main kernel generator + Base.precompile(kgen, (Num, Vector{Num}, Vector{Symbol}, Vector{Num}, Bool)) # Time: 1.632566 + + # Kernel generator requirements + Base.precompile(create_kernel!, (String, Int, BasicSymbolic{Real}, Vector{Num}, Vector{Symbol}, Vector{Num})) # Time: 0.000162 + Base.precompile(perform_substitutions, (Vector{Equation},)) # Time: 0.000006 + Base.precompile(cleaner, (BasicSymbolic, Vector{Equation}, Vector{Bool})) # Time: 0.000007 + Base.precompile(preamble_string, (String, Vector{String}, Int, Int, Int)) # Time: 0.000005 + Base.precompile(write_operation, (IOStream, BasicSymbolic{Real}, Vector{Any}, Vector{String})) # Time: 0.000008 + Base.precompile(postamble, (String,)) # Time: 0.000004 + Base.precompile(outro, (String, Vector{Int}, Int32, Vector{Num})) # Time: 0.000002 +end \ No newline at end of file