Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
NIFTy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
13
Issues
13
List
Boards
Labels
Service Desk
Milestones
Merge Requests
11
Merge Requests
11
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ift
NIFTy
Commits
444c0c2d
Commit
444c0c2d
authored
May 16, 2017
by
Theo Steininger
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'Real-Field_Synthesizer' into 'master'
Real field synthesizer See merge request
!125
parents
b15cc6fa
f222436d
Pipeline
#12549
passed with stages
in 11 minutes and 6 seconds
Changes
7
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
81 additions
and
16 deletions
+81
-16
ci/requirements.txt
ci/requirements.txt
+1
-0
ci/requirements_base.txt
ci/requirements_base.txt
+1
-0
nifty/field.py
nifty/field.py
+49
-8
nifty/spaces/lm_space/lm_space.py
nifty/spaces/lm_space/lm_space.py
+4
-1
nifty/spaces/rg_space/rg_space.py
nifty/spaces/rg_space/rg_space.py
+23
-4
test/test_spaces/test_lm_space.py
test/test_spaces/test_lm_space.py
+1
-1
test/test_spaces/test_rg_space.py
test/test_spaces/test_rg_space.py
+2
-2
No files found.
ci/requirements.txt
View file @
444c0c2d
numpy
cython
mpi4py
matplotlib
plotly
...
...
ci/requirements_base.txt
View file @
444c0c2d
numpy
cython
nose
parameterized
coverage
...
...
nifty/field.py
View file @
444c0c2d
...
...
@@ -17,6 +17,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from
__future__
import
division
import
itertools
import
numpy
as
np
from
keepers
import
Versionable
,
\
...
...
@@ -104,6 +106,7 @@ class Field(Loggable, Versionable, object):
distributed_data_object
"""
# ---Initialization methods---
def
__init__
(
self
,
domain
=
None
,
val
=
None
,
dtype
=
None
,
...
...
@@ -554,14 +557,12 @@ class Field(Loggable, Versionable, object):
inplace
=
True
)
if
real_signal
:
for
power_space_index
in
spaces
:
harmonic_domain
=
result_domain
[
power_space_index
]
result_val_list
=
[
harmonic_domain
.
hermitian_decomposition
(
result_val_list
=
[
self
.
_hermitian_decomposition
(
result_domain
,
result_val
,
axes
=
result
.
domain_axes
[
power_space_index
],
preserve_gaussian_variance
=
True
)[
0
]
for
(
result
,
result_val
)
in
zip
(
result_list
,
result_val_list
)]
spaces
,
result_list
[
0
].
domain_axes
)[
0
]
for
result_val
in
result_val_list
]
# store the result into the fields
[
x
.
set_val
(
new_val
=
y
,
copy
=
False
)
for
x
,
y
in
...
...
@@ -574,6 +575,46 @@ class Field(Loggable, Versionable, object):
return
result
@
staticmethod
def
_hermitian_decomposition
(
domain
,
val
,
spaces
,
domain_axes
):
# hermitianize for the first space
(
h
,
a
)
=
domain
[
spaces
[
0
]].
hermitian_decomposition
(
val
,
domain_axes
[
spaces
[
0
]])
# hermitianize all remaining spaces using the iterative formula
for
space
in
xrange
(
1
,
len
(
spaces
)):
(
hh
,
ha
)
=
\
domain
[
space
].
hermitian_decomposition
(
h
,
domain_axes
[
space
])
(
ah
,
aa
)
=
\
domain
[
space
].
hermitian_decomposition
(
a
,
domain_axes
[
space
])
c
=
(
hh
-
ha
-
ah
+
aa
).
conjugate
()
h
=
(
val
+
c
)
/
2.
a
=
(
val
-
c
)
/
2.
# correct variance
fixed_points
=
[
domain
[
i
].
hermitian_fixed_points
()
for
i
in
spaces
]
# check if there was at least one flipping during hermitianization
flipped_Q
=
np
.
any
([
fp
is
not
None
for
fp
in
fixed_points
])
# if the array got flipped, correct the variance
if
flipped_Q
:
h
*=
np
.
sqrt
(
2
)
a
*=
np
.
sqrt
(
2
)
fixed_points
=
[[
fp
]
if
fp
is
None
else
fp
for
fp
in
fixed_points
]
for
product_point
in
itertools
.
product
(
*
fixed_points
):
slice_object
=
np
.
array
((
slice
(
None
),
)
*
len
(
val
.
shape
),
dtype
=
np
.
object
)
for
i
,
sp
in
enumerate
(
spaces
):
point_component
=
product_point
[
i
]
if
point_component
is
None
:
point_component
=
slice
(
None
)
slice_object
[
list
(
domain_axes
[
sp
])]
=
point_component
slice_object
=
tuple
(
slice_object
)
h
[
slice_object
]
/=
np
.
sqrt
(
2
)
a
[
slice_object
]
/=
np
.
sqrt
(
2
)
return
(
h
,
a
)
def
_spec_to_rescaler
(
self
,
spec
,
result_list
,
power_space_index
):
power_space
=
self
.
domain
[
power_space_index
]
...
...
nifty/spaces/lm_space/lm_space.py
View file @
444c0c2d
...
...
@@ -94,9 +94,12 @@ class LMSpace(Space):
hermitian_part
=
x
.
copy_empty
()
anti_hermitian_part
=
x
.
copy_empty
()
hermitian_part
[:]
=
x
.
real
anti_hermitian_part
[:]
=
x
.
imag
anti_hermitian_part
[:]
=
x
.
imag
*
1j
return
(
hermitian_part
,
anti_hermitian_part
)
def
hermitian_fixed_points
(
self
):
return
None
# ---Mandatory properties and methods---
@
property
...
...
nifty/spaces/rg_space/rg_space.py
View file @
444c0c2d
...
...
@@ -110,7 +110,7 @@ class RGSpace(Space):
hermitian_part
/=
2.
# use subtraction since it is faster than flipping another time
anti_hermitian_part
=
(
x
-
hermitian_part
)
/
1j
anti_hermitian_part
=
(
x
-
hermitian_part
)
if
preserve_gaussian_variance
:
hermitian_part
,
anti_hermitian_part
=
\
...
...
@@ -120,6 +120,18 @@ class RGSpace(Space):
return
(
hermitian_part
,
anti_hermitian_part
)
def
hermitian_fixed_points
(
self
):
shape
=
self
.
shape
mid_index
=
np
.
array
(
shape
)
//
2
ndlist
=
[
2
if
(
shape
[
i
]
%
2
==
0
)
else
1
for
i
in
xrange
(
len
(
shape
))]
ndlist
=
tuple
(
ndlist
)
odd_axes_list
=
np
.
array
([
1
if
(
shape
[
i
]
%
2
==
1
)
else
0
for
i
in
xrange
(
len
(
shape
))])
fixed_points
=
[]
for
i
in
np
.
ndindex
(
ndlist
):
fixed_points
+=
[
tuple
((
i
+
odd_axes_list
)
*
mid_index
)]
return
fixed_points
def
_hermitianize_correct_variance
(
self
,
hermitian_part
,
anti_hermitian_part
,
axes
):
# Correct the variance by multiplying sqrt(2)
...
...
@@ -145,8 +157,9 @@ class RGSpace(Space):
return
hermitian_part
,
anti_hermitian_part
def
_hermitianize_inverter
(
self
,
x
,
axes
):
shape
=
x
.
shape
# calculate the number of dimensions the input array has
dimensions
=
len
(
x
.
shape
)
dimensions
=
len
(
shape
)
# prepare the slicing object which will be used for mirroring
slice_primitive
=
[
slice
(
None
),
]
*
dimensions
# copy the input data
...
...
@@ -158,11 +171,17 @@ class RGSpace(Space):
# flip in the desired directions
for
i
in
axes
:
slice_picker
=
slice_primitive
[:]
if
shape
[
i
]
%
2
==
0
:
slice_picker
[
i
]
=
slice
(
1
,
None
,
None
)
else
:
slice_picker
[
i
]
=
slice
(
None
)
slice_picker
=
tuple
(
slice_picker
)
slice_inverter
=
slice_primitive
[:]
if
shape
[
i
]
%
2
==
0
:
slice_inverter
[
i
]
=
slice
(
None
,
0
,
-
1
)
else
:
slice_inverter
[
i
]
=
slice
(
None
,
None
,
-
1
)
slice_inverter
=
tuple
(
slice_inverter
)
try
:
...
...
test/test_spaces/test_lm_space.py
View file @
444c0c2d
...
...
@@ -116,7 +116,7 @@ class LMSpaceFunctionalityTests(unittest.TestCase):
real
)
assert_almost_equal
(
l
.
hermitian_decomposition
(
distributed_data_object
(
x
))[
1
],
imag
)
imag
*
1j
)
@
expand
(
get_weight_configs
())
def
test_weight
(
self
,
x
,
power
,
axes
,
inplace
,
expected
):
...
...
test/test_spaces/test_rg_space.py
View file @
444c0c2d
...
...
@@ -162,7 +162,7 @@ def get_hermitian_configs():
[
0.37928780
+
0.j
,
0.33013206
+
0.26511434j
,
0.48235714
+
0.j
,
0.33013206
-
0.26511434j
],
[
0.47773437
+
0.17342852j
,
0.31059374
+
0.02379381j
,
0.64003551
-
0.23838932j
,
0.27824437
-
0.0197826j
]])
0.27824437
-
0.0197826j
]])
*
1j
h_1_x
=
np
.
array
([
[[
0.23987021
+
0.41617749j
,
0.34605012
+
0.55462234j
,
0.07947035
+
0.73360723j
,
...
...
@@ -205,7 +205,7 @@ def get_hermitian_configs():
0.64466122
-
0.10318736j
],
[
0.19076379
+
0.j
,
0.49389371
+
0.03664104j
,
0.85091112
+
0.j
,
0.49389371
-
0.03664104j
]]
])
])
*
1j
return
[
[
h_0_x
,
None
,
h_0_res_real
,
h_0_res_imag
],
[
h_1_x
,
(
2
,),
h_1_res_real
,
h_1_res_imag
]
...
...
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