All Projects → kul-optec → AbstractOperators.jl

kul-optec / AbstractOperators.jl

Licence: other
Abstract operators for large scale optimization in Julia

Programming Languages

julia
2034 projects
TeX
3793 projects

Projects that are alternatives of or similar to AbstractOperators.jl

Pennylane
PennyLane is a cross-platform Python library for differentiable programming of quantum computers. Train a quantum computer the same way as a neural network.
Stars: ✭ 800 (+2976.92%)
Mutual labels:  optimization, automatic-differentiation
autodiff
A .NET library that provides fast, accurate and automatic differentiation (computes derivative / gradient) of mathematical functions.
Stars: ✭ 69 (+165.38%)
Mutual labels:  optimization, automatic-differentiation
Nabla.jl
A operator overloading, tape-based, reverse-mode AD
Stars: ✭ 54 (+107.69%)
Mutual labels:  automatic-differentiation, julia-language
Causing
Causing: CAUsal INterpretation using Graphs
Stars: ✭ 47 (+80.77%)
Mutual labels:  automatic-differentiation, derivatives
Galacticoptim.jl
Local, global, and beyond optimization for scientific machine learning (SciML)
Stars: ✭ 155 (+496.15%)
Mutual labels:  optimization, automatic-differentiation
Owl
Owl - OCaml Scientific and Engineering Computing @ http://ocaml.xyz
Stars: ✭ 919 (+3434.62%)
Mutual labels:  optimization, automatic-differentiation
dopt
A numerical optimisation and deep learning framework for D.
Stars: ✭ 28 (+7.69%)
Mutual labels:  optimization, automatic-differentiation
Adcme.jl
Automatic Differentiation Library for Computational and Mathematical Engineering
Stars: ✭ 106 (+307.69%)
Mutual labels:  optimization, automatic-differentiation
Aerosandbox
Aircraft design optimization made fast through modern automatic differentiation. Plug-and-play analysis tools for aerodynamics, propulsion, structures, trajectory design, and much, much more.
Stars: ✭ 193 (+642.31%)
Mutual labels:  optimization, automatic-differentiation
Scientific-Programming-in-Julia
Repository for B0M36SPJ
Stars: ✭ 32 (+23.08%)
Mutual labels:  automatic-differentiation, julia-language
gams.jl
A MathOptInterface Optimizer to solve JuMP models using GAMS
Stars: ✭ 27 (+3.85%)
Mutual labels:  optimization
RcppNumerical
Rcpp Integration for Numerical Computing Libraries
Stars: ✭ 52 (+100%)
Mutual labels:  optimization
mader
Trajectory Planner in Multi-Agent and Dynamic Environments
Stars: ✭ 252 (+869.23%)
Mutual labels:  optimization
okama
Investment portfolio and stocks analyzing tools for Python with free historical data
Stars: ✭ 87 (+234.62%)
Mutual labels:  optimization
vrpy
A python framework for solving the VRP and its variants with column generation.
Stars: ✭ 94 (+261.54%)
Mutual labels:  optimization
spinw
SpinW Matlab library for spin wave calculation
Stars: ✭ 25 (-3.85%)
Mutual labels:  optimization
optimum
🏎️ Accelerate training and inference of 🤗 Transformers with easy to use hardware optimization tools
Stars: ✭ 567 (+2080.77%)
Mutual labels:  optimization
StochasticOptimization.jl
Implementations of stochastic optimization algorithms and solvers
Stars: ✭ 26 (+0%)
Mutual labels:  optimization
mysql tuning-cookbook
Chef cookbook to create MySQL configuraiton files better suited for your system.
Stars: ✭ 23 (-11.54%)
Mutual labels:  optimization
noisyopt
Python library for optimizing noisy functions.
Stars: ✭ 73 (+180.77%)
Mutual labels:  optimization

AbstractOperators.jl

Build status codecov

Description

Abstract operators extend the syntax typically used for matrices to linear mappings of arbitrary dimensions and nonlinear functions. Unlike matrices however, abstract operators apply the mappings with specific efficient algorithms that minimize memory requirements. This is particularly useful in iterative algorithms and in first order large-scale optimization algorithms.

Installation

To install the package, hit ] from the Julia command line to enter the package manager, then

pkg> add AbstractOperators

Usage

With using AbstractOperators the package imports several methods like multiplication * and adjoint transposition ' (and their in-place methods mul!).

For example, one can create a 2-D Discrete Fourier Transform as follows:

julia> A = DFT(3,4)
ℱ  ℝ^(3, 4) ->^(3, 4)

Here, it can be seen that A has a domain of dimensions size(A,2) = (3,4) and of type domainType(A) = Float64 and a codomain of dimensions size(A,1) = (3,4) and type codomainType(A) = Complex{Float64}.

This linear transformation can be evaluated as follows:

julia> x = randn(3,4); #input matrix

julia> y = A*x
3×4 Array{Complex{Float64},2}:
  -1.11412+0.0im       3.58654-0.724452im  -9.10125+0.0im       3.58654+0.724452im
 -0.905575+1.98446im  0.441199-0.913338im  0.315788+3.29666im  0.174273+0.318065im
 -0.905575-1.98446im  0.174273-0.318065im  0.315788-3.29666im  0.441199+0.913338im

julia> mul!(y, A, x) == A*x #in-place evaluation
true

julia> all(A'*y - *(size(x)...)*x .< 1e-12) 
true

julia> mul!(x, A',y) #in-place evaluation
3×4 Array{Float64,2}:
  -2.99091   9.45611  -19.799     1.6327 
 -11.1841   11.2365   -26.3614   11.7261 
   5.04815   7.61552   -6.00498   6.25586

Notice that inputs and outputs are not necessarily Vectors.

It is also possible to combine multiple AbstractOperators using different calculus rules.

For example AbstractOperators can be concatenated horizontally:

julia> B = Eye(Complex{Float64},(3,4))
I  ℂ^(3, 4) ->^(3, 4)

julia> H = [A B]
[ℱ,I]  ℝ^(3, 4)  ℂ^(3, 4) ->^(3, 4)

In this case H has a domain of dimensions size(H,2) = ((3, 4), (3, 4)) and type domainType(H) = (Float64, Complex{Float64}).

When an AbstractOperators have multiple domains, this must be multiplied using an ArrayPartition (using RecursiveArrayTools with corresponding size and domain, for example:

julia> using RecursiveArrayTools

julia> H*ArrayPartition(x, complex(x))
3×4 Array{Complex{Float64},2}:
 -16.3603+0.0im      52.4946-8.69342im  -129.014+0.0im      44.6712+8.69342im
  -22.051+23.8135im  16.5309-10.9601im  -22.5719+39.5599im  13.8174+3.81678im
 -5.81874-23.8135im  9.70679-3.81678im  -2.21552-39.5599im  11.5502+10.9601im

Similarly, when an AbstractOperators have multiple codomains, this will return an ArrayPartition, for example:

julia> V = VCAT(Eye(3,3),FiniteDiff((3,3)))
[I;δx]  ℝ^(3, 3) ->^(3, 3)  ℝ^(2, 3)

julia> V*ones(3,3)
([1.0 1.0 1.0; 1.0 1.0 1.0; 1.0 1.0 1.0], [0.0 0.0 0.0; 0.0 0.0 0.0])

A list of the available AbstractOperators and calculus rules can be found in the documentation.

Related packages

Credits

AbstractOperators.jl is developed by Niccolò Antonello and Lorenzo Stella at KU Leuven, ESAT/Stadius,

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].