Skip to content

Commit 0cb0e9c

Browse files
2 parents 032e5b9 + ebe2aec commit 0cb0e9c

File tree

84 files changed

+2157
-1707
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+2157
-1707
lines changed

.github/workflows/CI.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ jobs:
2222
- OptimizationBBO
2323
- OptimizationCMAEvolutionStrategy
2424
- OptimizationEvolutionary
25-
- OptimizationFlux
2625
- OptimizationGCMAES
2726
- OptimizationManopt
2827
- OptimizationMetaheuristics
2928
- OptimizationMOI
3029
- OptimizationMultistartOptimization
3130
- OptimizationNLopt
3231
- OptimizationNOMAD
32+
- OptimizationODE
3333
- OptimizationOptimJL
3434
- OptimizationOptimisers
3535
- OptimizationPRIMA
@@ -62,7 +62,7 @@ jobs:
6262
GROUP: ${{ matrix.group }}
6363
- uses: julia-actions/julia-processcoverage@v1
6464
with:
65-
directories: src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationFlux/src,lib/OptimizationGCMAES/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src
66-
- uses: codecov/codecov-action@v4
65+
directories: src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationGCMAES/src,lib/OptimizationManopt/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src
66+
- uses: codecov/codecov-action@v5
6767
with:
6868
file: lcov.info

.github/workflows/Documentation.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ jobs:
1616
with:
1717
version: '1'
1818
- name: Install dependencies
19-
run: julia --project=docs/ -e 'using Pkg; Pkg.develop(vcat(PackageSpec(path = pwd()), [PackageSpec(path = joinpath("lib", dir)) for dir in readdir("lib") if dir !== "OptimizationQuadDIRECT"])); Pkg.instantiate()'
19+
run: julia --project=docs/ -e 'using Pkg; Pkg.develop(vcat(PackageSpec(path = pwd()), [PackageSpec(path = joinpath("lib", dir)) for dir in readdir("lib") if (dir !== "OptimizationQuadDIRECT" && dir !== "OptimizationMultistartOptimization")])); Pkg.instantiate()'
2020
- name: Build and deploy
2121
env:
2222
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # For authentication with GitHub Actions token
2323
DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # For authentication with SSH deploy key
2424
run: julia --project=docs/ --code-coverage=user docs/make.jl
2525
- uses: julia-actions/julia-processcoverage@v1
2626
with:
27-
directories: src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationFlux/src,lib/OptimizationGCMAES/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src
28-
- uses: codecov/codecov-action@v4
27+
directories: src,lib/OptimizationBBO/src,lib/OptimizationCMAEvolutionStrategy/src,lib/OptimizationEvolutionary/src,lib/OptimizationGCMAES/src,lib/OptimizationMOI/src,lib/OptimizationMetaheuristics/src,lib/OptimizationMultistartOptimization/src,lib/OptimizationNLopt/src,lib/OptimizationNOMAD/src,lib/OptimizationOptimJL/src,lib/OptimizationOptimisers/src,lib/OptimizationPolyalgorithms/src,lib/OptimizationQuadDIRECT/src,lib/OptimizationSpeedMapping/src
28+
- uses: codecov/codecov-action@v5
2929
with:
3030
file: lcov.info

.github/workflows/Downstream.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,6 @@ jobs:
5151
exit(0) # Exit immediately, as a success
5252
end
5353
- uses: julia-actions/julia-processcoverage@v1
54-
- uses: codecov/codecov-action@v4
54+
- uses: codecov/codecov-action@v5
5555
with:
5656
file: lcov.info

NEWS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# v4 Breaking changes
2+
3+
1. The main change in this breaking release has been the way mini-batching is handled. The data argument in the solve call and the implicit iteration of that in the callback has been removed,
4+
the stochastic solvers (Optimisers.jl and Sophia) now handle it explicitly. You would now pass in a DataLoader to OptimizationProblem as the second argument to the objective etc (p) if you
5+
want to do minibatching, else for full batch just pass in the full data.
6+
7+
2. The support for extra returns from objective function has been removed. Now the objective should only return a scalar loss value, hence callback doesn't take extra arguments other than the state and loss value.

Project.toml

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "Optimization"
22
uuid = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
3-
version = "3.28.0"
3+
version = "4.3.0"
44

55
[deps]
66
ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
@@ -21,22 +21,87 @@ TerminalLoggers = "5d786b92-1e48-4d6f-9151-6b4477ca9bed"
2121

2222
[compat]
2323
ADTypes = "1.2"
24+
Aqua = "0.8"
2425
ArrayInterface = "7.10"
26+
BenchmarkTools = "1"
27+
Boltz = "1"
28+
ComponentArrays = ">= 0.13.9"
2529
ConsoleProgressMonitor = "0.1.1"
30+
DiffEqFlux = "2, 3, 4"
2631
DocStringExtensions = "0.9"
32+
Enzyme = "0.13"
33+
FiniteDiff = "2"
34+
Flux = "0.13, 0.14, 0.15, 0.16"
35+
ForwardDiff = "0.10, 1"
36+
Ipopt = "1"
37+
IterTools = "1.3"
2738
LBFGSB = "0.4.1"
2839
LinearAlgebra = "1.10"
2940
Logging = "1.10"
3041
LoggingExtras = "0.4, 1"
31-
OptimizationBase = "1.3.3"
42+
Lux = "1.12.4"
43+
MLUtils = "0.4"
44+
ModelingToolkit = "9"
45+
Optim = ">= 1.4.1"
46+
OptimizationBase = "2"
47+
OptimizationMOI = "0.5"
48+
OptimizationOptimJL = "0.4"
49+
OptimizationOptimisers = "0.3"
50+
OrdinaryDiffEqTsit5 = "1"
51+
Pkg = "1"
3252
Printf = "1.10"
3353
ProgressLogging = "0.1"
54+
Random = "1.10"
3455
Reexport = "1.2"
56+
ReverseDiff = "1"
57+
SafeTestsets = "0.1"
3558
SciMLBase = "2.39.0"
59+
SciMLSensitivity = "7"
3660
SparseArrays = "1.10"
37-
Symbolics = "5.12"
61+
SparseDiffTools = "2"
62+
Symbolics = "6"
3863
TerminalLoggers = "0.1"
39-
julia = "1.9"
64+
Test = "1.10"
65+
Tracker = "0.2"
66+
Optimisers = ">= 0.2.5"
67+
Zygote = "0.6, 0.7"
68+
julia = "1.10"
4069

4170
[extras]
71+
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
72+
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
73+
Boltz = "4544d5e4-abc5-4dea-817f-29e4c205d9c8"
74+
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
75+
DiffEqFlux = "aae7a2af-3d4f-5e19-a356-7da93b79d9d0"
76+
Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
77+
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
78+
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c"
79+
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
80+
Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9"
81+
IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
82+
Lux = "b2108857-7c20-44ae-9111-449ecde12c47"
83+
MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
84+
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
85+
Optim = "429524aa-4258-5aef-a3af-852621145aeb"
86+
Optimisers = "3bd65402-5787-11e9-1adc-39752487f4e2"
87+
OptimizationMOI = "fd9f6733-72f4-499f-8506-86b2bdd0dea1"
88+
OptimizationOptimJL = "36348300-93cb-4f02-beb5-3c3902f8871e"
89+
OptimizationOptimisers = "42dfb2eb-d2b4-4451-abcd-913932933ac1"
90+
OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a"
91+
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
92+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
93+
ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
94+
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
95+
SciMLSensitivity = "1ed8b502-d754-442c-8d5d-10ac956f44a1"
96+
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
97+
SparseDiffTools = "47a9eef4-7e08-11e9-0b38-333d64bd3804"
4298
Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
99+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
100+
Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
101+
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
102+
103+
[targets]
104+
test = ["Aqua", "BenchmarkTools", "Boltz", "ComponentArrays", "DiffEqFlux", "Enzyme", "FiniteDiff", "Flux", "ForwardDiff",
105+
"Ipopt", "IterTools", "Lux", "MLUtils", "ModelingToolkit", "Optim", "OptimizationMOI", "OptimizationOptimJL", "OptimizationOptimisers",
106+
"OrdinaryDiffEqTsit5", "Pkg", "Random", "ReverseDiff", "SafeTestsets", "SciMLSensitivity", "SparseArrays", "SparseDiffTools",
107+
"Symbolics", "Test", "Tracker", "Zygote"]

docs/Project.toml

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
[deps]
22
AmplNLWriter = "7c4d4715-977e-5154-bfe0-e096adeac482"
3+
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
34
Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4"
45
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
5-
Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c"
66
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
77
HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b"
88
Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9"
99
Ipopt_jll = "9cc047cb-c261-5740-88fc-0cf96f7bdcc7"
1010
IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
1111
Juniper = "2ddba703-00a4-53a7-87a5-e8b9971dde84"
12+
Lux = "b2108857-7c20-44ae-9111-449ecde12c47"
1213
Manifolds = "1cead3c2-87b3-11e9-0ccd-23c62b72b94e"
1314
Manopt = "0fc0a36d-df90-57f3-8f93-d78a9fc72bb5"
15+
MLUtils = "f1d291b0-491e-4a28-83b9-f70985020b54"
1416
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
1517
NLPModels = "a4795742-8479-5a88-8948-cc11e1c8c1a6"
1618
NLPModelsTest = "7998695d-6960-4d3a-85c4-e1bceb8cd856"
@@ -20,12 +22,10 @@ OptimizationBBO = "3e6eede4-6085-4f62-9a71-46d9bc1eb92b"
2022
OptimizationBase = "bca83a33-5cc9-4baa-983d-23429ab6bcbb"
2123
OptimizationCMAEvolutionStrategy = "bd407f91-200f-4536-9381-e4ba712f53f8"
2224
OptimizationEvolutionary = "cb963754-43f6-435e-8d4b-99009ff27753"
23-
OptimizationFlux = "253f991c-a7b2-45f8-8852-8b9a9df78a86"
2425
OptimizationGCMAES = "6f0a0517-dbc2-4a7a-8a20-99ae7f27e911"
2526
OptimizationMOI = "fd9f6733-72f4-499f-8506-86b2bdd0dea1"
2627
OptimizationManopt = "e57b7fff-7ee7-4550-b4f0-90e9476e9fb6"
2728
OptimizationMetaheuristics = "3aafef2f-86ae-4776-b337-85a36adf0b55"
28-
OptimizationMultistartOptimization = "e4316d97-8bbb-4fd3-a7d8-3851d2a72823"
2929
OptimizationNLPModels = "064b21be-54cf-11ef-1646-cdfee32b588f"
3030
OptimizationNLopt = "4e6fcdb7-1186-4e1f-a706-475e75c168bb"
3131
OptimizationNOMAD = "2cab0595-8222-4775-b714-9828e6a9e01b"
@@ -35,6 +35,8 @@ OptimizationPRIMA = "72f8369c-a2ea-4298-9126-56167ce9cbc2"
3535
OptimizationPolyalgorithms = "500b13db-7e66-49ce-bda4-eed966be6282"
3636
OptimizationSpeedMapping = "3d669222-0d7d-4eb9-8a9f-d8528b0d9b91"
3737
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
38+
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
39+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
3840
ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
3941
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
4042
SciMLSensitivity = "1ed8b502-d754-442c-8d5d-10ac956f44a1"
@@ -48,40 +50,42 @@ Evolutionary = "86b6b26d-c046-49b6-aa0b-5f0f74682bd6"
4850

4951
[compat]
5052
AmplNLWriter = "1"
53+
ComponentArrays = "0.15"
5154
Documenter = "1"
5255
FiniteDiff = ">= 2.8.1"
53-
Flux = "0.13, 0.14"
5456
ForwardDiff = ">= 0.10.19"
5557
HiGHS = "1"
5658
Ipopt = "1"
5759
IterTools = "1"
5860
Juniper = "0.9"
61+
Lux = "1"
5962
Manifolds = "0.9"
6063
Manopt = "0.4"
64+
MLUtils = "0.4.4"
6165
ModelingToolkit = "9"
6266
NLPModels = "0.21"
6367
NLPModelsTest = "0.10"
6468
NLopt = "0.6, 1"
65-
Optimization = "3"
66-
OptimizationBBO = "0.1, 0.2, 0.3"
67-
OptimizationBase = "0.0.5, 0.0.6, 0.0.7, 1"
68-
OptimizationCMAEvolutionStrategy = "0.1, 0.2"
69-
OptimizationEvolutionary = "0.1, 0.2, 0.3"
70-
OptimizationFlux = "0.2.1"
71-
OptimizationGCMAES = "0.1, 0.2"
72-
OptimizationMOI = "0.1, 0.2, 0.3, 0.4"
73-
OptimizationManopt = "0.0.2, 0.0.3"
74-
OptimizationMetaheuristics = "0.1, 0.2"
75-
OptimizationMultistartOptimization = "0.1, 0.2"
76-
OptimizationNLPModels = "0.0.1"
77-
OptimizationNLopt = "0.1, 0.2"
78-
OptimizationNOMAD = "0.1, 0.2"
79-
OptimizationOptimJL = "0.1, 0.2, 0.3"
80-
OptimizationOptimisers = "0.1, 0.2"
81-
OptimizationPRIMA = "0.1.0, 0.2"
82-
OptimizationPolyalgorithms = "0.1, 0.2"
83-
OptimizationSpeedMapping = "0.1, 0.2"
69+
Optimization = "4"
70+
OptimizationBBO = "0.4"
71+
OptimizationBase = "2"
72+
OptimizationCMAEvolutionStrategy = "0.3"
73+
OptimizationEvolutionary = "0.4"
74+
OptimizationGCMAES = "0.3"
75+
OptimizationMOI = "0.5"
76+
OptimizationManopt = "0.0.4"
77+
OptimizationMetaheuristics = "0.3"
78+
OptimizationNLPModels = "0.0.2"
79+
OptimizationNLopt = "0.3"
80+
OptimizationNOMAD = "0.3"
81+
OptimizationOptimJL = "0.4"
82+
OptimizationOptimisers = "0.3"
83+
OptimizationPRIMA = "0.3"
84+
OptimizationPolyalgorithms = "0.3"
85+
OptimizationSpeedMapping = "0.2"
8486
OrdinaryDiffEq = "6"
87+
Plots = "1"
88+
Random = "1"
8589
ReverseDiff = ">= 1.9.0"
8690
SciMLBase = "2.30.0"
8791
SciMLSensitivity = "7"

docs/pages.jl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
pages = ["index.md",
22
"getting_started.md",
33
"Tutorials" => [
4-
"tutorials/minibatch.md",
5-
"tutorials/symbolic.md",
4+
"tutorials/certification.md",
65
"tutorials/constraints.md",
7-
"tutorials/linearandinteger.md"
6+
"tutorials/ensemble.md",
7+
"tutorials/linearandinteger.md",
8+
"tutorials/minibatch.md",
9+
"tutorials/remakecomposition.md",
10+
"tutorials/symbolic.md"
811
],
912
"Examples" => [
1013
"examples/rosenbrock.md"
@@ -30,13 +33,14 @@ pages = ["index.md",
3033
"Metaheuristics.jl" => "optimization_packages/metaheuristics.md",
3134
"MultistartOptimization.jl" => "optimization_packages/multistartoptimization.md",
3235
"NLopt.jl" => "optimization_packages/nlopt.md",
36+
"NLPModels.jl" => "optimization_packages/nlpmodels.md",
3337
"NOMAD.jl" => "optimization_packages/nomad.md",
3438
"Optim.jl" => "optimization_packages/optim.md",
3539
"Optimisers.jl" => "optimization_packages/optimisers.md",
36-
"PRIMA.jl" => "optimization_packages/prima.md",
40+
"Optimization.jl" => "optimization_packages/optimization.md",
3741
"Polyalgorithms.jl" => "optimization_packages/polyopt.md",
42+
"PRIMA.jl" => "optimization_packages/prima.md",
3843
"QuadDIRECT.jl" => "optimization_packages/quaddirect.md",
39-
"SpeedMapping.jl" => "optimization_packages/speedmapping.md",
40-
"NLPModels.jl" => "optimization_packages/nlpmodels.md"
44+
"SpeedMapping.jl" => "optimization_packages/speedmapping.md"
4145
]
4246
]

docs/src/API/optimization_solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Optimization Solutions
1+
# [Optimization Solutions](@id solution)
22

33
```@docs
44
SciMLBase.OptimizationSolution

docs/src/getting_started.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
In this tutorial, we introduce the basics of Optimization.jl by showing
44
how to easily mix local optimizers and global optimizers on the Rosenbrock equation.
5+
6+
The Rosenbrock equation is defined as follows:
7+
8+
```math
9+
f(u,p) = (p_1 - u_1)^2 + p_2 * ( u_2 - u_1^2)^2
10+
```
11+
12+
This is a parameterized optimization problem where we want to solve for the vector `u` s.t. `u` minimizes `f`.
513
The simplest copy-pasteable code using a quasi-Newton method (LBFGS) to solve the Rosenbrock problem is the following:
614

715
```@example intro
@@ -17,6 +25,59 @@ prob = OptimizationProblem(optf, u0, p)
1725
sol = solve(prob, Optimization.LBFGS())
1826
```
1927

28+
```@example intro
29+
sol.u
30+
```
31+
32+
```@example intro
33+
sol.objective
34+
```
35+
36+
Tada! That's how you do it. Now let's dive in a little more into what each part means and how to customize it all to your needs.
37+
38+
## Understanding the Solution Object
39+
40+
The solution object is a `SciMLBase.AbstractNoTimeSolution`, and thus it follows the
41+
[SciMLBase Solution Interface for non-timeseries objects](https://docs.sciml.ai/SciMLBase/stable/interfaces/Solutions/) and is documented at the [solution type page](@ref solution).
42+
However, for simplicity let's show a bit of it in action.
43+
44+
An optimization solution has an array interface so that it acts like the array that it solves for. This array syntax is shorthand for simply grabbing the solution `u`. For example:
45+
46+
```@example intro
47+
sol[1] == sol.u[1]
48+
```
49+
50+
```@example intro
51+
Array(sol) == sol.u
52+
```
53+
54+
`sol.objective` returns the final cost of the optimization. We can validate this by plugging it into our function:
55+
56+
```@example intro
57+
rosenbrock(sol.u, p)
58+
```
59+
60+
```@example intro
61+
sol.objective
62+
```
63+
64+
The `sol.retcode` gives us more information about the solution process.
65+
66+
```@example intro
67+
sol.retcode
68+
```
69+
70+
Here it says `ReturnCode.Success` which means that the solutuion successfully solved. We can learn more about the different return codes at
71+
[the ReturnCode part of the SciMLBase documentation](https://docs.sciml.ai/SciMLBase/stable/interfaces/Solutions/#retcodes).
72+
73+
If we are interested about some of the statistics of the solving process, for example to help choose a better solver, we can investigate the `sol.stats`
74+
75+
```@example intro
76+
sol.stats
77+
```
78+
79+
That's just a bit of what's in there, check out the other pages for more information but now let's move onto customization.
80+
2081
## Import a different solver package and solve the problem
2182

2283
OptimizationOptimJL is a wrapper for [Optim.jl](https://github.com/JuliaNLSolvers/Optim.jl) and OptimizationBBO is a wrapper for [BlackBoxOptim.jl](https://github.com/robertfeldt/BlackBoxOptim.jl).

0 commit comments

Comments
 (0)