The Quantum Exact Simulation Toolkit v4.0.0
Loading...
Searching...
No Matches

Functions for comparing multiple quantum states. More...

Functions

qreal calcDistance (Qureg qureg1, Qureg qureg2)
 
qreal calcFidelity (Qureg qureg, Qureg other)
 
qcomp calcInnerProduct (Qureg qureg1, Qureg qureg2)
 

Detailed Description

Functions for comparing multiple quantum states.

Function Documentation

◆ calcDistance()

qreal calcDistance ( Qureg qureg1,
Qureg qureg2 )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 331 of file calculations.cpp.

331 {
332 validate_quregFields(quregA, __func__);
333 validate_quregFields(quregB, __func__);
334 validate_quregsCanBeProducted(quregA, quregB, __func__);
335
336 bool isDensA = quregA.isDensityMatrix;
337 bool isDensB = quregB.isDensityMatrix;
338
339 // Hilbert-Schmidt = sqrt( Tr((A-B)(A-B)^dagger) = sqrt(sum_ij |A_ij - B_ij|^2)
340 if (isDensA && isDensB) {
341 qreal dif = localiser_densmatr_calcHilbertSchmidtDistance(quregA, quregB);
342 return std::sqrt(dif);
343 }
344
345 // Bures = sqrt(2 - 2 |<A|B>|) (even when unnormalised)
346 if (!isDensA && !isDensB) {
347 qcomp prod = localiser_statevec_calcInnerProduct(quregA, quregB);
348 qreal mag = std::abs(prod);
349
350 validate_buresDistanceInnerProdIsNormalised(mag, __func__);
351 mag = (mag > 1)? 1 : mag; // forgive eps error to avoid complex
352 return std::sqrt(2 - 2 * mag);
353 }
354
355 // purified distance = sqrt(1 - <psi|rho|psi>)
356 qcomp fid = (quregA.isDensityMatrix)?
357 localiser_densmatr_calcFidelityWithPureState(quregA, quregB, false): // no conj
358 localiser_densmatr_calcFidelityWithPureState(quregB, quregA, false); // no conj
359
360 validate_purifiedDistanceIsNormalised(fid, __func__);
361 qreal re = std::real(fid);
362 re = (re > 1)? 1 : re; // forgive eps error to avoid complex
363 return std::sqrt(1 - re);
364}

Referenced by TEST_CASE().

◆ calcFidelity()

qreal calcFidelity ( Qureg qureg,
Qureg other )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 303 of file calculations.cpp.

303 {
304 validate_quregFields(quregA, __func__);
305 validate_quregFields(quregB, __func__);
306 validate_quregsCanBeProducted(quregA, quregB, __func__);
307
308 bool isDensA = quregA.isDensityMatrix;
309 bool isDensB = quregB.isDensityMatrix;
310
311 // F(rho,sigma) not yet supported
312 if (isDensA && isDensB)
313 validate_throwErrorBecauseCalcFidOfDensMatrNotYetImplemented(__func__);
314
315 // |<A|B>|^2
316 if (!isDensA && !isDensB) {
317 qcomp prod = localiser_statevec_calcInnerProduct(quregA, quregB);
318 return std::norm(prod);
319 }
320
321 // Re[<B|A|B>] or Re[<A|B|A>]
322 qcomp fid = (quregA.isDensityMatrix)?
323 localiser_densmatr_calcFidelityWithPureState(quregA, quregB, false): // no conj
324 localiser_densmatr_calcFidelityWithPureState(quregB, quregA, false); // no conj
325
326 validate_fidelityIsReal(fid, __func__);
327 return std::real(fid);
328}

Referenced by TEST_CASE(), and TEST_CASE().

◆ calcInnerProduct()

qcomp calcInnerProduct ( Qureg qureg1,
Qureg qureg2 )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!

Definition at line 49 of file calculations.cpp.

49 {
50 validate_quregFields(quregA, __func__);
51 validate_quregFields(quregB, __func__);
52 validate_quregsCanBeProducted(quregA, quregB, __func__);
53
54 // <A|B> or Tr(A^dagger B) = <<A|B>>
55 if (quregA.isDensityMatrix == quregB.isDensityMatrix)
56 return localiser_statevec_calcInnerProduct(quregA, quregB);
57
58 return (quregA.isDensityMatrix)?
59 localiser_densmatr_calcFidelityWithPureState(quregA, quregB, true): // <B|A^dagger|B>
60 localiser_densmatr_calcFidelityWithPureState(quregB, quregA, false); // <A|B|A>
61}

Referenced by TEST_CASE(), and TEST_CASE().