pymc3/step_methods/hmc/nuts.py

Killed 149 out of 232 mutants

Survived

Survived mutation testing. These mutants show holes in your test suite.

Mutant 352

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -30,7 +30,7 @@
 def logbern(log_p):
     if np.isnan(log_p):
         raise FloatingPointError("log_p can't be nan.")
-    return np.log(nr.uniform()) < log_p
+    return np.log(nr.uniform()) <= log_p
 
 
 class NUTS(BaseHMC):

Mutant 353

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -84,7 +84,7 @@
        Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo.
     """
 
-    name = 'nuts'
+    name = 'XXnutsXX'
 
     default_blocked = True
     generates_stats = True

Mutant 354

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -84,7 +84,7 @@
        Sampler: Adaptively Setting Path Lengths in Hamiltonian Monte Carlo.
     """
 
-    name = 'nuts'
+    name = None
 
     default_blocked = True
     generates_stats = True

Mutant 355

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -86,7 +86,7 @@
 
     name = 'nuts'
 
-    default_blocked = True
+    default_blocked = False
     generates_stats = True
     stats_dtypes = [{
         'depth': np.int64,

Mutant 356

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -86,7 +86,7 @@
 
     name = 'nuts'
 
-    default_blocked = True
+    default_blocked = None
     generates_stats = True
     stats_dtypes = [{
         'depth': np.int64,

Mutant 370

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -102,7 +102,7 @@
         'model_logp': np.float64,
     }]
 
-    def __init__(self, vars=None, max_treedepth=10, early_max_treedepth=8,
+    def __init__(self, vars=None, max_treedepth=11, early_max_treedepth=8,
                  **kwargs):
         R"""Set up the No-U-Turn sampler.
 

Mutant 371

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -102,7 +102,7 @@
         'model_logp': np.float64,
     }]
 
-    def __init__(self, vars=None, max_treedepth=10, early_max_treedepth=8,
+    def __init__(self, vars=None, max_treedepth=10, early_max_treedepth=9,
                  **kwargs):
         R"""Set up the No-U-Turn sampler.
 

Mutant 374

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -163,7 +163,7 @@
 
         self.max_treedepth = max_treedepth
         self.early_max_treedepth = early_max_treedepth
-        self._reached_max_treedepth = 0
+        self._reached_max_treedepth = 1
 
     def _hamiltonian_step(self, start, p0, step_size):
         if self.tune and self.iter_count < 200:

Mutant 376

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -166,7 +166,7 @@
         self._reached_max_treedepth = 0
 
     def _hamiltonian_step(self, start, p0, step_size):
-        if self.tune and self.iter_count < 200:
+        if self.tune and self.iter_count <= 200:
             max_treedepth = self.early_max_treedepth
         else:
             max_treedepth = self.max_treedepth

Mutant 377

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -166,7 +166,7 @@
         self._reached_max_treedepth = 0
 
     def _hamiltonian_step(self, start, p0, step_size):
-        if self.tune and self.iter_count < 200:
+        if self.tune and self.iter_count < 201:
             max_treedepth = self.early_max_treedepth
         else:
             max_treedepth = self.max_treedepth

Mutant 378

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -166,7 +166,7 @@
         self._reached_max_treedepth = 0
 
     def _hamiltonian_step(self, start, p0, step_size):
-        if self.tune and self.iter_count < 200:
+        if self.tune or self.iter_count < 200:
             max_treedepth = self.early_max_treedepth
         else:
             max_treedepth = self.max_treedepth

Mutant 382

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -174,7 +174,7 @@
         tree = _Tree(len(p0), self.integrator, start, step_size, self.Emax)
 
         for _ in range(max_treedepth):
-            direction = logbern(np.log(0.5)) * 2 - 1
+            direction = logbern(np.log(1.5)) * 2 - 1
             divergence_info, turning = tree.extend(direction)
 
             if divergence_info or turning:

Mutant 384

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -174,7 +174,7 @@
         tree = _Tree(len(p0), self.integrator, start, step_size, self.Emax)
 
         for _ in range(max_treedepth):
-            direction = logbern(np.log(0.5)) * 2 - 1
+            direction = logbern(np.log(0.5)) * 3 - 1
             divergence_info, turning = tree.extend(direction)
 
             if divergence_info or turning:

Mutant 385

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -174,7 +174,7 @@
         tree = _Tree(len(p0), self.integrator, start, step_size, self.Emax)
 
         for _ in range(max_treedepth):
-            direction = logbern(np.log(0.5)) * 2 - 1
+            direction = logbern(np.log(0.5)) * 2 + 1
             divergence_info, turning = tree.extend(direction)
 
             if divergence_info or turning:

Mutant 394

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -187,7 +187,6 @@
         accept_stat = stats['mean_tree_accept']
         return HMCStepData(tree.proposal, accept_stat, divergence_info, stats)
 
-    @staticmethod
     def competence(var, has_grad):
         """Check how appropriate this class is for sampling a random variable."""
         if var.dtype in continuous_types and has_grad:

Mutant 398

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -199,7 +199,7 @@
         n_samples = self._samples_after_tune
         n_treedepth = self._reached_max_treedepth
 
-        if n_samples > 0 and n_treedepth / float(n_samples) > 0.05:
+        if n_samples >= 0 and n_treedepth / float(n_samples) > 0.05:
             msg = ('The chain reached the maximum tree depth. Increase '
                    'max_treedepth, increase target_accept or reparameterize.')
             warn = SamplerWarning(WarningType.TREEDEPTH, msg, 'warn',

Mutant 399

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -199,7 +199,7 @@
         n_samples = self._samples_after_tune
         n_treedepth = self._reached_max_treedepth
 
-        if n_samples > 0 and n_treedepth / float(n_samples) > 0.05:
+        if n_samples > 1 and n_treedepth / float(n_samples) > 0.05:
             msg = ('The chain reached the maximum tree depth. Increase '
                    'max_treedepth, increase target_accept or reparameterize.')
             warn = SamplerWarning(WarningType.TREEDEPTH, msg, 'warn',

Mutant 400

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -199,7 +199,7 @@
         n_samples = self._samples_after_tune
         n_treedepth = self._reached_max_treedepth
 
-        if n_samples > 0 and n_treedepth / float(n_samples) > 0.05:
+        if n_samples > 0 and n_treedepth * float(n_samples) > 0.05:
             msg = ('The chain reached the maximum tree depth. Increase '
                    'max_treedepth, increase target_accept or reparameterize.')
             warn = SamplerWarning(WarningType.TREEDEPTH, msg, 'warn',

Mutant 401

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -199,7 +199,7 @@
         n_samples = self._samples_after_tune
         n_treedepth = self._reached_max_treedepth
 
-        if n_samples > 0 and n_treedepth / float(n_samples) > 0.05:
+        if n_samples > 0 and n_treedepth / float(n_samples) >= 0.05:
             msg = ('The chain reached the maximum tree depth. Increase '
                    'max_treedepth, increase target_accept or reparameterize.')
             warn = SamplerWarning(WarningType.TREEDEPTH, msg, 'warn',

Mutant 402

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -199,7 +199,7 @@
         n_samples = self._samples_after_tune
         n_treedepth = self._reached_max_treedepth
 
-        if n_samples > 0 and n_treedepth / float(n_samples) > 0.05:
+        if n_samples > 0 and n_treedepth / float(n_samples) > 1.05:
             msg = ('The chain reached the maximum tree depth. Increase '
                    'max_treedepth, increase target_accept or reparameterize.')
             warn = SamplerWarning(WarningType.TREEDEPTH, msg, 'warn',

Mutant 403

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -199,7 +199,7 @@
         n_samples = self._samples_after_tune
         n_treedepth = self._reached_max_treedepth
 
-        if n_samples > 0 and n_treedepth / float(n_samples) > 0.05:
+        if n_samples > 0 or n_treedepth / float(n_samples) > 0.05:
             msg = ('The chain reached the maximum tree depth. Increase '
                    'max_treedepth, increase target_accept or reparameterize.')
             warn = SamplerWarning(WarningType.TREEDEPTH, msg, 'warn',

Mutant 404

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -209,7 +209,7 @@
 
 
 # A proposal for the next position
-Proposal = namedtuple("Proposal", "q, q_grad, energy, log_p_accept, logp")
+Proposal = namedtuple("XXProposalXX", "q, q_grad, energy, log_p_accept, logp")
 
 # A subtree of the binary tree built by nuts.
 Subtree = namedtuple(

Mutant 407

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -213,7 +213,7 @@
 
 # A subtree of the binary tree built by nuts.
 Subtree = namedtuple(
-    "Subtree",
+    "XXSubtreeXX",
     "left, right, p_sum, proposal, log_size, log_accept_sum, n_proposals")
 
 

Mutant 410

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -233,7 +233,7 @@
             The maximum energy change to accept before aborting the
             transition as diverging.
         """
-        self.ndim = ndim
+        self.ndim = None
         self.integrator = integrator
         self.start = start
         self.step_size = step_size

Mutant 417

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -242,7 +242,7 @@
 
         self.left = self.right = start
         self.proposal = Proposal(
-            start.q, start.q_grad, start.energy, 1.0, start.model_logp)
+            start.q, start.q_grad, start.energy, 2.0, start.model_logp)
         self.depth = 0
         self.log_size = 0
         self.log_accept_sum = -np.inf

Mutant 419

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -243,7 +243,7 @@
         self.left = self.right = start
         self.proposal = Proposal(
             start.q, start.q_grad, start.energy, 1.0, start.model_logp)
-        self.depth = 0
+        self.depth = 1
         self.log_size = 0
         self.log_accept_sum = -np.inf
         self.mean_tree_accept = 0.

Mutant 425

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -246,7 +246,7 @@
         self.depth = 0
         self.log_size = 0
         self.log_accept_sum = -np.inf
-        self.mean_tree_accept = 0.
+        self.mean_tree_accept = 1.0
         self.n_proposals = 0
         self.p_sum = start.p.copy()
         self.max_energy_change = 0

Mutant 426

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -246,7 +246,7 @@
         self.depth = 0
         self.log_size = 0
         self.log_accept_sum = -np.inf
-        self.mean_tree_accept = 0.
+        self.mean_tree_accept = None
         self.n_proposals = 0
         self.p_sum = start.p.copy()
         self.max_energy_change = 0

Mutant 427

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -247,7 +247,7 @@
         self.log_size = 0
         self.log_accept_sum = -np.inf
         self.mean_tree_accept = 0.
-        self.n_proposals = 0
+        self.n_proposals = 1
         self.p_sum = start.p.copy()
         self.max_energy_change = 0
 

Mutant 430

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -249,7 +249,7 @@
         self.mean_tree_accept = 0.
         self.n_proposals = 0
         self.p_sum = start.p.copy()
-        self.max_energy_change = 0
+        self.max_energy_change = 1
 
     def extend(self, direction):
         """Double the treesize by extending the tree in the given direction.

Mutant 432

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -263,7 +263,7 @@
         the tree extension was stopped because the termination criterior
         was reached (the trajectory is turning back).
         """
-        if direction > 0:
+        if direction >= 0:
             tree, diverging, turning = self._build_subtree(
                 self.right, self.depth, floatX(np.asarray(self.step_size)))
             leftmost_begin, leftmost_end = self.left, self.right

Mutant 449

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -280,7 +280,7 @@
             rightmost_p_sum = self.p_sum
             self.left = tree.right
 
-        self.depth += 1
+        self.depth += 2
         self.n_proposals += tree.n_proposals
 
         if diverging or turning:

Mutant 450

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -281,7 +281,7 @@
             self.left = tree.right
 
         self.depth += 1
-        self.n_proposals += tree.n_proposals
+        self.n_proposals = tree.n_proposals
 
         if diverging or turning:
             return diverging, turning

Mutant 451

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -281,7 +281,7 @@
             self.left = tree.right
 
         self.depth += 1
-        self.n_proposals += tree.n_proposals
+        self.n_proposals -= tree.n_proposals
 
         if diverging or turning:
             return diverging, turning

Mutant 458

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -293,7 +293,7 @@
         self.log_size = np.logaddexp(self.log_size, tree.log_size)
         self.log_accept_sum = np.logaddexp(self.log_accept_sum, 
 					   tree.log_accept_sum)
-        self.p_sum[:] += tree.p_sum
+        self.p_sum[:] = tree.p_sum
 
         # Additional turning check only when tree depth > 0 to avoid redundant work
         if self.depth > 0:

Mutant 460

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -296,7 +296,7 @@
         self.p_sum[:] += tree.p_sum
 
         # Additional turning check only when tree depth > 0 to avoid redundant work
-        if self.depth > 0:
+        if self.depth >= 0:
             left, right = self.left, self.right
             p_sum = self.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)

Mutant 464

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -299,7 +299,7 @@
         if self.depth > 0:
             left, right = self.left, self.right
             p_sum = self.p_sum
-            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
+            turning = (p_sum.dot(left.v) < 0) or (p_sum.dot(right.v) <= 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum

Mutant 466

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -299,7 +299,7 @@
         if self.depth > 0:
             left, right = self.left, self.right
             p_sum = self.p_sum
-            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
+            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) < 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum

Mutant 468

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -299,7 +299,7 @@
         if self.depth > 0:
             left, right = self.left, self.right
             p_sum = self.p_sum
-            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
+            turning = (p_sum.dot(left.v) <= 0) and (p_sum.dot(right.v) <= 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum

Mutant 472

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -301,7 +301,7 @@
             p_sum = self.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
-            turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
+            turning1 = (p_sum1.dot(leftmost_begin.v) < 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
             turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
             turning = (turning | turning1 | turning2)

Mutant 473

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -301,7 +301,7 @@
             p_sum = self.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
-            turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
+            turning1 = (p_sum1.dot(leftmost_begin.v) <= 1) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
             turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
             turning = (turning | turning1 | turning2)

Mutant 474

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -301,7 +301,7 @@
             p_sum = self.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
-            turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
+            turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) < 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
             turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
             turning = (turning | turning1 | turning2)

Mutant 476

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -301,7 +301,7 @@
             p_sum = self.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             p_sum1 = leftmost_p_sum + rightmost_begin.p
-            turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
+            turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) and (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
             turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
             turning = (turning | turning1 | turning2)

Mutant 480

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -303,7 +303,7 @@
             p_sum1 = leftmost_p_sum + rightmost_begin.p
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
-            turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
+            turning2 = (p_sum2.dot(leftmost_end.v) < 0) or (p_sum2.dot(rightmost_end.v) <= 0)
             turning = (turning | turning1 | turning2)
 
         return diverging, turning

Mutant 482

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -303,7 +303,7 @@
             p_sum1 = leftmost_p_sum + rightmost_begin.p
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
-            turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
+            turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) < 0)
             turning = (turning | turning1 | turning2)
 
         return diverging, turning

Mutant 484

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -303,7 +303,7 @@
             p_sum1 = leftmost_p_sum + rightmost_begin.p
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
-            turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
+            turning2 = (p_sum2.dot(leftmost_end.v) <= 0) and (p_sum2.dot(rightmost_end.v) <= 0)
             turning = (turning | turning1 | turning2)
 
         return diverging, turning

Mutant 486

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -304,7 +304,7 @@
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
             turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
-            turning = (turning | turning1 | turning2)
+            turning = (turning & turning1 | turning2)
 
         return diverging, turning
 

Mutant 487

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -304,7 +304,7 @@
             turning1 = (p_sum1.dot(leftmost_begin.v) <= 0) or (p_sum1.dot(rightmost_begin.v) <= 0)
             p_sum2 = leftmost_end.p + rightmost_p_sum
             turning2 = (p_sum2.dot(leftmost_end.v) <= 0) or (p_sum2.dot(rightmost_end.v) <= 0)
-            turning = (turning | turning1 | turning2)
+            turning = (turning | turning1 & turning2)
 
         return diverging, turning
 

Mutant 492

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -321,7 +321,7 @@
             if np.isnan(energy_change):
                 energy_change = np.inf
 
-            if np.abs(energy_change) > np.abs(self.max_energy_change):
+            if np.abs(energy_change) >= np.abs(self.max_energy_change):
                 self.max_energy_change = energy_change
             if np.abs(energy_change) < self.Emax:
                 # Acceptance statistic 

Mutant 494

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -323,7 +323,7 @@
 
             if np.abs(energy_change) > np.abs(self.max_energy_change):
                 self.max_energy_change = energy_change
-            if np.abs(energy_change) < self.Emax:
+            if np.abs(energy_change) <= self.Emax:
                 # Acceptance statistic 
 		# e^{H(q_0, p_0) - H(q_n, p_n)} max(1, e^{H(q_0, p_0) - H(q_n, p_n)})
                 # Saturated Metropolis accept probability with Boltzmann weight 

Mutant 503

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -334,7 +334,7 @@
                     right.q, right.q_grad, right.energy, log_p_accept, 
 		    right.model_logp)
                 tree = Subtree(right, right, right.p,
-                               proposal, log_size, log_p_accept, 1)
+                               proposal, log_size, log_p_accept, 2)
                 return tree, None, False
             else:
                 error_msg = ("Energy change in leapfrog step is too large: %s."

Mutant 506

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -337,7 +337,7 @@
                                proposal, log_size, log_p_accept, 1)
                 return tree, None, False
             else:
-                error_msg = ("Energy change in leapfrog step is too large: %s."
+                error_msg = ("XXEnergy change in leapfrog step is too large: %s.XX"
                              % energy_change)
                 error = None
         tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)

Mutant 507

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -338,7 +338,7 @@
                 return tree, None, False
             else:
                 error_msg = ("Energy change in leapfrog step is too large: %s."
-                             % energy_change)
+                             / energy_change)
                 error = None
         tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
         divergance_info = DivergenceInfo(error_msg, error, left)

Mutant 508

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -337,8 +337,7 @@
                                proposal, log_size, log_p_accept, 1)
                 return tree, None, False
             else:
-                error_msg = ("Energy change in leapfrog step is too large: %s."
-                             % energy_change)
+                error_msg = None
                 error = None
         tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
         divergance_info = DivergenceInfo(error_msg, error, left)

Mutant 509

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -339,7 +339,7 @@
             else:
                 error_msg = ("Energy change in leapfrog step is too large: %s."
                              % energy_change)
-                error = None
+                error = ""
         tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
         divergance_info = DivergenceInfo(error_msg, error, left)
         return tree, divergance_info, False

Mutant 510

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -340,7 +340,7 @@
                 error_msg = ("Energy change in leapfrog step is too large: %s."
                              % energy_change)
                 error = None
-        tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
+        tree = Subtree(None, None, None, None, +np.inf, -np.inf, 1)
         divergance_info = DivergenceInfo(error_msg, error, left)
         return tree, divergance_info, False
 

Mutant 511

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -340,7 +340,7 @@
                 error_msg = ("Energy change in leapfrog step is too large: %s."
                              % energy_change)
                 error = None
-        tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
+        tree = Subtree(None, None, None, None, -np.inf, +np.inf, 1)
         divergance_info = DivergenceInfo(error_msg, error, left)
         return tree, divergance_info, False
 

Mutant 512

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -340,7 +340,7 @@
                 error_msg = ("Energy change in leapfrog step is too large: %s."
                              % energy_change)
                 error = None
-        tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
+        tree = Subtree(None, None, None, None, -np.inf, -np.inf, 2)
         divergance_info = DivergenceInfo(error_msg, error, left)
         return tree, divergance_info, False
 

Mutant 513

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -340,7 +340,7 @@
                 error_msg = ("Energy change in leapfrog step is too large: %s."
                              % energy_change)
                 error = None
-        tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
+        tree = None
         divergance_info = DivergenceInfo(error_msg, error, left)
         return tree, divergance_info, False
 

Mutant 514

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -341,7 +341,7 @@
                              % energy_change)
                 error = None
         tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
-        divergance_info = DivergenceInfo(error_msg, error, left)
+        divergance_info = None
         return tree, divergance_info, False
 
     def _build_subtree(self, left, depth, epsilon):

Mutant 515

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -342,7 +342,7 @@
                 error = None
         tree = Subtree(None, None, None, None, -np.inf, -np.inf, 1)
         divergance_info = DivergenceInfo(error_msg, error, left)
-        return tree, divergance_info, False
+        return tree, divergance_info, True
 
     def _build_subtree(self, left, depth, epsilon):
         if depth == 0:

Mutant 530

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -360,7 +360,7 @@
 
         if not (diverging or turning):
             p_sum = tree1.p_sum + tree2.p_sum
-            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
+            turning = (p_sum.dot(left.v) < 0) or (p_sum.dot(right.v) <= 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
             if depth - 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p

Mutant 532

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -360,7 +360,7 @@
 
         if not (diverging or turning):
             p_sum = tree1.p_sum + tree2.p_sum
-            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
+            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) < 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
             if depth - 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p

Mutant 534

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -360,7 +360,7 @@
 
         if not (diverging or turning):
             p_sum = tree1.p_sum + tree2.p_sum
-            turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
+            turning = (p_sum.dot(left.v) <= 0) and (p_sum.dot(right.v) <= 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
             if depth - 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p

Mutant 536

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -362,7 +362,7 @@
             p_sum = tree1.p_sum + tree2.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
-            if depth - 1 > 0:
+            if depth + 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum

Mutant 537

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -362,7 +362,7 @@
             p_sum = tree1.p_sum + tree2.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
-            if depth - 1 > 0:
+            if depth - 2 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum

Mutant 538

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -362,7 +362,7 @@
             p_sum = tree1.p_sum + tree2.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
-            if depth - 1 > 0:
+            if depth - 1 >= 0:
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum

Mutant 539

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -362,7 +362,7 @@
             p_sum = tree1.p_sum + tree2.p_sum
             turning = (p_sum.dot(left.v) <= 0) or (p_sum.dot(right.v) <= 0)
             # Additional U turn check only when depth > 1 to avoid redundant work.
-            if depth - 1 > 0:
+            if depth - 1 > 1:
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum

Mutant 542

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -364,7 +364,7 @@
             # Additional U turn check only when depth > 1 to avoid redundant work.
             if depth - 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p
-                turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
+                turning1 = (p_sum1.dot(tree1.left.v) < 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
                 turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
                 turning = (turning | turning1 | turning2)

Mutant 544

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -364,7 +364,7 @@
             # Additional U turn check only when depth > 1 to avoid redundant work.
             if depth - 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p
-                turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
+                turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) < 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
                 turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
                 turning = (turning | turning1 | turning2)

Mutant 546

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -364,7 +364,7 @@
             # Additional U turn check only when depth > 1 to avoid redundant work.
             if depth - 1 > 0:
                 p_sum1 = tree1.p_sum + tree2.left.p
-                turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
+                turning1 = (p_sum1.dot(tree1.left.v) <= 0) and (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
                 turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
                 turning = (turning | turning1 | turning2)

Mutant 550

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -366,7 +366,7 @@
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
-                turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
+                turning2 = (p_sum2.dot(tree1.right.v) < 0) or (p_sum2.dot(tree2.right.v) <= 0)
                 turning = (turning | turning1 | turning2)
 
             log_size = np.logaddexp(tree1.log_size, tree2.log_size)

Mutant 552

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -366,7 +366,7 @@
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
-                turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
+                turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) < 0)
                 turning = (turning | turning1 | turning2)
 
             log_size = np.logaddexp(tree1.log_size, tree2.log_size)

Mutant 554

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -366,7 +366,7 @@
                 p_sum1 = tree1.p_sum + tree2.left.p
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
-                turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
+                turning2 = (p_sum2.dot(tree1.right.v) <= 0) and (p_sum2.dot(tree2.right.v) <= 0)
                 turning = (turning | turning1 | turning2)
 
             log_size = np.logaddexp(tree1.log_size, tree2.log_size)

Mutant 556

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -367,7 +367,7 @@
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
                 turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
-                turning = (turning | turning1 | turning2)
+                turning = (turning & turning1 | turning2)
 
             log_size = np.logaddexp(tree1.log_size, tree2.log_size)
             log_accept_sum = np.logaddexp(tree1.log_accept_sum,

Mutant 557

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -367,7 +367,7 @@
                 turning1 = (p_sum1.dot(tree1.left.v) <= 0) or (p_sum1.dot(tree2.left.v) <= 0)
                 p_sum2 = tree1.right.p + tree2.p_sum
                 turning2 = (p_sum2.dot(tree1.right.v) <= 0) or (p_sum2.dot(tree2.right.v) <= 0)
-                turning = (turning | turning1 | turning2)
+                turning = (turning | turning1 & turning2)
 
             log_size = np.logaddexp(tree1.log_size, tree2.log_size)
             log_accept_sum = np.logaddexp(tree1.log_accept_sum,

Mutant 564

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -377,7 +377,7 @@
             else:
                 proposal = tree1.proposal
         else:
-            p_sum = tree1.p_sum
+            p_sum = None
             log_size = tree1.log_size
             log_accept_sum = tree1.log_accept_sum
             proposal = tree1.proposal

Mutant 565

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -378,7 +378,7 @@
                 proposal = tree1.proposal
         else:
             p_sum = tree1.p_sum
-            log_size = tree1.log_size
+            log_size = None
             log_accept_sum = tree1.log_accept_sum
             proposal = tree1.proposal
 

Mutant 566

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -379,7 +379,7 @@
         else:
             p_sum = tree1.p_sum
             log_size = tree1.log_size
-            log_accept_sum = tree1.log_accept_sum
+            log_accept_sum = None
             proposal = tree1.proposal
 
         n_proposals = tree1.n_proposals + tree2.n_proposals

Mutant 567

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -380,7 +380,7 @@
             p_sum = tree1.p_sum
             log_size = tree1.log_size
             log_accept_sum = tree1.log_accept_sum
-            proposal = tree1.proposal
+            proposal = None
 
         n_proposals = tree1.n_proposals + tree2.n_proposals
 

Mutant 568

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -382,7 +382,7 @@
             log_accept_sum = tree1.log_accept_sum
             proposal = tree1.proposal
 
-        n_proposals = tree1.n_proposals + tree2.n_proposals
+        n_proposals = tree1.n_proposals - tree2.n_proposals
 
         tree = Subtree(left, right, p_sum, proposal,
                        log_size, log_accept_sum, n_proposals)

Mutant 571

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -390,7 +390,7 @@
 
     def stats(self):
         # Update accept stat if any subtrees were accepted
-        if self.log_size > 0:
+        if self.log_size >= 0:
             # Remove contribution from initial state which is always a perfect 
 	    # accept
             sum_weight = np.expm1(self.log_size)

Mutant 579

--- pymc3/step_methods/hmc/nuts.py
+++ pymc3/step_methods/hmc/nuts.py
@@ -398,7 +398,7 @@
         return {
             'depth': self.depth,
             'mean_tree_accept': self.mean_tree_accept,
-            'energy_error': self.proposal.energy - self.start.energy,
+            'energy_error': self.proposal.energy + self.start.energy,
             'energy': self.proposal.energy,
             'tree_size': self.n_proposals,
             'max_energy_error': self.max_energy_change,