Commit 05d1d092 authored by Theo Steininger's avatar Theo Steininger
Browse files

Merge branch 'fight_the_power' into 'master'

replace ** with clearer operators where possible

See merge request !149
parents f0b59b53 9879e567
Pipeline #13331 passed with stages
in 11 minutes and 23 seconds
...@@ -23,29 +23,29 @@ from .line_search import LineSearch ...@@ -23,29 +23,29 @@ from .line_search import LineSearch
class LineSearchStrongWolfe(LineSearch): class LineSearchStrongWolfe(LineSearch):
"""Class for finding a step size that satisfies the strong Wolfe conditions. """Class for finding a step size that satisfies the strong Wolfe conditions.
Algorithm contains two stages. It begins whit a trial step length and it Algorithm contains two stages. It begins whit a trial step length and it
keeps increasing the it until it finds an acceptable step length or an keeps increasing the it until it finds an acceptable step length or an
interval. If it does not satisfy the Wolfe conditions it performs the Zoom interval. If it does not satisfy the Wolfe conditions it performs the Zoom
algorithm (second stage). By interpolating it decreases the size of the algorithm (second stage). By interpolating it decreases the size of the
interval until an acceptable step length is found. interval until an acceptable step length is found.
Parameters Parameters
---------- ----------
c1 : float c1 : float
Parameter for Armijo condition rule. (Default: 1e-4) Parameter for Armijo condition rule. (Default: 1e-4)
c2 : float c2 : float
Parameter for curvature condition rule. (Default: 0.9) Parameter for curvature condition rule. (Default: 0.9)
max_step_size : float max_step_size : float
Maximum step allowed in to be made in the descent direction. Maximum step allowed in to be made in the descent direction.
(Default: 50) (Default: 50)
max_iterations : integer max_iterations : integer
Maximum number of iterations performed by the line search algorithm. Maximum number of iterations performed by the line search algorithm.
(Default: 10) (Default: 10)
max_zoom_iterations : integer max_zoom_iterations : integer
Maximum number of iterations performed by the zoom algorithm. Maximum number of iterations performed by the zoom algorithm.
(Default: 10) (Default: 10)
Attributes Attributes
---------- ----------
c1 : float c1 : float
...@@ -53,19 +53,18 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -53,19 +53,18 @@ class LineSearchStrongWolfe(LineSearch):
c2 : float c2 : float
Parameter for curvature condition rule. Parameter for curvature condition rule.
max_step_size : float max_step_size : float
Maximum step allowed in to be made in the descent direction. Maximum step allowed in to be made in the descent direction.
max_iterations : integer max_iterations : integer
Maximum number of iterations performed by the line search algorithm. Maximum number of iterations performed by the line search algorithm.
max_zoom_iterations : integer max_zoom_iterations : integer
Maximum number of iterations performed by the zoom algorithm. Maximum number of iterations performed by the zoom algorithm.
""" """
def __init__(self, c1=1e-4, c2=0.9, def __init__(self, c1=1e-4, c2=0.9,
max_step_size=50, max_iterations=10, max_step_size=50, max_iterations=10,
max_zoom_iterations=10): max_zoom_iterations=10):
super(LineSearchStrongWolfe, self).__init__() super(LineSearchStrongWolfe, self).__init__()
self.c1 = np.float(c1) self.c1 = np.float(c1)
...@@ -76,11 +75,11 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -76,11 +75,11 @@ class LineSearchStrongWolfe(LineSearch):
def perform_line_search(self, energy, pk, f_k_minus_1=None): def perform_line_search(self, energy, pk, f_k_minus_1=None):
"""Performs the first stage of the algorithm. """Performs the first stage of the algorithm.
It starts with a trial step size and it keeps increasing it until it It starts with a trial step size and it keeps increasing it until it
satisfy the strong Wolf conditions. It also performs the descent and satisfy the strong Wolf conditions. It also performs the descent and
returns the optimal step length and the new enrgy. returns the optimal step length and the new enrgy.
Parameters Parameters
---------- ----------
energy : Energy object energy : Energy object
...@@ -89,9 +88,9 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -89,9 +88,9 @@ class LineSearchStrongWolfe(LineSearch):
pk : Field pk : Field
Unit vector pointing into the search direction. Unit vector pointing into the search direction.
f_k_minus_1 : float f_k_minus_1 : float
Value of the fuction (which is being minimized) at the k-1 Value of the fuction (which is being minimized) at the k-1
iteration of the line search procedure. (Default: None) iteration of the line search procedure. (Default: None)
Returns Returns
------- -------
alpha_star : float alpha_star : float
...@@ -100,9 +99,9 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -100,9 +99,9 @@ class LineSearchStrongWolfe(LineSearch):
Value of the energy after the performed descent. Value of the energy after the performed descent.
energy_star : Energy object energy_star : Energy object
The new Energy object on the new position. The new Energy object on the new position.
""" """
self._set_line_energy(energy, pk, f_k_minus_1=f_k_minus_1) self._set_line_energy(energy, pk, f_k_minus_1=f_k_minus_1)
c1 = self.c1 c1 = self.c1
c2 = self.c2 c2 = self.c2
...@@ -195,11 +194,11 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -195,11 +194,11 @@ class LineSearchStrongWolfe(LineSearch):
def _zoom(self, alpha_lo, alpha_hi, phi_0, phiprime_0, def _zoom(self, alpha_lo, alpha_hi, phi_0, phiprime_0,
phi_lo, phiprime_lo, phi_hi, c1, c2): phi_lo, phiprime_lo, phi_hi, c1, c2):
"""Performs the second stage of the line search algorithm. """Performs the second stage of the line search algorithm.
If the first stage was not successful then the Zoom algorithm tries to If the first stage was not successful then the Zoom algorithm tries to
find a suitable step length by using bisection, quadratic, cubic find a suitable step length by using bisection, quadratic, cubic
interpolation. interpolation.
Parameters Parameters
---------- ----------
alpha_lo : float alpha_lo : float
...@@ -207,24 +206,24 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -207,24 +206,24 @@ class LineSearchStrongWolfe(LineSearch):
alph_hi : float alph_hi : float
The upper boundary for the step length interval. The upper boundary for the step length interval.
phi_0 : float phi_0 : float
Value of the energy at the starting point of the line search Value of the energy at the starting point of the line search
algorithm. algorithm.
phiprime_0 : Field phiprime_0 : Field
Gradient at the starting point of the line search algorithm. Gradient at the starting point of the line search algorithm.
phi_lo : float phi_lo : float
Value of the energy if we perform a step of length alpha_lo in Value of the energy if we perform a step of length alpha_lo in
descent direction. descent direction.
phiprime_lo : Field phiprime_lo : Field
Gradient at the nwe position if we perform a step of length Gradient at the nwe position if we perform a step of length
alpha_lo in descent direction. alpha_lo in descent direction.
phi_hi : float phi_hi : float
Value of the energy if we perform a step of length alpha_hi in Value of the energy if we perform a step of length alpha_hi in
descent direction. descent direction.
c1 : float c1 : float
Parameter for Armijo condition rule. Parameter for Armijo condition rule.
c2 : float c2 : float
Parameter for curvature condition rule. Parameter for curvature condition rule.
Returns Returns
------- -------
alpha_star : float alpha_star : float
...@@ -233,7 +232,7 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -233,7 +232,7 @@ class LineSearchStrongWolfe(LineSearch):
Value of the energy after the performed descent. Value of the energy after the performed descent.
energy_star : Energy object energy_star : Energy object
The new Energy object on the new position. The new Energy object on the new position.
""" """
max_iterations = self.max_zoom_iterations max_iterations = self.max_zoom_iterations
# define the cubic and quadratic interpolant checks # define the cubic and quadratic interpolant checks
...@@ -306,12 +305,13 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -306,12 +305,13 @@ class LineSearchStrongWolfe(LineSearch):
def _cubicmin(self, a, fa, fpa, b, fb, c, fc): def _cubicmin(self, a, fa, fpa, b, fb, c, fc):
"""Estimating the minimum with cubic interpolation. """Estimating the minimum with cubic interpolation.
Finds the minimizer for a cubic polynomial that goes through the Finds the minimizer for a cubic polynomial that goes through the
points ( a,f(a) ), ( b,f(b) ), and ( c,f(c) ) with derivative at point a of fpa. points ( a,f(a) ), ( b,f(b) ), and ( c,f(c) ) with derivative at point
a of fpa.
f(x) = A *(x-a)^3 + B*(x-a)^2 + C*(x-a) + D f(x) = A *(x-a)^3 + B*(x-a)^2 + C*(x-a) + D
If no minimizer can be found return None If no minimizer can be found return None
Parameters Parameters
---------- ----------
a : float a : float
...@@ -328,12 +328,12 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -328,12 +328,12 @@ class LineSearchStrongWolfe(LineSearch):
Selected point. Selected point.
fc : float fc : float
Value of polynomial at point c. Value of polynomial at point c.
Returns Returns
------- -------
xmin : float xmin : float
Position of the approximated minimum. Position of the approximated minimum.
""" """
with np.errstate(divide='raise', over='raise', invalid='raise'): with np.errstate(divide='raise', over='raise', invalid='raise'):
...@@ -341,12 +341,12 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -341,12 +341,12 @@ class LineSearchStrongWolfe(LineSearch):
C = fpa C = fpa
db = b - a db = b - a
dc = c - a dc = c - a
denom = (db * dc) ** 2 * (db - dc) denom = db * db * dc * dc * (db - dc)
d1 = np.empty((2, 2)) d1 = np.empty((2, 2))
d1[0, 0] = dc ** 2 d1[0, 0] = dc * dc
d1[0, 1] = -db ** 2 d1[0, 1] = -(db*db)
d1[1, 0] = -dc ** 3 d1[1, 0] = -(dc*dc*dc)
d1[1, 1] = db ** 3 d1[1, 1] = db*db*db
[A, B] = np.dot(d1, np.asarray([fb - fa - C * db, [A, B] = np.dot(d1, np.asarray([fb - fa - C * db,
fc - fa - C * dc]).flatten()) fc - fa - C * dc]).flatten())
A /= denom A /= denom
...@@ -361,11 +361,11 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -361,11 +361,11 @@ class LineSearchStrongWolfe(LineSearch):
def _quadmin(self, a, fa, fpa, b, fb): def _quadmin(self, a, fa, fpa, b, fb):
"""Estimating the minimum with quadratic interpolation. """Estimating the minimum with quadratic interpolation.
Finds the minimizer for a quadratic polynomial that goes through Finds the minimizer for a quadratic polynomial that goes through
the points ( a,f(a) ), ( b,f(b) ) with derivative at point a of fpa. the points ( a,f(a) ), ( b,f(b) ) with derivative at point a of fpa.
f(x) = B*(x-a)^2 + C*(x-a) + D f(x) = B*(x-a)^2 + C*(x-a) + D
Parameters Parameters
---------- ----------
a : float a : float
...@@ -378,11 +378,11 @@ class LineSearchStrongWolfe(LineSearch): ...@@ -378,11 +378,11 @@ class LineSearchStrongWolfe(LineSearch):
Selected point. Selected point.
fb : float fb : float
Value of polynomial at point b. Value of polynomial at point b.
Returns Returns
------- -------
xmin : float xmin : float
Position of the approximated minimum. Position of the approximated minimum.
""" """
# f(x) = B*(x-a)^2 + C*(x-a) + D # f(x) = B*(x-a)^2 + C*(x-a) + D
with np.errstate(divide='raise', over='raise', invalid='raise'): with np.errstate(divide='raise', over='raise', invalid='raise'):
......
...@@ -118,7 +118,7 @@ class RGRGTransformation(Transformation): ...@@ -118,7 +118,7 @@ class RGRGTransformation(Transformation):
np.absolute(np.array(domain.shape) * np.absolute(np.array(domain.shape) *
np.array(domain.distances) * np.array(domain.distances) *
np.array(codomain.distances) - 1) < np.array(codomain.distances) - 1) <
10**-7): 1e-7):
raise AttributeError("The grid-distances of domain and codomain " raise AttributeError("The grid-distances of domain and codomain "
"do not match.") "do not match.")
......
...@@ -93,11 +93,11 @@ class HPSpace(Space): ...@@ -93,11 +93,11 @@ class HPSpace(Space):
@property @property
def shape(self): def shape(self):
return (np.int(12 * self.nside ** 2),) return (np.int(12 * self.nside * self.nside),)
@property @property
def dim(self): def dim(self):
return np.int(12 * self.nside ** 2) return np.int(12 * self.nside * self.nside)
@property @property
def total_volume(self): def total_volume(self):
...@@ -108,7 +108,7 @@ class HPSpace(Space): ...@@ -108,7 +108,7 @@ class HPSpace(Space):
def weight(self, x, power=1, axes=None, inplace=False): def weight(self, x, power=1, axes=None, inplace=False):
weight = ((4 * np.pi) / (12 * self.nside**2)) ** np.float(power) weight = ((4*np.pi) / (12*self.nside*self.nside)) ** np.float(power)
if inplace: if inplace:
x *= weight x *= weight
......
...@@ -130,7 +130,7 @@ class LMSpace(Space): ...@@ -130,7 +130,7 @@ class LMSpace(Space):
# dim = (((2*(l+1)-1)+1)**2/4 - 2 * (l-m)(l-m+1)/2 # dim = (((2*(l+1)-1)+1)**2/4 - 2 * (l-m)(l-m+1)/2
# dim = np.int((l+1)**2 - (l-m)*(l-m+1.)) # dim = np.int((l+1)**2 - (l-m)*(l-m+1.))
# We fix l == m # We fix l == m
return np.int((l+1)**2) return np.int((l+1)*(l+1))
@property @property
def total_volume(self): def total_volume(self):
...@@ -166,7 +166,7 @@ class LMSpace(Space): ...@@ -166,7 +166,7 @@ class LMSpace(Space):
def get_fft_smoothing_kernel_function(self, sigma): def get_fft_smoothing_kernel_function(self, sigma):
# FIXME why x(x+1) ? add reference to paper! # FIXME why x(x+1) ? add reference to paper!
return lambda x: np.exp(-0.5 * x * (x + 1) * sigma**2) return lambda x: np.exp(-0.5 * x * (x + 1) * sigma*sigma)
# ---Added properties and methods--- # ---Added properties and methods---
......
...@@ -267,14 +267,16 @@ class RGSpace(Space): ...@@ -267,14 +267,16 @@ class RGSpace(Space):
cords = np.ogrid[inds] cords = np.ogrid[inds]
dists = ((cords[0] - shape[0]//2)*dk[0])**2 dists = (cords[0] - shape[0]//2)*dk[0]
dists *= dists
# apply zerocenterQ shift # apply zerocenterQ shift
if not self.zerocenter[0]: if not self.zerocenter[0]:
dists = np.fft.ifftshift(dists) dists = np.fft.ifftshift(dists)
# only save the individual slice # only save the individual slice
dists = dists[slice_of_first_dimension] dists = dists[slice_of_first_dimension]
for ii in range(1, len(shape)): for ii in range(1, len(shape)):
temp = ((cords[ii] - shape[ii] // 2) * dk[ii])**2 temp = (cords[ii] - shape[ii] // 2) * dk[ii]
temp *= temp
if not self.zerocenter[ii]: if not self.zerocenter[ii]:
temp = np.fft.ifftshift(temp) temp = np.fft.ifftshift(temp)
dists = dists + temp dists = dists + temp
...@@ -282,7 +284,7 @@ class RGSpace(Space): ...@@ -282,7 +284,7 @@ class RGSpace(Space):
return dists return dists
def get_fft_smoothing_kernel_function(self, sigma): def get_fft_smoothing_kernel_function(self, sigma):
return lambda x: np.exp(-0.5 * np.pi**2 * x**2 * sigma**2) return lambda x: np.exp(-0.5 * np.pi*np.pi * x*x * sigma*sigma)
# ---Added properties and methods--- # ---Added properties and methods---
......
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