The definition of Qiskit CircuitStateFn.eval() is as follows:

def eval(self,
         front: Union[str, dict, np.ndarray,
                      OperatorBase] = None) -> Union[OperatorBase, float, complex]:
    if not self.is_measurement and isinstance(front, OperatorBase):
        raise ValueError(
            'Cannot compute overlap with StateFn or Operator if not Measurement. Try taking '
            'sf.adjoint() first to convert to measurement.')

    # pylint: disable=import-outside-toplevel
    from ..list_ops.list_op import ListOp
    from ..primitive_ops.pauli_op import PauliOp
    from ..primitive_ops.matrix_op import MatrixOp
    from ..primitive_ops.circuit_op import CircuitOp

    if isinstance(front, ListOp) and front.distributive:
        return front.combo_fn([self.eval(front.coeff * front_elem)
                               for front_elem in front.oplist])

    # Composable with circuit
    if isinstance(front, (PauliOp, CircuitOp, MatrixOp, CircuitStateFn)):
        new_front = self.compose(front)
        return new_front.eval()

    return self.to_matrix_op().eval(front)

In the last line to_matrix_op() is called without any arguments. However, in order to work properly for more than 16 qubits, it has to be provided with an additional argument massive = True:

def to_matrix(self, massive: bool = False) -> np.ndarray:
    if self.num_qubits > 16 and not massive:
        raise ValueError(
            'to_vector will return an exponentially large vector, in this case {0} elements.'
            ' Set massive=True if you want to proceed.'.format(2 ** self.num_qubits))

So how do I use CircuitStateFn.eval() for more than 16 qubits??

  • $\begingroup$ It sounds like a feature request for CircuitStateFn.eval(massive=<optional, bool>). You can request it here: github.com/Qiskit/qiskit-terra/issues/… $\endgroup$
    – luciano
    Feb 13, 2021 at 11:32
  • $\begingroup$ When I'm in such situation, I just extend the class and use "method overriding" to change the behavior of the method(s) that needs to be changed. $\endgroup$ Feb 13, 2021 at 12:28


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.