Cirq icon indicating copy to clipboard operation
Cirq copied to clipboard

Missing coverage

Open balopat opened this issue 4 years ago • 3 comments

Description of the issue

We have some uncovered lines that I discovered while extracting cirq.google. It's kind of amazing that only 199 lines are uncovered, but maybe we could cover them / mark them with # coverage: ignore.

************* core/cirq/circuits/circuit_operation.py (1 uncovered)
Line  293 is new or changed but not covered:              args.append(f'loops={self.repetitions}')
************* core/cirq/circuits/optimization_pass.py (2 uncovered)
Line  140 is new or changed but not covered:                      continue
Line  143 is new or changed but not covered:                      continue
************* core/cirq/circuits/qasm_output.py (1 uncovered)
Line  298 is new or changed but not covered:                  return QasmUGate.from_matrix(mat).on(*op.qubits)
************* core/cirq/circuits/text_diagram_drawer.py (1 uncovered)
Line  146 is new or changed but not covered:              return True
************* core/cirq/contrib/acquaintance/bipartite.py (1 uncovered)
Line  110 is new or changed but not covered:              raise ValueError('qubit_count != 2 * self.part_size')
************* core/cirq/contrib/acquaintance/shift.py (1 uncovered)
Line   62 is new or changed but not covered:              return NotImplemented
************* core/cirq/contrib/paulistring/convert_to_clifford_gates.py (1 uncovered)
Line  118 is new or changed but not covered:              return None
************* core/cirq/contrib/qcircuit/qcircuit_test.py (1 uncovered)
Line   60 is new or changed but not covered:              return MagicOp(*new_qubits)
************* core/cirq/experiments/qubit_characterizations.py (65 uncovered)
Line   90 is new or changed but not covered:          show_plot = not ax
Line   91 is new or changed but not covered:          if not ax:
Line   93 is new or changed but not covered:          ax.set_ylim([0, 1])
Line   94 is new or changed but not covered:          ax.plot(self._rabi_angles, self._excited_state_probs, 'ro-', **plot_kwargs)
Line   95 is new or changed but not covered:          ax.set_xlabel(r"Rabi Angle (Radian)")
Line   96 is new or changed but not covered:          ax.set_ylabel('Excited State Probability')
Line   97 is new or changed but not covered:          if show_plot:
Line   99 is new or changed but not covered:          return ax
Line  135 is new or changed but not covered:          show_plot = not ax
Line  136 is new or changed but not covered:          if not ax:
Line  138 is new or changed but not covered:          ax.set_ylim([0, 1])
Line  139 is new or changed but not covered:          ax.plot(self._num_cfds_seq, self._gnd_state_probs, 'ro-', **plot_kwargs)
Line  140 is new or changed but not covered:          ax.set_xlabel(r"Number of Cliffords")
Line  141 is new or changed but not covered:          ax.set_ylabel('Ground State Probability')
Line  142 is new or changed but not covered:          if show_plot:
Line  144 is new or changed but not covered:          return ax
Line  183 is new or changed but not covered:          mat = self._density_matrix
Line  184 is new or changed but not covered:          a, _ = mat.shape
Line  185 is new or changed but not covered:          num_qubits = int(np.log2(a))
Line  186 is new or changed but not covered:          state_labels = [[0, 1]] * num_qubits
Line  187 is new or changed but not covered:          kets = []
Line  188 is new or changed but not covered:          for label in itertools.product(*state_labels):
Line  189 is new or changed but not covered:              kets.append('|' + str(list(label))[1:-1] + '>')
Line  190 is new or changed but not covered:          mat_re = np.real(mat)
Line  191 is new or changed but not covered:          mat_im = np.imag(mat)
Line  192 is new or changed but not covered:          _matrix_bar_plot(
Line  193 is new or changed but not covered:              mat_re,
Line  194 is new or changed but not covered:              r'Real($\rho$)',
Line  195 is new or changed but not covered:              axes[0],
Line  196 is new or changed but not covered:              kets,
Line  197 is new or changed but not covered:              'Density Matrix (Real Part)',
Line  198 is new or changed but not covered:              ylim=(-1, 1),
Line  199 is new or changed but not covered:              **plot_kwargs,
Line  200 is new or changed but not covered:          )
Line  201 is new or changed but not covered:          _matrix_bar_plot(
Line  202 is new or changed but not covered:              mat_im,
Line  203 is new or changed but not covered:              r'Imaginary($\rho$)',
Line  204 is new or changed but not covered:              axes[1],
Line  205 is new or changed but not covered:              kets,
Line  206 is new or changed but not covered:              'Density Matrix (Imaginary Part)',
Line  207 is new or changed but not covered:              ylim=(-1, 1),
Line  208 is new or changed but not covered:              **plot_kwargs,
Line  209 is new or changed but not covered:          )
Line  210 is new or changed but not covered:          if show_plot:
Line  212 is new or changed but not covered:          return axes
Line  632 is new or changed but not covered:      num_rows, num_cols = mat.shape
Line  633 is new or changed but not covered:      indices = np.meshgrid(range(num_cols), range(num_rows))
Line  634 is new or changed but not covered:      x_indices = np.array(indices[1]).flatten()
Line  635 is new or changed but not covered:      y_indices = np.array(indices[0]).flatten()
Line  636 is new or changed but not covered:      z_indices = np.zeros(mat.size)
Line  638 is new or changed but not covered:      dx = np.ones(mat.size) * 0.3
Line  639 is new or changed but not covered:      dy = np.ones(mat.size) * 0.3
Line  640 is new or changed but not covered:      dz = mat.flatten()
Line  641 is new or changed but not covered:      ax.bar3d(
Line  642 is new or changed but not covered:          x_indices, y_indices, z_indices, dx, dy, dz, color='#ff0080', alpha=1.0, **bar3d_kwargs
Line  643 is new or changed but not covered:      )
Line  645 is new or changed but not covered:      ax.set_zlabel(z_label)
Line  646 is new or changed but not covered:      ax.set_zlim3d(ylim[0], ylim[1])
Line  648 is new or changed but not covered:      if kets is not None:
Line  649 is new or changed but not covered:          ax.set_xticks(np.arange(num_cols) + 0.15)
Line  650 is new or changed but not covered:          ax.set_yticks(np.arange(num_rows) + 0.15)
Line  651 is new or changed but not covered:          ax.set_xticklabels(kets)
Line  652 is new or changed but not covered:          ax.set_yticklabels(kets)
Line  654 is new or changed but not covered:      if title is not None:
Line  655 is new or changed but not covered:          ax.set_title(title)
************* core/cirq/experiments/random_quantum_circuit_generation.py (1 uncovered)
Line  543 is new or changed but not covered:              continue
************* core/cirq/experiments/xeb_fitting.py (5 uncovered)
Line  500 is new or changed but not covered:      if name not in df.columns:
Line  501 is new or changed but not covered:          return default
Line  502 is new or changed but not covered:      vals = df[name].unique()
Line  503 is new or changed but not covered:      assert len(vals) == 1, name
Line  504 is new or changed but not covered:      return vals[0]
************* core/cirq/ion/ion_device.py (1 uncovered)
Line  110 is new or changed but not covered:              return False
************* core/cirq/linalg/combinators.py (1 uncovered)
Line  151 is new or changed but not covered:              raise ValueError('Blocks must be square.')
************* core/cirq/linalg/decompositions.py (11 uncovered)
Line  109 is new or changed but not covered:      groups: List[List[T]] = []
Line  110 is new or changed but not covered:      used: Set[int] = set()
Line  111 is new or changed but not covered:      for i in range(len(items)):
Line  112 is new or changed but not covered:          if i not in used:
Line  113 is new or changed but not covered:              group = [items[i]]
Line  114 is new or changed but not covered:              for j in range(i + 1, len(items)):
Line  115 is new or changed but not covered:                  if j not in used and comparer(items[i], items[j]):
Line  116 is new or changed but not covered:                      used.add(j)
Line  117 is new or changed but not covered:                      group.append(items[j])
Line  118 is new or changed but not covered:              groups.append(group)
Line  119 is new or changed but not covered:      return groups
************* core/cirq/linalg/predicates.py (1 uncovered)
Line  287 is new or changed but not covered:              little_endian_qureg_value &= (1 << len(target_shape)) - 1
************* core/cirq/ops/common_gates.py (3 uncovered)
Line  242 is new or changed but not covered:          return 0.0
Line  463 is new or changed but not covered:          return 0.5
Line 1232 is new or changed but not covered:              return []
************* core/cirq/ops/dense_pauli_string.py (1 uncovered)
Line  513 is new or changed but not covered:          return None
************* core/cirq/ops/eigen_gate.py (1 uncovered)
Line  304 is new or changed but not covered:              return NotImplemented
************* core/cirq/ops/measurement_gate.py (1 uncovered)
Line  125 is new or changed but not covered:          return True
************* core/cirq/ops/parity_gates.py (2 uncovered)
Line   91 is new or changed but not covered:              return []
Line  202 is new or changed but not covered:              return []
************* core/cirq/ops/pauli_string.py (3 uncovered)
Line  276 is new or changed but not covered:              return self
Line  962 is new or changed but not covered:          raise TypeError('Unsupported operation: {!r}'.format(op))
Line  972 is new or changed but not covered:              return False
************* core/cirq/ops/phased_x_gate.py (1 uncovered)
Line  104 is new or changed but not covered:              return NotImplemented
************* core/cirq/optimizers/eject_phased_paulis.py (2 uncovered)
Line  321 is new or changed but not covered:          e = gate.exponent
Line  322 is new or changed but not covered:          p = 0.5
************* core/cirq/optimizers/merge_interactions.py (1 uncovered)
Line  129 is new or changed but not covered:          return None
************* core/cirq/protocols/mixture_protocol.py (1 uncovered)
Line  137 is new or changed but not covered:              return all(has_mixture(val) for val in operations)
************* core/cirq/protocols/mul_protocol_test.py (1 uncovered)
Line   72 is new or changed but not covered:                  continue
************* core/cirq/qis/measures.py (4 uncovered)
Line  228 is new or changed but not covered:      raise ValueError(
Line  229 is new or changed but not covered:          'The given arrays must be one- or two-dimensional. '
Line  230 is new or changed but not covered:          f'Got shapes {state1.shape} and {state2.shape}.'
Line  231 is new or changed but not covered:      )
************* core/cirq/sim/clifford/clifford_simulator.py (8 uncovered)
Line  332 is new or changed but not covered:          results = []
Line  334 is new or changed but not covered:          if collapse_state_vector:
Line  335 is new or changed but not covered:              state = self
Line  337 is new or changed but not covered:              state = self.copy()
Line  339 is new or changed but not covered:          for qubit in qubits:
Line  340 is new or changed but not covered:              result = state.ch_form._measure(self.qubit_map[qubit], prng)
Line  341 is new or changed but not covered:              results.append(result)
Line  343 is new or changed but not covered:          return results
************* core/cirq/sim/clifford/clifford_tableau.py (38 uncovered)
Line   88 is new or changed but not covered:          stabilizers = ", ".join([repr(stab) for stab in self.stabilizers()])
Line   89 is new or changed but not covered:          return f'stabilizers: [{stabilizers}]'
Line   92 is new or changed but not covered:          string = ''
Line   94 is new or changed but not covered:          for i in range(self.n, 2 * self.n):
Line   95 is new or changed but not covered:              string += '- ' if self.rs[i] else '+ '
Line   97 is new or changed but not covered:              for k in range(0, self.n):
Line   98 is new or changed but not covered:                  if self.xs[i, k] & (not self.zs[i, k]):
Line   99 is new or changed but not covered:                      string += 'X '
Line  100 is new or changed but not covered:                  elif (not self.xs[i, k]) & self.zs[i, k]:
Line  101 is new or changed but not covered:                      string += 'Z '
Line  102 is new or changed but not covered:                  elif self.xs[i, k] & self.zs[i, k]:
Line  103 is new or changed but not covered:                      string += 'Y '
Line  105 is new or changed but not covered:                      string += 'I '
Line  107 is new or changed but not covered:              if i < 2 * self.n - 1:
Line  108 is new or changed but not covered:                  string += '\n'
Line  110 is new or changed but not covered:          return string
Line  113 is new or changed but not covered:          string = ''
Line  115 is new or changed but not covered:          string += 'stable' + ' ' * max(self.n * 2 - 3, 1)
Line  116 is new or changed but not covered:          string += '| destable\n'
Line  117 is new or changed but not covered:          string += '-' * max(7, self.n * 2 + 3) + '+' + '-' * max(10, self.n * 2 + 4) + '\n'
Line  119 is new or changed but not covered:          for j in range(self.n):
Line  120 is new or changed but not covered:              for i in [j + self.n, j]:
Line  121 is new or changed but not covered:                  string += '- ' if self.rs[i] else '+ '
Line  123 is new or changed but not covered:                  for k in range(0, self.n):
Line  124 is new or changed but not covered:                      if self.xs[i, k] & (not self.zs[i, k]):
Line  125 is new or changed but not covered:                          string += 'X%d' % k
Line  126 is new or changed but not covered:                      elif (not self.xs[i, k]) & self.zs[i, k]:
Line  127 is new or changed but not covered:                          string += 'Z%d' % k
Line  128 is new or changed but not covered:                      elif self.xs[i, k] & self.zs[i, k]:
Line  129 is new or changed but not covered:                          string += 'Y%d' % k
Line  131 is new or changed but not covered:                          string += '  '
Line  133 is new or changed but not covered:                  if i == j + self.n:
Line  134 is new or changed but not covered:                      string += ' ' * max(0, 4 - self.n * 2) + ' | '
Line  136 is new or changed but not covered:              string += '\n'
Line  138 is new or changed but not covered:          return string
Line  149 is new or changed but not covered:                  return int(z2) - int(x2)
Line  151 is new or changed but not covered:                  return int(z2) * (2 * int(x2) - 1)
Line  226 is new or changed but not covered:                      self._rowsum(i, p)
************* core/cirq/sim/sparse_simulator_test.py (2 uncovered)
Line  682 is new or changed but not covered:              return True
Line  703 is new or changed but not covered:              return True
************* core/cirq/study/resolver.py (1 uncovered)
Line  205 is new or changed but not covered:          return self.value_of(key)
************* core/cirq/study/sweeps.py (6 uncovered)
Line   79 is new or changed but not covered:              factors.extend(other.factors)
Line   93 is new or changed but not covered:              sweeps.extend(other.sweeps)
Line  229 is new or changed but not covered:              return 0
Line  253 is new or changed but not covered:              return 'Product()'
Line  293 is new or changed but not covered:              return 0
Line  307 is new or changed but not covered:              return 'Zip()'
************* core/cirq/testing/circuit_compare_test.py (2 uncovered)
Line  313 is new or changed but not covered:              return np.eye(2)
Line  346 is new or changed but not covered:              return np.array([[0, 1], [1, 0]])
************* core/cirq/testing/consistent_pauli_expansion_test.py (1 uncovered)
Line   35 is new or changed but not covered:          return 4
************* core/cirq/testing/consistent_qasm.py (3 uncovered)
Line   50 is new or changed but not covered:              for i, q in zip(reversed(range(len(controls))), reversed(controls)):
Line   51 is new or changed but not covered:                  if q is not None:
Line   52 is new or changed but not covered:                      remaining_shape.pop(i)
************* core/cirq/testing/equals_tester.py (1 uncovered)
Line  146 is new or changed but not covered:          return hash(_ClassUnknownToSubjects)
************* core/cirq/testing/equals_tester_test.py (5 uncovered)
Line  118 is new or changed but not covered:              return hash(self.x)
Line  194 is new or changed but not covered:                  return NotImplemented
Line  201 is new or changed but not covered:              return hash(self.x)
Line  216 is new or changed but not covered:                  return NotImplemented
Line  235 is new or changed but not covered:                  return NotImplemented
************* core/cirq/value/duration.py (1 uncovered)
Line  149 is new or changed but not covered:          return NotImplemented
************* core/cirq/value/periodic_value.py (1 uncovered)
Line   70 is new or changed but not covered:              return self.value == other.value
************* core/cirq/vis/heatmap_test.py (4 uncovered)
Line  230 is new or changed but not covered:                  foo = test_value_map[(row, col)]
Line  231 is new or changed but not covered:                  actual_text = artist.get_text()
Line  232 is new or changed but not covered:                  expected_text = format(foo, format_string)
Line  233 is new or changed but not covered:                  assert actual_text == expected_text
************* examples/advanced/quantum_volume_test.py (1 uncovered)
Line   11 is new or changed but not covered:     pytest.importorskip("cirq_google")
************* examples/examples_test.py (3 uncovered)
Line   56 is new or changed but not covered:     pytest.importorskip("cirq_google")
Line   77 is new or changed but not covered:     pytest.importorskip("cirq_google")
Line   94 is new or changed but not covered:     pytest.importorskip("cirq_google")
************* platforms/google/cirq_google/devices/known_devices.py (1 uncovered)
Line  196 is new or changed but not covered:          return self._repr
************* platforms/google/cirq_google/devices/xmon_device.py (2 uncovered)
Line  130 is new or changed but not covered:              return False
Line  158 is new or changed but not covered:              return False

balopat avatar Mar 19 '21 21:03 balopat

I think I could do that.

unaiic avatar Mar 20 '21 08:03 unaiic

Hey @unaiic - I don't think adding # coverage: ignore is the answer necessarily everywhere, we only add that to cases where we know it's impossible to cover with unit tests. I much rather we actually implement unit tests that cover these lines. But that's a lot of work...so not sure yet what to do here. I am leaning towards leaving it as it is, and as things change around these parts, we'll be forced to add coverage anyway. For larger refactorings that touch these lines, it might be okay to just ignore the errors and merge with Admin rights.

balopat avatar Mar 22 '21 19:03 balopat

@balopat Okay, you'll know much better than me. I could keep the PR to add some unit tests (if we know which ones to implement), delete it or leave it as it is now. Do what you think is best.

unaiic avatar Mar 22 '21 19:03 unaiic