Graph.spectral_range(operator, iteration_count=3000, seed=None, *, name=None)

Obtain the range of the eigenvalues of a Hermitian operator.

This function provides an estimate of the difference between the highest and the lowest eigenvalues of the operator. You can adjust its precision by modifying its default parameters.


  • operator (np.ndarray or scipy.sparse.spmatrix or Tensor) – The Hermitian operator MM
  • iteration_count (int , optional) – The number of iterations NN
  • seed (int or None , optional) – The random seed that the function uses to choose the initial random vector r\left| r \right\rangle
  • name (str or None , optional) – The name of the node.


The difference between the largest and the smallest eigenvalues of the operator.

Return type

Tensor (scalar, real)


This calculation can be expensive, so we recommend that you run it before the optimization, if possible. You can do this by using a representative or a worst-case operator.


This function repeatedly multiplies the operator MM with a random vector r\left| r \right\rangle. In terms of the operator’s eigenvalues {vi}\{ v_i \} and eigenvectors {vi}\{\left|v_i \right\rangle\}, the result of NN

MNr=iviNvivir. M^N \left|r\right\rangle = \sum_i v_i^N \left|v_i\right\rangle \left\langle v_i \right. \left| r \right\rangle.

For large NN, the term corresponding to the eigenvalue with largest absolute value VV will dominate the sum, as long as r\left|r\right\rangle has a non-zero overlap with its eigenvector. The function then retrieves the eigenvalue VV

VrM2N+1rMNr2. V \approx \frac{\left\langle r \right| M^{2N+1} \left| r \right\rangle}{\left\| M^N \left| r \right\rangle \right\|^2}.

The same procedure applied to the matrix MVM-V


>>> operator = np.diag([10, 40])
>>> graph.spectral_range(operator, name="spectral_range")
<Tensor: name="spectral_range", operation_name="spectral_range", shape=()>
>>> result = bo.execute_graph(graph=graph, output_node_names="spectral_range")
>>> result["output"]["spectral_range"]["value"]

See more examples in the How to optimize controls on large sparse Hamiltonians user guide.

Was this useful?