Missing coverage
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
I think I could do that.
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 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.