[yt-svn] commit/yt: 2 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Tue Jan 31 10:58:32 PST 2017


2 new commits in yt:

https://bitbucket.org/yt_analysis/yt/commits/fce3ce84ec14/
Changeset:   fce3ce84ec14
Branch:      yt
User:        ngoldbaum
Date:        2017-01-25 17:32:45+00:00
Summary:     Mutate MutableAttribute instances via attribute setting rather than indexing

This fixes an issue reported by Jonathan Slavin on the mailing list.

Since PR 2251 (https://bitbucket.org/yt_analysis/yt/pull-requests/2251), dataset
attributes that contain ndarray data are not managed using the
`MutableAttribute` descriptor. This ensures that it's impossible for a user to
accidentally overwrite simulation metadata, which can happen unintentionally if
(say) someone creates a reference to the attribute and then mutates
*that*. Unfortunately this also makes it more difficult to mutate these
attributes when we *want* to, like when we are setting them in the various
frontends. Unfortunately this design leads to silent brokenness when we *do* try
to mutate a MutableAttribute via indexing in a frontend - since we are only
mutating a copy and not the original data stored in the MutableAttribute.

I think I've found all of the places in frontends where we try to mutate a
MutableAttribute via indexing rather than attribute setting.

If someone has ideas about how to do this in a way that's less surprising to
frontend authors, I'd very much appreciate some advice.
Affected #:  4 files

diff -r 5c3af8da1dd806d6f5d76466e04feade4b1d6e5f -r fce3ce84ec14377539ca9d54576bb0e2560f2a8f yt/frontends/boxlib/data_structures.py
--- a/yt/frontends/boxlib/data_structures.py
+++ b/yt/frontends/boxlib/data_structures.py
@@ -666,7 +666,9 @@
         self.domain_right_edge = \
             np.concatenate([self.domain_right_edge, [1.0]])
         if self.geometry == "cylindrical":
-            self.domain_right_edge[2] = 2.0 * np.pi
+            dre = self.domain_right_edge
+            dre[2] = 2.0 * np.pi
+            self.domain_right_edge = dre
         tmp = self.domain_dimensions.tolist()
         tmp.append(1)
         self.domain_dimensions = np.array(tmp)

diff -r 5c3af8da1dd806d6f5d76466e04feade4b1d6e5f -r fce3ce84ec14377539ca9d54576bb0e2560f2a8f yt/frontends/fits/data_structures.py
--- a/yt/frontends/fits/data_structures.py
+++ b/yt/frontends/fits/data_structures.py
@@ -489,12 +489,15 @@
             self.domain_dimensions = np.append(self.domain_dimensions,
                                                [int(1)])
 
-        self.domain_left_edge = np.array([0.5]*3)
-        self.domain_right_edge = np.array([float(dim)+0.5 for dim in self.domain_dimensions])
+        domain_left_edge = np.array([0.5]*3)
+        domain_right_edge = np.array([float(dim)+0.5 for dim in self.domain_dimensions])
 
         if self.dimensionality == 2:
-            self.domain_left_edge[-1] = 0.5
-            self.domain_right_edge[-1] = 1.5
+            domain_left_edge[-1] = 0.5
+            domain_right_edge[-1] = 1.5
+
+        self.domain_left_edge = domain_left_edge
+        self.domain_right_edge = domain_right_edge
 
         # Get the simulation time
         try:
@@ -611,8 +614,10 @@
                 self.spectral_factor /= self.domain_dimensions[self.spec_axis]
                 mylog.info("Setting the spectral factor to %f" % (self.spectral_factor))
             Dz = self.domain_right_edge[self.spec_axis]-self.domain_left_edge[self.spec_axis]
-            self.domain_right_edge[self.spec_axis] = self.domain_left_edge[self.spec_axis] + \
-                                                     self.spectral_factor*Dz
+            dre = self.domain_right_edge
+            dre[self.spec_axis] = (self.domain_left_edge[self.spec_axis] +
+                                   self.spectral_factor*Dz)
+            self.domain_right_edge = dre
             self._dz /= self.spectral_factor
             self._p0 = (self._p0-0.5)*self.spectral_factor + 0.5
 

diff -r 5c3af8da1dd806d6f5d76466e04feade4b1d6e5f -r fce3ce84ec14377539ca9d54576bb0e2560f2a8f yt/frontends/flash/data_structures.py
--- a/yt/frontends/flash/data_structures.py
+++ b/yt/frontends/flash/data_structures.py
@@ -377,28 +377,32 @@
         if self.dimensionality == 1: nblocky = 1
 
         # Determine domain boundaries
-        self.domain_left_edge = np.array(
+        dle = np.array(
             [self.parameters["%smin" % ax] for ax in 'xyz']).astype("float64")
-        self.domain_right_edge = np.array(
+        dre = np.array(
             [self.parameters["%smax" % ax] for ax in 'xyz']).astype("float64")
         if self.dimensionality < 3:
             for d in [dimensionality]+list(range(3-dimensionality)):
-                if self.domain_left_edge[d] == self.domain_right_edge[d]:
-                    mylog.warning('Identical domain left edge and right edges '
-                                  'along dummy dimension (%i), attempting to read anyway' % d)
-                    self.domain_right_edge[d] = self.domain_left_edge[d]+1.0
+                if dle[d] == dre[d]:
+                    mylog.warning(
+                        'Identical domain left edge and right edges '
+                        'along dummy dimension (%i), attempting to read anyway'
+                        % d)
+                    dre[d] = dle[d]+1.0
         if self.dimensionality < 3 and self.geometry == "cylindrical":
             mylog.warning("Extending theta dimension to 2PI + left edge.")
-            self.domain_right_edge[2] = self.domain_left_edge[2] + 2*np.pi
+            dre[2] = dle[2] + 2*np.pi
         elif self.dimensionality < 3 and self.geometry == "polar":
             mylog.warning("Extending theta dimension to 2PI + left edge.")
-            self.domain_right_edge[1] = self.domain_left_edge[1] + 2*np.pi
+            dre[1] = dle[1] + 2*np.pi
         elif self.dimensionality < 3 and self.geometry == "spherical":
             mylog.warning("Extending phi dimension to 2PI + left edge.")
-            self.domain_right_edge[2] = self.domain_left_edge[2] + 2*np.pi
+            dre[2] = dle[2] + 2*np.pi
         if self.dimensionality == 1 and self.geometry == "spherical":
             mylog.warning("Extending theta dimension to PI + left edge.")
-            self.domain_right_edge[1] = self.domain_left_edge[1] + np.pi
+            dre[1] = dle[1] + np.pi
+        self.domain_left_edge = dle
+        self.domain_right_edge = dre
         self.domain_dimensions = \
             np.array([nblockx*nxb,nblocky*nyb,nblockz*nzb])
 

diff -r 5c3af8da1dd806d6f5d76466e04feade4b1d6e5f -r fce3ce84ec14377539ca9d54576bb0e2560f2a8f yt/frontends/ytdata/data_structures.py
--- a/yt/frontends/ytdata/data_structures.py
+++ b/yt/frontends/ytdata/data_structures.py
@@ -750,18 +750,19 @@
         self.base_domain_right_edge = self.domain_right_edge
         self.base_domain_dimensions = self.domain_dimensions
 
-        self.domain_dimensions = np.ones(3, dtype="int")
-        self.domain_dimensions[:self.dimensionality] = \
+        domain_dimensions = np.ones(3, dtype="int")
+        domain_dimensions[:self.dimensionality] = \
           self.profile_dimensions
-        self.domain_left_edge = np.zeros(3)
-        self.domain_right_edge = np.ones(3)
+        self.domain_dimensions = domain_dimensions
+        domain_left_edge = np.zeros(3)
+        domain_right_edge = np.ones(3)
         for i, ax in enumerate("xyz"[:self.dimensionality]):
             range_name = "%s_range" % ax
             my_range = self.parameters[range_name]
             if getattr(self, "%s_log" % ax, False):
                 my_range = np.log10(my_range)
-            self.domain_left_edge[i] = my_range[0]
-            self.domain_right_edge[i] = my_range[1]
+            domain_left_edge[i] = my_range[0]
+            domain_right_edge[i] = my_range[1]
             setattr(self, range_name, self.parameters[range_name])
 
             bin_field = "%s_field" % ax
@@ -772,6 +773,8 @@
                 self.parameters[bin_field] = \
                   tuple(self.parameters[bin_field].astype(str))
             setattr(self, bin_field, self.parameters[bin_field])
+        self.domain_left_edge = domain_left_edge
+        self.domain_right_edge = domain_right_edge
 
     def _setup_gas_alias(self):
         "Alias the grid type to gas with a field alias."


https://bitbucket.org/yt_analysis/yt/commits/2e2dcac8a83a/
Changeset:   2e2dcac8a83a
Branch:      yt
User:        ngoldbaum
Date:        2017-01-31 18:58:24+00:00
Summary:     Merged in ngoldbaum/yt (pull request #2501)

Mutate MutableAttribute instances via attribute setting rather than indexing
Affected #:  4 files

diff -r 12ab7e374fcbdd45e56622c9bae43cd9dd334b2c -r 2e2dcac8a83a1086033d4640cb4767373478a4ad yt/frontends/boxlib/data_structures.py
--- a/yt/frontends/boxlib/data_structures.py
+++ b/yt/frontends/boxlib/data_structures.py
@@ -666,7 +666,9 @@
         self.domain_right_edge = \
             np.concatenate([self.domain_right_edge, [1.0]])
         if self.geometry == "cylindrical":
-            self.domain_right_edge[2] = 2.0 * np.pi
+            dre = self.domain_right_edge
+            dre[2] = 2.0 * np.pi
+            self.domain_right_edge = dre
         tmp = self.domain_dimensions.tolist()
         tmp.append(1)
         self.domain_dimensions = np.array(tmp)

diff -r 12ab7e374fcbdd45e56622c9bae43cd9dd334b2c -r 2e2dcac8a83a1086033d4640cb4767373478a4ad yt/frontends/fits/data_structures.py
--- a/yt/frontends/fits/data_structures.py
+++ b/yt/frontends/fits/data_structures.py
@@ -489,12 +489,15 @@
             self.domain_dimensions = np.append(self.domain_dimensions,
                                                [int(1)])
 
-        self.domain_left_edge = np.array([0.5]*3)
-        self.domain_right_edge = np.array([float(dim)+0.5 for dim in self.domain_dimensions])
+        domain_left_edge = np.array([0.5]*3)
+        domain_right_edge = np.array([float(dim)+0.5 for dim in self.domain_dimensions])
 
         if self.dimensionality == 2:
-            self.domain_left_edge[-1] = 0.5
-            self.domain_right_edge[-1] = 1.5
+            domain_left_edge[-1] = 0.5
+            domain_right_edge[-1] = 1.5
+
+        self.domain_left_edge = domain_left_edge
+        self.domain_right_edge = domain_right_edge
 
         # Get the simulation time
         try:
@@ -611,8 +614,10 @@
                 self.spectral_factor /= self.domain_dimensions[self.spec_axis]
                 mylog.info("Setting the spectral factor to %f" % (self.spectral_factor))
             Dz = self.domain_right_edge[self.spec_axis]-self.domain_left_edge[self.spec_axis]
-            self.domain_right_edge[self.spec_axis] = self.domain_left_edge[self.spec_axis] + \
-                                                     self.spectral_factor*Dz
+            dre = self.domain_right_edge
+            dre[self.spec_axis] = (self.domain_left_edge[self.spec_axis] +
+                                   self.spectral_factor*Dz)
+            self.domain_right_edge = dre
             self._dz /= self.spectral_factor
             self._p0 = (self._p0-0.5)*self.spectral_factor + 0.5
 

diff -r 12ab7e374fcbdd45e56622c9bae43cd9dd334b2c -r 2e2dcac8a83a1086033d4640cb4767373478a4ad yt/frontends/flash/data_structures.py
--- a/yt/frontends/flash/data_structures.py
+++ b/yt/frontends/flash/data_structures.py
@@ -377,28 +377,32 @@
         if self.dimensionality == 1: nblocky = 1
 
         # Determine domain boundaries
-        self.domain_left_edge = np.array(
+        dle = np.array(
             [self.parameters["%smin" % ax] for ax in 'xyz']).astype("float64")
-        self.domain_right_edge = np.array(
+        dre = np.array(
             [self.parameters["%smax" % ax] for ax in 'xyz']).astype("float64")
         if self.dimensionality < 3:
             for d in [dimensionality]+list(range(3-dimensionality)):
-                if self.domain_left_edge[d] == self.domain_right_edge[d]:
-                    mylog.warning('Identical domain left edge and right edges '
-                                  'along dummy dimension (%i), attempting to read anyway' % d)
-                    self.domain_right_edge[d] = self.domain_left_edge[d]+1.0
+                if dle[d] == dre[d]:
+                    mylog.warning(
+                        'Identical domain left edge and right edges '
+                        'along dummy dimension (%i), attempting to read anyway'
+                        % d)
+                    dre[d] = dle[d]+1.0
         if self.dimensionality < 3 and self.geometry == "cylindrical":
             mylog.warning("Extending theta dimension to 2PI + left edge.")
-            self.domain_right_edge[2] = self.domain_left_edge[2] + 2*np.pi
+            dre[2] = dle[2] + 2*np.pi
         elif self.dimensionality < 3 and self.geometry == "polar":
             mylog.warning("Extending theta dimension to 2PI + left edge.")
-            self.domain_right_edge[1] = self.domain_left_edge[1] + 2*np.pi
+            dre[1] = dle[1] + 2*np.pi
         elif self.dimensionality < 3 and self.geometry == "spherical":
             mylog.warning("Extending phi dimension to 2PI + left edge.")
-            self.domain_right_edge[2] = self.domain_left_edge[2] + 2*np.pi
+            dre[2] = dle[2] + 2*np.pi
         if self.dimensionality == 1 and self.geometry == "spherical":
             mylog.warning("Extending theta dimension to PI + left edge.")
-            self.domain_right_edge[1] = self.domain_left_edge[1] + np.pi
+            dre[1] = dle[1] + np.pi
+        self.domain_left_edge = dle
+        self.domain_right_edge = dre
         self.domain_dimensions = \
             np.array([nblockx*nxb,nblocky*nyb,nblockz*nzb])
 

diff -r 12ab7e374fcbdd45e56622c9bae43cd9dd334b2c -r 2e2dcac8a83a1086033d4640cb4767373478a4ad yt/frontends/ytdata/data_structures.py
--- a/yt/frontends/ytdata/data_structures.py
+++ b/yt/frontends/ytdata/data_structures.py
@@ -750,18 +750,19 @@
         self.base_domain_right_edge = self.domain_right_edge
         self.base_domain_dimensions = self.domain_dimensions
 
-        self.domain_dimensions = np.ones(3, dtype="int")
-        self.domain_dimensions[:self.dimensionality] = \
+        domain_dimensions = np.ones(3, dtype="int")
+        domain_dimensions[:self.dimensionality] = \
           self.profile_dimensions
-        self.domain_left_edge = np.zeros(3)
-        self.domain_right_edge = np.ones(3)
+        self.domain_dimensions = domain_dimensions
+        domain_left_edge = np.zeros(3)
+        domain_right_edge = np.ones(3)
         for i, ax in enumerate("xyz"[:self.dimensionality]):
             range_name = "%s_range" % ax
             my_range = self.parameters[range_name]
             if getattr(self, "%s_log" % ax, False):
                 my_range = np.log10(my_range)
-            self.domain_left_edge[i] = my_range[0]
-            self.domain_right_edge[i] = my_range[1]
+            domain_left_edge[i] = my_range[0]
+            domain_right_edge[i] = my_range[1]
             setattr(self, range_name, self.parameters[range_name])
 
             bin_field = "%s_field" % ax
@@ -772,6 +773,8 @@
                 self.parameters[bin_field] = \
                   tuple(self.parameters[bin_field].astype(str))
             setattr(self, bin_field, self.parameters[bin_field])
+        self.domain_left_edge = domain_left_edge
+        self.domain_right_edge = domain_right_edge
 
     def _setup_gas_alias(self):
         "Alias the grid type to gas with a field alias."

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list