Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ift
NIFTy
Commits
05d1d092
Commit
05d1d092
authored
Jun 05, 2017
by
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
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
nifty/minimization/line_searching/line_search_strong_wolfe.py
View file @
05d1d092
...
...
@@ -23,29 +23,29 @@ from .line_search import LineSearch
class
LineSearchStrongWolfe
(
LineSearch
):
"""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
interval. If it does not satisfy the Wolfe conditions it performs the Zoom
algorithm (second stage). By interpolating it decreases the size of the
interval until an acceptable step length is found.
interval. If it does not satisfy the Wolfe conditions it performs the Zoom
algorithm (second stage). By interpolating it decreases the size of the
interval until an acceptable step length is found.
Parameters
----------
c1 : float
c1 : float
Parameter for Armijo condition rule. (Default: 1e-4)
c2 : float
Parameter for curvature condition rule. (Default: 0.9)
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)
max_iterations : integer
Maximum number of iterations performed by the line search algorithm.
(Default: 10)
max_zoom_iterations : integer
Maximum number of iterations performed by the zoom algorithm.
Maximum number of iterations performed by the zoom algorithm.
(Default: 10)
Attributes
----------
c1 : float
...
...
@@ -53,19 +53,18 @@ class LineSearchStrongWolfe(LineSearch):
c2 : float
Parameter for curvature condition rule.
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
Maximum number of iterations performed by the line search algorithm.
max_zoom_iterations : integer
Maximum number of iterations performed by the zoom algorithm.
"""
def
__init__
(
self
,
c1
=
1e-4
,
c2
=
0.9
,
max_step_size
=
50
,
max_iterations
=
10
,
max_zoom_iterations
=
10
):
super
(
LineSearchStrongWolfe
,
self
).
__init__
()
self
.
c1
=
np
.
float
(
c1
)
...
...
@@ -76,11 +75,11 @@ class LineSearchStrongWolfe(LineSearch):
def
perform_line_search
(
self
,
energy
,
pk
,
f_k_minus_1
=
None
):
"""Performs the first stage of the algorithm.
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
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
returns the optimal step length and the new enrgy.
Parameters
----------
energy : Energy object
...
...
@@ -89,9 +88,9 @@ class LineSearchStrongWolfe(LineSearch):
pk : Field
Unit vector pointing into the search direction.
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)
Returns
-------
alpha_star : float
...
...
@@ -100,9 +99,9 @@ class LineSearchStrongWolfe(LineSearch):
Value of the energy after the performed descent.
energy_star : Energy object
The new Energy object on the new position.
"""
"""
self
.
_set_line_energy
(
energy
,
pk
,
f_k_minus_1
=
f_k_minus_1
)
c1
=
self
.
c1
c2
=
self
.
c2
...
...
@@ -195,11 +194,11 @@ class LineSearchStrongWolfe(LineSearch):
def
_zoom
(
self
,
alpha_lo
,
alpha_hi
,
phi_0
,
phiprime_0
,
phi_lo
,
phiprime_lo
,
phi_hi
,
c1
,
c2
):
"""Performs the second stage of the line search algorithm.
If the first stage was not successful then the Zoom algorithm tries to
find a suitable step length by using bisection, quadratic, cubic
If the first stage was not successful then the Zoom algorithm tries to
find a suitable step length by using bisection, quadratic, cubic
interpolation.
Parameters
----------
alpha_lo : float
...
...
@@ -207,24 +206,24 @@ class LineSearchStrongWolfe(LineSearch):
alph_hi : float
The upper boundary for the step length interval.
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.
phiprime_0 : Field
Gradient at the starting point of the line search algorithm.
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.
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.
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.
c1 : float
Parameter for Armijo condition rule.
c2 : float
Parameter for curvature condition rule.
Returns
-------
alpha_star : float
...
...
@@ -233,7 +232,7 @@ class LineSearchStrongWolfe(LineSearch):
Value of the energy after the performed descent.
energy_star : Energy object
The new Energy object on the new position.
"""
max_iterations
=
self
.
max_zoom_iterations
# define the cubic and quadratic interpolant checks
...
...
@@ -306,12 +305,13 @@ class LineSearchStrongWolfe(LineSearch):
def
_cubicmin
(
self
,
a
,
fa
,
fpa
,
b
,
fb
,
c
,
fc
):
"""Estimating the minimum with cubic interpolation.
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
If no minimizer can be found return None
Parameters
----------
a : float
...
...
@@ -328,12 +328,12 @@ class LineSearchStrongWolfe(LineSearch):
Selected point.
fc : float
Value of polynomial at point c.
Returns
-------
xmin : float
Position of the approximated minimum.
"""
with
np
.
errstate
(
divide
=
'raise'
,
over
=
'raise'
,
invalid
=
'raise'
):
...
...
@@ -341,12 +341,12 @@ class LineSearchStrongWolfe(LineSearch):
C
=
fpa
db
=
b
-
a
dc
=
c
-
a
denom
=
(
db
*
dc
)
**
2
*
(
db
-
dc
)
denom
=
db
*
db
*
dc
*
dc
*
(
db
-
dc
)
d1
=
np
.
empty
((
2
,
2
))
d1
[
0
,
0
]
=
dc
*
*
2
d1
[
0
,
1
]
=
-
db
**
2
d1
[
1
,
0
]
=
-
dc
**
3
d1
[
1
,
1
]
=
db
**
3
d1
[
0
,
0
]
=
dc
*
dc
d1
[
0
,
1
]
=
-
(
db
*
db
)
d1
[
1
,
0
]
=
-
(
dc
*
dc
*
dc
)
d1
[
1
,
1
]
=
db
*
db
*
db
[
A
,
B
]
=
np
.
dot
(
d1
,
np
.
asarray
([
fb
-
fa
-
C
*
db
,
fc
-
fa
-
C
*
dc
]).
flatten
())
A
/=
denom
...
...
@@ -361,11 +361,11 @@ class LineSearchStrongWolfe(LineSearch):
def
_quadmin
(
self
,
a
,
fa
,
fpa
,
b
,
fb
):
"""Estimating the minimum with quadratic interpolation.
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.
f(x) = B*(x-a)^2 + C*(x-a) + D
Parameters
----------
a : float
...
...
@@ -378,11 +378,11 @@ class LineSearchStrongWolfe(LineSearch):
Selected point.
fb : float
Value of polynomial at point b.
Returns
-------
xmin : float
Position of the approximated minimum.
Position of the approximated minimum.
"""
# f(x) = B*(x-a)^2 + C*(x-a) + D
with
np
.
errstate
(
divide
=
'raise'
,
over
=
'raise'
,
invalid
=
'raise'
):
...
...
nifty/operators/fft_operator/transformations/rgrgtransformation.py
View file @
05d1d092
...
...
@@ -118,7 +118,7 @@ class RGRGTransformation(Transformation):
np
.
absolute
(
np
.
array
(
domain
.
shape
)
*
np
.
array
(
domain
.
distances
)
*
np
.
array
(
codomain
.
distances
)
-
1
)
<
1
0
**
-
7
):
1
e
-7
):
raise
AttributeError
(
"The grid-distances of domain and codomain "
"do not match."
)
...
...
nifty/spaces/hp_space/hp_space.py
View file @
05d1d092
...
...
@@ -93,11 +93,11 @@ class HPSpace(Space):
@
property
def
shape
(
self
):
return
(
np
.
int
(
12
*
self
.
nside
*
*
2
),)
return
(
np
.
int
(
12
*
self
.
nside
*
self
.
nside
),)
@
property
def
dim
(
self
):
return
np
.
int
(
12
*
self
.
nside
*
*
2
)
return
np
.
int
(
12
*
self
.
nside
*
self
.
nside
)
@
property
def
total_volume
(
self
):
...
...
@@ -108,7 +108,7 @@ class HPSpace(Space):
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
:
x
*=
weight
...
...
nifty/spaces/lm_space/lm_space.py
View file @
05d1d092
...
...
@@ -130,7 +130,7 @@ class LMSpace(Space):
# 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.))
# We fix l == m
return
np
.
int
((
l
+
1
)
*
*
2
)
return
np
.
int
((
l
+
1
)
*
(
l
+
1
)
)
@
property
def
total_volume
(
self
):
...
...
@@ -166,7 +166,7 @@ class LMSpace(Space):
def
get_fft_smoothing_kernel_function
(
self
,
sigma
):
# 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---
...
...
nifty/spaces/rg_space/rg_space.py
View file @
05d1d092
...
...
@@ -267,14 +267,16 @@ class RGSpace(Space):
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
if
not
self
.
zerocenter
[
0
]:
dists
=
np
.
fft
.
ifftshift
(
dists
)
# only save the individual slice
dists
=
dists
[
slice_of_first_dimension
]
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
]:
temp
=
np
.
fft
.
ifftshift
(
temp
)
dists
=
dists
+
temp
...
...
@@ -282,7 +284,7 @@ class RGSpace(Space):
return
dists
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---
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment