SME trajectory tutorial
=======================

This example runs one monitored amplitude-damping trajectory and inspects
the measurement record.

Example
-------

    import numpy as np

    from qubitos.lindblad import CollapseOperator
    from qubitos.sme import SMEConfig, SMESolver

    rho0 = np.array(
        [[0.0, 0.0],
         [0.0, 1.0]],
        dtype=np.complex128,
    )

    hamiltonians = [
        np.zeros((2, 2), dtype=np.complex128)
        for _ in range(400)
    ]

    config = SMEConfig(
        num_time_steps=400,
        duration_ns=500_000.0,
        measurement_efficiency=1.0,
        random_seed=3,
        store_trajectory=True,
        store_measurement_record=True,
    )

    solver = SMESolver(
        config=config,
        collapse_ops=[CollapseOperator.amplitude_damping(t1_us=50.0)],
    )

    result = solver.solve_trajectory(rho0, hamiltonians)

    print("ground population:", result.final_density_matrix[0, 0].real)
    print("accepted substeps:", result.steps)
    print("positivity violations:", result.positivity_violations)
    print("largest current sample:", max(abs(x) for x in result.measurement_record))

What to look for
----------------

    ground population
        Approaches 1.0 after several T1 lifetimes.

    accepted substeps
        May exceed num_time_steps if adaptive halving triggers.

    positivity violations
        Usually zero for modest timesteps. If nonzero, reduce the nominal
        timestep or enable positivity_projection.

    measurement record
        Contains the feedback-ready homodyne current exposed by v0.6.0.
