From 4fd78c1041a6d92cd4a48c6d089f58ef0b80f572 Mon Sep 17 00:00:00 2001
From: Lukas Platz <lplatz@mpa-garching.mpg.de>
Date: Tue, 29 Oct 2019 16:24:56 +0100
Subject: [PATCH] add ift.log10, Field.log10, Linearization.log10

---
 nifty5/data_objects/distributed_do.py | 4 ++--
 nifty5/data_objects/numpy_do.py       | 8 +++++---
 nifty5/field.py                       | 2 +-
 nifty5/linearization.py               | 5 +++++
 nifty5/operators/operator.py          | 2 +-
 nifty5/sugar.py                       | 2 +-
 test/test_field.py                    | 2 +-
 test/test_linearization.py            | 2 +-
 8 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/nifty5/data_objects/distributed_do.py b/nifty5/data_objects/distributed_do.py
index 765b77c4f..004e2949c 100644
--- a/nifty5/data_objects/distributed_do.py
+++ b/nifty5/data_objects/distributed_do.py
@@ -32,7 +32,7 @@ __all__ = ["ntask", "rank", "master", "local_shape", "data_object", "full",
            "redistribute", "default_distaxis", "is_numpy", "absmax", "norm",
            "lock", "locked", "uniform_full", "transpose", "to_global_data_rw",
            "ensure_not_distributed", "ensure_default_distributed",
-           "tanh", "conjugate", "sin", "cos", "tan",
+           "tanh", "conjugate", "sin", "cos", "tan", "log10",
            "sinh", "cosh", "sinc", "absolute", "sign", "clip"]
 
 _comm = MPI.COMM_WORLD
@@ -297,7 +297,7 @@ def _math_helper(x, function, out):
 _current_module = sys.modules[__name__]
 
 for f in ["sqrt", "exp", "log", "tanh", "conjugate", "sin", "cos", "tan",
-          "sinh", "cosh", "sinc", "absolute", "sign"]:
+          "sinh", "cosh", "sinc", "absolute", "sign", "log10"]:
     def func(f):
         def func2(x, out=None):
             return _math_helper(x, f, out)
diff --git a/nifty5/data_objects/numpy_do.py b/nifty5/data_objects/numpy_do.py
index ed0d96de8..02bd03fe8 100644
--- a/nifty5/data_objects/numpy_do.py
+++ b/nifty5/data_objects/numpy_do.py
@@ -18,9 +18,11 @@
 # Data object module that uses simple numpy ndarrays.
 
 import numpy as np
-from numpy import absolute, clip, cos, cosh, empty, empty_like, exp, full, log
 from numpy import ndarray as data_object
-from numpy import ones, sign, sin, sinc, sinh, sqrt, tan, tanh, vdot, zeros
+from numpy import empty, empty_like, ones, zeros, full
+from numpy import absolute, sign, clip, vdot
+from numpy import sin, cos, sinh, cosh, tan, tanh
+from numpy import exp, log, log10, sqrt, sinc
 
 from .random import Random
 
@@ -34,7 +36,7 @@ __all__ = ["ntask", "rank", "master", "local_shape", "data_object", "full",
            "lock", "locked", "uniform_full", "to_global_data_rw",
            "ensure_not_distributed", "ensure_default_distributed",
            "clip", "sin", "cos", "tan", "sinh",
-           "cosh", "absolute", "sign", "sinc"]
+           "cosh", "absolute", "sign", "sinc", "log10"]
 
 ntask = 1
 rank = 0
diff --git a/nifty5/field.py b/nifty5/field.py
index 5ba5fba3a..c04bbc649 100644
--- a/nifty5/field.py
+++ b/nifty5/field.py
@@ -682,7 +682,7 @@ for op in ["__iadd__", "__isub__", "__imul__", "__idiv__",
         return func2
     setattr(Field, op, func(op))
 
-for f in ["sqrt", "exp", "log", "tanh",
+for f in ["sqrt", "exp", "log", "log10", "tanh",
           "sin", "cos", "tan", "cosh", "sinh",
           "absolute", "sinc", "sign"]:
     def func(f):
diff --git a/nifty5/linearization.py b/nifty5/linearization.py
index 6c5b8cb20..816c74d32 100644
--- a/nifty5/linearization.py
+++ b/nifty5/linearization.py
@@ -330,6 +330,11 @@ class Linearization(object):
         tmp = self._val.log()
         return self.new(tmp, makeOp(1./self._val)(self._jac))
 
+    def log10(self):
+        tmp = self._val.log10()
+        tmp2 = 1. / (self._val * np.log(10))
+        return self.new(tmp, makeOp(tmp2)(self._jac))
+
     def sinh(self):
         tmp = self._val.sinh()
         tmp2 = self._val.cosh()
diff --git a/nifty5/operators/operator.py b/nifty5/operators/operator.py
index 21a8c6a89..90b88f784 100644
--- a/nifty5/operators/operator.py
+++ b/nifty5/operators/operator.py
@@ -159,7 +159,7 @@ class Operator(metaclass=NiftyMeta):
 
 
 for f in ["sqrt", "exp", "log", "tanh", "sigmoid", 'sin', 'cos', 'tan',
-          'sinh', 'cosh', 'absolute', 'sinc', 'one_over']:
+          'sinh', 'cosh', 'absolute', 'sinc', 'one_over', 'log10']:
     def func(f):
         def func2(self):
             fa = _FunctionApplier(self.target, f)
diff --git a/nifty5/sugar.py b/nifty5/sugar.py
index ffd775e84..26d78903d 100644
--- a/nifty5/sugar.py
+++ b/nifty5/sugar.py
@@ -389,7 +389,7 @@ def domain_union(domains):
 
 _current_module = sys.modules[__name__]
 
-for f in ["sqrt", "exp", "log", "tanh", "sigmoid",
+for f in ["sqrt", "exp", "log", "log10", "tanh", "sigmoid",
           "conjugate", 'sin', 'cos', 'tan', 'sinh', 'cosh',
           'absolute', 'one_over', 'sinc']:
     def func(f):
diff --git a/test/test_field.py b/test/test_field.py
index 325cae05f..b52baf93f 100644
--- a/test/test_field.py
+++ b/test/test_field.py
@@ -329,7 +329,7 @@ def test_emptydomain():
 @pmp('dom', [ift.RGSpace((8,), harmonic=True), ()])
 @pmp('func', [
     "exp", "log", "sin", "cos", "tan", "sinh", "cosh", "sinc", "absolute",
-    "sign"
+    "sign", "log10"
 ])
 def test_funcs(num, dom, func):
     num = 5
diff --git a/test/test_linearization.py b/test/test_linearization.py
index f9973900e..fa0c49e68 100644
--- a/test/test_linearization.py
+++ b/test/test_linearization.py
@@ -54,7 +54,7 @@ def test_special_gradients():
 
 @pmp('f', [
     'log', 'exp', 'sqrt', 'sin', 'cos', 'tan', 'sinc', 'sinh', 'cosh', 'tanh',
-    'absolute', 'one_over', 'sigmoid'
+    'absolute', 'one_over', 'sigmoid', 'log10'
 ])
 def test_actual_gradients(f):
     dom = ift.UnstructuredDomain((1,))
-- 
GitLab