hermitian_part

Graph.hermitian_part(x, *, name=None)

Calculate the Hermitian part of an object. This can be an array, a tensor, or a time-dependent function in the form of a Pwc or an Stf where values have at least two dimensions. The operation is applied on the last two dimensions, which must be equal to each other.

Parameters

  • x (np.ndarray or Tensor or Pwc or Stf) – The object whose Hermitian part you want to calculate, x\mathop{x}
  • name (str or None , optional) – The name of the node. You can only provide a name if the object is not an Stf.

Returns

The Hermitian part of the matrix or matrix-valued function, 12(x+x)\frac{1}{2}(\mathop{x}+\mathop{x}^\dagger)

Return type

Tensor or Pwc or Stf

SEE ALSO

Graph.adjoint : Hermitian adjoint of an operator.

Examples

Create a Hamiltonian from a non-Hermitian Pwc operator.

>>> omega = graph.pwc(durations=np.array([0.5, 0.7]), values=np.array([0.2, 0.4]))
>>> sigma_m = np.array([[0, 1], [0, 0]])
>>> operator = omega * sigma_m
>>> graph.hermitian_part(operator, name="hamiltonian")
<Pwc: name="hamiltonian", operation_name="hermitian_part", value_shape=(2, 2), batch_shape=()>
>>> result = bo.execute_graph(graph=graph, output_node_names="hamiltonian")
>>> result["output"]["hamiltonian"]
{
    'durations': array([0.5, 0.7]),
    'values': array([
        [[0. , 0.1], [0.1, 0. ]],
        [[0. , 0.2], [0.2, 0. ]]
        ]),
    'time_dimension': 0
}

See more examples in the Simulate the dynamics of a single qubit using computational graphs tutorial.

Create a Hamiltonian from a non-Hermitian Stf operator.

>>> operator = stf_signal * np.array([[0, 1, 0], [0, 0, np.sqrt(2)], [0, 0, 0]])
>>> hamiltonian = graph.hermitian_part(operator)
>>> hamiltonian
<Stf: operation_name="hermitian_part", value_shape=(3, 3), batch_shape=()>

Create a Hermitian matrix from a non-Hermitian np.ndarray.

>>> sigma_m = np.array([[0, 1], [0, 0]])
>>> graph.hermitian_part(sigma_m, name="hamiltonian")
<Tensor: name="hamiltonian", operation_name="hermitian_part", shape=(2, 2)>
>>> result = bo.execute_graph(graph=graph, output_node_names="hamiltonian")
>>> result["output"]["hamiltonian"]
{'value': array([[0. , 0.5], [0.5, 0. ]])}

Was this useful?