From 02647cdcfec11ced9faa471fd62ccb4bb55a840e Mon Sep 17 00:00:00 2001
From: Theo Steininger <theos@mpa-garching.mpg.de>
Date: Thu, 16 Feb 2017 09:42:20 +0100
Subject: [PATCH] Optimized set_diagonal in DiagonalOperator.

---
 nifty/field.py                                      |  2 +-
 .../diagonal_operator/diagonal_operator.py          | 13 +++++++++----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/nifty/field.py b/nifty/field.py
index 8a01b690a..3f2802536 100644
--- a/nifty/field.py
+++ b/nifty/field.py
@@ -90,7 +90,7 @@ class Field(Loggable, Versionable, object):
             elif isinstance(val, Field):
                 distribution_strategy = val.distribution_strategy
             else:
-                self.logger.info("Datamodel set to default!")
+                self.logger.debug("Datamodel set to default!")
                 distribution_strategy = gc['default_distribution_strategy']
         elif distribution_strategy not in DISTRIBUTION_STRATEGIES['global']:
             raise ValueError(
diff --git a/nifty/operators/diagonal_operator/diagonal_operator.py b/nifty/operators/diagonal_operator/diagonal_operator.py
index 9ad0e2f19..3000ecaa4 100644
--- a/nifty/operators/diagonal_operator/diagonal_operator.py
+++ b/nifty/operators/diagonal_operator/diagonal_operator.py
@@ -90,10 +90,15 @@ class DiagonalOperator(EndomorphicOperator):
 
     @property
     def symmetric(self):
+        if self._symmetric is None:
+            self._symmetric = (self._diagonal.val.imag == 0).all()
         return self._symmetric
 
     @property
     def unitary(self):
+        if self._unitary is None:
+            self._unitary = (self._diagonal.val *
+                             self._diagonal.val.conjugate() == 1).all()
         return self._unitary
 
     # ---Added properties and methods---
@@ -134,11 +139,11 @@ class DiagonalOperator(EndomorphicOperator):
             # Otherwise, inplace weightening would change the external field
             f.weight(inplace=copy, power=-1)
 
-        # check if the operator is symmetric:
-        self._symmetric = (f.val.imag == 0).all()
+        # Reset the symmetric property:
+        self._symmetric = None
 
-        # check if the operator is unitary:
-        self._unitary = (f.val * f.val.conjugate() == 1).all()
+        # Reset the unitarity property
+        self._unitary = None
 
         # store the diagonal-field
         self._diagonal = f
-- 
GitLab