Advanced Computing Platform for Theoretical Physics

Commit 7ad33a20 authored by GiggleLiu's avatar GiggleLiu
Browse files

add complex number support

parent 2215b1ab
......@@ -113,7 +113,7 @@ class Adadelta(Minimizer):
gradient = self.fprime(self.wrt, *args, **kwargs)
self.gms = (d * self.gms) + (1 - d) * gradient ** 2
self.gms = (d * self.gms) + (1 - d) * abs(gradient) ** 2
step2 = sqrt(self.sms + o) / sqrt(self.gms + o) * gradient * self.step_rate
self.wrt -= step2
......
......@@ -176,7 +176,7 @@ class Adam(Minimizer):
gradient = self.fprime(self.wrt, *args, **kwargs)
self.est_mom1_b = dm1 * gradient + (1 - dm1) * est_mom1_b_m1
self.est_mom2_b = dm2 * gradient ** 2 + (1 - dm2) * est_mom2_b_m1
self.est_mom2_b = dm2 * abs(gradient) ** 2 + (1 - dm2) * est_mom2_b_m1
step_t = self.step_rate * (1 - (1 - dm2) ** t) ** 0.5 / \
(1 - (1 - dm1) ** t)
......
......@@ -104,3 +104,9 @@ def isnan(x):
return gp.isnan(x)
else:
return np.isnan(x)
def exp(x):
if not isinstance(x, np.ndarray):
return gp.exp(x)
else:
return np.exp(x)
......@@ -164,7 +164,7 @@ class RmsProp(Minimizer):
self.moving_mean_squared = (
self.decay * self.moving_mean_squared
+ (1 - self.decay) * gradient ** 2)
+ (1 - self.decay) * abs(gradient) ** 2)
step2 = self.step_rate * gradient
step2 /= sqrt(self.moving_mean_squared + 1e-8)
self.wrt -= step2
......
......@@ -3,6 +3,7 @@
"""This module contains the Resilient propagation optimizer."""
from __future__ import absolute_import
import numpy as np
from . import mathadapt as ma
from .base import Minimizer
......@@ -126,13 +127,13 @@ class Rprop(Minimizer):
for args, kwargs in self.args:
gradient_m1 = self.gradient
self.gradient = self.fprime(self.wrt, *args, **kwargs)
gradprod = gradient_m1 * self.gradient
gradprod = (gradient_m1.conj() * self.gradient).real
self.changes[gradprod > 0] *= self.step_grow
self.changes[gradprod < 0] *= self.step_shrink
self.changes = ma.clip(self.changes, self.min_step, self.max_step)
step = -self.changes * ma.sign(self.gradient)
step = -self.changes * (np.exp(1j*np.angle(self.gradient)) if np.iscomplexobj(self.wrt) else ma.sign(self.gradient))
self.wrt += step
self.n_iter += 1
......
......@@ -90,6 +90,30 @@ class Quadratic(object):
def solved(self, tolerance=0.01):
return (abs(self.fprime(self.pars)) < tolerance).all()
class ComplexQuadratic(object):
def __init__(self, dim, seed=3):
np.random.seed(3)
H=np.random.random([dim,dim])+1j*np.random.random([dim,dim])
H=(H+H.T.conj())/dim
b=np.random.random(dim)+1j*np.random.random(dim)
self.H=H
self.b=b
self.pars=np.random.random(dim)+1j*np.random.random(dim)
def f(self, x):
H,b=self.H,self.b
r=H.dot(x)-b
return sum(r.conj()*r).real
def fprime(self, x):
H,b=self.H,self.b
return H.T.conj().dot((H.dot(x)-b))
def f_Hp(self, pars, p):
return np.dot(self.H, p)
def solved(self, tolerance=0.01):
return (self.f(self.pars) < tolerance).all()
class BigQuadratic(object):
......@@ -114,7 +138,6 @@ class BigQuadratic(object):
def solved(self, tolerance=0.01):
return (abs(self.fprime(self.pars)) < tolerance).all()
class Rosenbrock(object):
def __init__(self):
......
......@@ -4,7 +4,7 @@ import itertools
from climin import Adadelta
from .losses import LogisticRegression
from .losses import LogisticRegression, ComplexQuadratic
from .common import continuation
......@@ -25,3 +25,12 @@ def test_adadelta_continue():
opt = Adadelta(obj.pars, obj.fprime, 0.9, args=args)
continuation(opt)
def test_adadelta_cquadratic():
obj = ComplexQuadratic(10)
opt = Adadelta(obj.pars, obj.fprime, 1,decay=0.9, momentum=0.9)
for i, info in enumerate(opt):
print(obj.f(opt.wrt))
if i > 10000:
break
assert obj.solved(0.1), 'did not find solution'
from __future__ import absolute_import, print_function
import itertools
from climin import Adam
from .losses import LogisticRegression, ComplexQuadratic
from .common import continuation
def test_adam_lr():
obj = LogisticRegression()
args = itertools.repeat(((obj.X, obj.Z), {}))
opt = Adam(obj.pars, obj.fprime, step_rate=1e-2,args=args)
for i, info in enumerate(opt):
print(obj.f(opt.wrt, obj.X, obj.Z))
if i > 3000:
break
assert obj.solved(0.15), 'did not find solution'
def test_adam_continue():
obj = LogisticRegression(n_inpt=2, n_classes=2)
args = itertools.repeat(((obj.X, obj.Z), {}))
opt = Adam(obj.pars, obj.fprime, step_rate=1e-2, args=args)
continuation(opt)
def test_adam_cquadratic():
obj = ComplexQuadratic(10)
opt = Adam(obj.pars, obj.fprime,step_rate=1e-2)
for i, info in enumerate(opt):
print(obj.f(opt.wrt))
if i > 10000:
break
assert obj.solved(0.15), 'did not find solution'
......@@ -6,7 +6,7 @@ import nose
from climin import GradientDescent
from .losses import Quadratic, LogisticRegression, Rosenbrock
from .losses import Quadratic, ComplexQuadratic, LogisticRegression, Rosenbrock
from .common import continuation
......@@ -19,6 +19,15 @@ def test_gd_quadratic():
break
assert obj.solved(), 'did not find solution'
def test_gd_cquadratic():
obj = ComplexQuadratic(10)
opt = GradientDescent(
obj.pars, obj.fprime, step_rate=0.5, momentum=0.9)
for i, info in enumerate(opt):
print(obj.f(obj.pars))
if i > 5000:
break
assert obj.solved(0.1), 'did not find solution'
@nose.tools.nottest
def test_gd_rosen():
......@@ -87,3 +96,5 @@ def test_gd_continue():
args=args)
continuation(opt)
test_gd_cquadratic()
......@@ -6,7 +6,7 @@ import itertools
from climin import RmsProp
from .losses import LogisticRegression
from .losses import LogisticRegression,ComplexQuadratic
from .common import continuation
......@@ -29,3 +29,13 @@ def test_rmsprop_continue():
args=args)
continuation(opt)
def test_rmsprop_cquadratic():
obj = ComplexQuadratic(10)
opt = RmsProp(obj.pars, obj.fprime, 0.01, 0.9)
for i, info in enumerate(opt):
print(obj.f(opt.wrt))
if i > 10000:
break
assert obj.solved(0.15), 'did not find solution'
......@@ -4,7 +4,7 @@ import itertools
from climin import Rprop
from .losses import Quadratic, LogisticRegression, Rosenbrock
from .losses import Quadratic, LogisticRegression, Rosenbrock, ComplexQuadratic
from .common import continuation
......@@ -17,6 +17,15 @@ def test_rprop_quadratic():
break
assert obj.solved(), 'did not find solution'
def test_rprop_cquadratic():
obj = ComplexQuadratic(10)
opt = Rprop(obj.pars, obj.fprime, step_shrink=0.5, step_grow=1.2,
min_step=1e-6, max_step=0.1)
for i, info in enumerate(opt):
print(obj.f(obj.pars))
if i > 10000:
break
assert obj.solved(0.1), 'did not find solution'
def test_rprop_rosen():
obj = Rosenbrock()
......@@ -45,3 +54,5 @@ def test_rprop_continue():
min_step=1e-6, max_step=0.1, args=args)
continuation(opt)
test_rprop_quadratic()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment