diff options
author | trevor.cohn <trevor.cohn@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-07-10 16:49:23 +0000 |
---|---|---|
committer | trevor.cohn <trevor.cohn@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-07-10 16:49:23 +0000 |
commit | 734cdcebfe66ee283e7ae535cec13a857f8b4a29 (patch) | |
tree | 50ddeb1f9334de1004c4c1f08c93a50201d666d1 /gi/posterior-regularisation/simplex_pg.py | |
parent | 3789855a42083b2fb4bc7562dcc619583dbe81e6 (diff) |
Testing code for line search with simplex *equality* constraints and positivity constraints.
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@217 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'gi/posterior-regularisation/simplex_pg.py')
-rw-r--r-- | gi/posterior-regularisation/simplex_pg.py | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/gi/posterior-regularisation/simplex_pg.py b/gi/posterior-regularisation/simplex_pg.py new file mode 100644 index 00000000..5da796d3 --- /dev/null +++ b/gi/posterior-regularisation/simplex_pg.py @@ -0,0 +1,55 @@ +# +# Following Leunberger and Ye, Linear and Nonlinear Progamming, 3rd ed. p367 +# "The gradient projection method" +# applied to an equality constraint for a simplex. +# +# min f(x) +# s.t. x >= 0, sum_i x = d +# +# FIXME: enforce the positivity constraint - a limit on the line search? +# + +from numpy import * +from scipy import * +from linesearch import line_search +# local copy of scipy's Amijo line_search - wasn't enforcing alpha max correctly +import sys + +dims = 4 + +def f(x): + fv = x[0]*x[0] + x[1]*x[1] + x[2]*x[2] + x[3]*x[3] - 2*x[0] - 3*x[3] + # print 'evaluating f at', x, 'value', fv + return fv + +def g(x): + return array([2*x[0] - 2, 2*x[1], 2*x[2], 2*x[3]-3]) + +def pg(x): + gv = g(x) + return gv - sum(gv) / dims + +x = ones(dims) / dims +old_fval = None + +while True: + fv = f(x) + gv = g(x) + dv = pg(x) + + print 'x', x, 'f', fv, 'g', gv, 'd', dv + + if old_fval == None: + old_fval = fv + 0.1 + + # solve for maximum step size i.e. when positivity constraints kick in + # x - alpha d = 0 => alpha = x/d + amax = max(x/dv) + if amax < 1e-8: break + + stuff = line_search(f, pg, x, -dv, dv, fv, old_fval, amax=amax) + alpha = stuff[0] # Nb. can avoid next evaluation of f,g,d using 'stuff' + if alpha < 1e-8: break + x -= alpha * dv + + old_fval = fv |