Обнаружение структуры и разреженности

Используя систему трассировки, предоставляемую выражениями Symbolics.jl, Symbolics.jl может автоматически определять шаблоны разреженности функций Julia. Более подробно эта функциональность описана в документе:

@article{gowda2019sparsity,
  title={Sparsity Programming: Automated Sparsity-Aware Optimizations in Differentiable Programming},
  author={Gowda, Shashi and Ma, Yingbo and Churavy, Valentin and Edelman, Alan and Rackauckas, Christopher},
  year={2019}
}

Если вы используете эту функциональность, ссылайтесь на приведенный документ.

Обнаружение разреженности

# Symbolics.jacobian_sparsityFunction

jacobian_sparsity(
exprs::AbstractArray,
vars::AbstractArray
) -> SparseMatrixCSC{Bool, Int64}

Возвращает шаблон разреженности якобиана массива выражений относительно массива выражений переменных.

Аргументы

  • exprs: массив символьных выражений.

  • vars: массив символьных переменных.

Примеры

julia> using Symbolics

julia> vars = @variables x₁ x₂;

julia> exprs = [2x₁, 3x₂, 4x₁ * x₂];

julia> Symbolics.jacobian_sparsity(exprs, vars)
3×2 SparseArrays.SparseMatrixCSC{Bool, Int64} with 4 stored entries:
 1  ⋅
 ⋅  1
 1  1
jacobian_sparsity(
f!::Function,
output::AbstractArray,
input::AbstractArray,
args...;
kwargs...
) -> SparseMatrixCSC{Bool, Int64}

Возвращает шаблон разреженности якобиана изменяемой функции f!.

Аргументы

  • f!: функция f!(output, input, args...; kwargs...) на месте.

  • output: выходной массив.

  • input: входной массив.

Тип eltype output и input может быть либо символьным, либо примитивным.

Примеры

julia> using Symbolics

julia> f!(y, x) = y .= [x[2], 2x[1], 3x[1] * x[2]];

julia> output = Vector{Float64}(undef, 3);

julia> input = Vector{Float64}(undef, 2);

julia> Symbolics.jacobian_sparsity(f!, output, input)
3×2 SparseArrays.SparseMatrixCSC{Bool, Int64} with 4 stored entries:
 ⋅  1
 1  ⋅
 1  1

# Symbolics.hessian_sparsityFunction

hessian_sparsity(
expr,
vars::AbstractVector;
full
) -> Union{SparseMatrixCSC{Bool, Int64}, SparseMatrixCSC{Int64, Int64}}

Возвращает шаблон разреженности гессиана выражения относительно массива выражений переменных.

Аргументы

  • expr: символьное выражение.

  • vars: вектор символьных переменных.

Примеры

julia> using Symbolics

julia> vars = @variables x₁ x₂;

julia> expr = 3x₁^2 + 4x₁ * x₂;

julia> Symbolics.hessian_sparsity(expr, vars)
2×2 SparseArrays.SparseMatrixCSC{Bool, Int64} with 3 stored entries:
 1  1
 1  ⋅
hessian_sparsity(
f::Function,
input::AbstractVector,
args...;
full,
kwargs...
) -> Union{SparseMatrixCSC{Bool, Int64}, SparseMatrixCSC{Int64, Int64}}

Возвращает шаблон разреженности гессиана заданной функции f.

Аргументы

  • f: функция f(input, args...; kwargs...) не на месте.

  • input: вектор входных значений, тип eltype которого может быть либо символьным, либо примитивным.

Примеры

julia> using Symbolics

julia> f(x) = 4x[1] * x[2] - 5x[2]^2;

julia> input = Vector{Float64}(undef, 2);

julia> Symbolics.hessian_sparsity(f, input)
2×2 SparseArrays.SparseMatrixCSC{Bool, Int64} with 3 stored entries:
 ⋅  1
 1  1

Обнаружение структуры

# Symbolics.islinearFunction

islinear(ex, u)

Проверяет, является ли выражение линейным относительно списка выражений переменных.

# Symbolics.isaffineFunction

isaffine(ex, u)

Проверяет, является ли выражение аффинным относительно списка выражений переменных.