- Unified framework for both uncontrained and constrained optimization
- Efficient and powered by PyTorch's automatic differentiation engine
- User-friendly and easily modifiable
- Visualization for both curve (or surface) and contour plots
$ git clone ...
$ cd MagiOPT
- Unconstrained
import MagiOPT as optim
def func(x):
...
optimizer = optim.SD(func) # Steepest Descent
x = optimizer.step(x0) # On-the-fly
optimizer.plot() # Visualize
- Constrained
import MagiOPT as optim
def object(x):
...
def constr1(x):
...
def constr2(x):
...
...
optimizer = optim.Penalty(object,
sigma,
(constr1, '<='),
(constr2, '>='),
plot=True) # Penalty methoed
optimizer.BFGS() # Inner optimizer
x = optimizer.step(x0) # On-the-fly
Unconstrained | Constrained |
---|---|
Steepest Descent | Penalty Method |
Amortized Newton Method | Log-Barrier Method |
SR1 | Inverse-Barrier Method |
DFP | Augmented Lagrangian Method |
BFGS | |
Broyden | |
FR | |
PRP | |
CG for Qudratic Function | |
CG for Linear Equation | |
BB1 | |
BB2 | |
Gauss-Newton | |
LMF | |
Dogleg |
Use a simple line of code for unconstrained optimizer
optimizer.plot()
we can visualize the 2D curve with iterated sequence, such that
Or with the 3D surface with iterated sequence, and its contour with iterated sequence.
Or use
optimizer = optim.Penalty(..., plot=True)
we can visualize the function and sequence of each inner iteration with the 3D surface with iterated sequence, and its contour with iterated sequence.
- The majority of algorithms are sensitive to the initial point; choosing an appropriate starting point can save significant effort.
- In ill-conditioned situations, constrained optimizers may require trial and error.
- The Barzilai-Borwein method is unstable for non-quadratic problems; however, you can still infer the optimization path through intermediate visualizations.
- You can easily extract the optimization sequence using:
optimization.sequence
- Your function should be supported by PyTorch operations; however, the input doesn't have to be. It can be a NumPy array, PyTorch tensor, or even a list.
- Pytorch 3.7 or above