code: def matrix(self) -> np.ndarray:
          
          num_qubits = self.num_qubits()
          if num_qubits is None:
              raise ValueError('Unknown number of qubits')
          num_dim = 2 ** num_qubits
          result = np.zeros((num_dim, num_dim), dtype=np.complex128)
          for gate, coefficient in self.items():
              result += protocols.unitary(gate) * coefficient
          return result
docs: Reconstructs matrix of self using unitaries of underlying gates.
  
          Raises:
              TypeError: if any of the gates in self does not provide a unitary.