cvxgrp / aa

Anderson Acceleration
MIT License
19 stars 10 forks source link

AA

Build Status

AA (Anderson Acceleration)

C (with python interface) implementation of the Anderson Acceleration algorithm as described in our paper Globally Convergent Type-I Anderson Acceleration for Non-Smooth Fixed-Point Iterations

NOTE: This implementation is a simple proof-of-concept and does not include all the necessary stabilizations required to guarantee convergence. However, it works well in many cases.

MATLAB code (and the experiments presented in the paper) available here:


Python

To install the package use:

cd python
python setup.py install

To test, run in the same directory:

python example.py

The Python API is as follows. To initialize the accelerator:

import aa
aa_wrk = aa.AndersonAccelerator(dim, mem, type1, eta)

where:

To use the accelerator:

aa_wrk.apply(x, x_prev)

where:

C

At the command prompt type make to compile the library and the example. The example can be run by out/gd.

The C API is as follows:

/* Initialize Anderson Acceleration, allocates memory.
 *
 * Args:
 *  dim: the dimension of the variable for aa
 *  mem: the memory (number of past iterations used) for aa
 *  type1: bool, if True use type 1 aa, otherwise use type 2
 *  regularization: float, regularization param, type-I and type-II different
 *       for type-I: 1e-8 works well, type-II: more stable can use 1e-10 often
 *  relaxation: float \in [0,2], mixing parameter (1.0 is vanilla AA)
 *  verbosity: if greater than 0 prints out various info

 * Reurns:
 *  Pointer to aa workspace
 */
AaWork *aa_init(aa_int dim, aa_int mem, aa_int type1, aa_float regularization,
                aa_float relaxation, aa_int verbosity);

/* Apply Anderson Acceleration.
 *
 * Args:
 *  f: output of map at current iteration, overwritten with aa output at end.
 *  x: input to map at current iteration
 *  a: aa workspace from aa_init
 *
 * Returns:
 *  (float) (+ or -) norm of AA weights vector:
 *    if positive then update was accepted and f contains new point
 *    if negative then update was rejected and f is unchanged
 */
aa_float aa_apply(aa_float *f, const aa_float *x, AaWork *a);

/* Finish Anderson Acceleration, clears memory.
 *
 * Args:
 *  a: aa workspace from aa_init.
 */
void aa_finish(AaWork *a);