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

Functions for applying general many-qubit diagonal matrices, as DiagMatr. More...

Functions

void applyControlledDiagMatr (Qureg qureg, int control, int *targets, int numTargets, DiagMatr matrix)
 
void applyControlledDiagMatrPower (Qureg qureg, int control, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
 
void applyDiagMatr (Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
 
void applyDiagMatrPower (Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
 
void applyMultiControlledDiagMatr (Qureg qureg, int *controls, int numControls, int *targets, int numTargets, DiagMatr matrix)
 
void applyMultiControlledDiagMatrPower (Qureg qureg, int *controls, int numControls, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
 
void applyMultiStateControlledDiagMatr (Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix)
 
void applyMultiStateControlledDiagMatrPower (Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
 
void multiplyDiagMatr (Qureg qureg, int *targets, int numTargets, DiagMatr matrix)
 
void multiplyDiagMatrPower (Qureg qureg, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)
 

Detailed Description

Functions for applying general many-qubit diagonal matrices, as DiagMatr.

Function Documentation

◆ applyControlledDiagMatr()

void applyControlledDiagMatr ( Qureg qureg,
int control,
int * targets,
int numTargets,
DiagMatr matrix )
Note
Documentation for this function or struct is under construction!
See also
applyControlledCompMatr1()

Definition at line 362 of file operations.cpp.

362 {
363
364 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, &control, nullptr, 1, targets, numTargets, matrix, __func__);
365}

Referenced by applyControlledDiagMatr().

◆ applyControlledDiagMatrPower()

void applyControlledDiagMatrPower ( Qureg qureg,
int control,
int * targets,
int numTargets,
DiagMatr matrix,
qcomp exponent )
Note
Documentation for this function or struct is under construction!
See also

Definition at line 440 of file operations.cpp.

440 {
441 validate_quregFields(qureg, __func__);
442 validate_controlAndTargets(qureg, control, targets, numTargets, __func__);
443 validate_matrixDimMatchesTargets(matrix, numTargets, __func__); // also checks fields and is-synced
444 validate_matrixIsUnitary(matrix, __func__);
445 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
446 validate_unitaryExponentIsReal(exponent, __func__);
447
448 // notice exponent is a 'qcomp' not a 'qreal' despite validation; see applyMultiStateControlledDiagMatrPower()
449
450 // harmlessly re-validates
451 applyMultiStateControlledDiagMatrPower(qureg, &control, nullptr, 1, targets, numTargets, matrix, exponent);
452}
void applyMultiStateControlledDiagMatrPower(Qureg qureg, int *controls, int *states, int numControls, int *targets, int numTargets, DiagMatr matrix, qcomp exponent)

Referenced by applyControlledDiagMatrPower().

◆ applyDiagMatr()

void applyDiagMatr ( Qureg qureg,
int * targets,
int numTargets,
DiagMatr matrix )
Note
Documentation for this function or struct is under construction!
See also
applyCompMatr1()

Definition at line 357 of file operations.cpp.

357 {
358
359 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, nullptr, nullptr, 0, targets, numTargets, matrix, __func__);
360}

Referenced by applyDiagMatr().

◆ applyDiagMatrPower()

void applyDiagMatrPower ( Qureg qureg,
int * targets,
int numTargets,
DiagMatr matrix,
qcomp exponent )
Note
Documentation for this function or struct is under construction!
Formulae

This function is equivalent to applyDiagMatr() except that matrix is raised to the given exponent.

Definition at line 426 of file operations.cpp.

426 {
427 validate_quregFields(qureg, __func__);
428 validate_targets(qureg, targets, numTargets, __func__);
429 validate_matrixDimMatchesTargets(matrix, numTargets, __func__); // also checks fields and is-synced
430 validate_matrixIsUnitary(matrix, __func__);
431 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
432 validate_unitaryExponentIsReal(exponent, __func__);
433
434 // notice exponent is a 'qcomp' not a 'qreal' despite validation; see applyMultiStateControlledDiagMatrPower()
435
436 // harmlessly re-validates
437 applyMultiStateControlledDiagMatrPower(qureg, nullptr, nullptr, 0, targets, numTargets, matrix, exponent);
438}

Referenced by applyDiagMatrPower().

◆ applyMultiControlledDiagMatr()

void applyMultiControlledDiagMatr ( Qureg qureg,
int * controls,
int numControls,
int * targets,
int numTargets,
DiagMatr matrix )
Note
Documentation for this function or struct is under construction!
See also
applyMultiControlledCompMatr1()

Definition at line 367 of file operations.cpp.

367 {
368
369 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, nullptr, numControls, targets, numTargets, matrix, __func__);
370}

Referenced by applyMultiControlledDiagMatr().

◆ applyMultiControlledDiagMatrPower()

void applyMultiControlledDiagMatrPower ( Qureg qureg,
int * controls,
int numControls,
int * targets,
int numTargets,
DiagMatr matrix,
qcomp exponent )
Note
Documentation for this function or struct is under construction!
See also

Definition at line 454 of file operations.cpp.

454 {
455 validate_quregFields(qureg, __func__);
456 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
457 validate_matrixDimMatchesTargets(matrix, numTargets, __func__); // also checks fields and is-synced
458 validate_matrixIsUnitary(matrix, __func__);
459 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
460 validate_unitaryExponentIsReal(exponent, __func__);
461
462 // notice exponent is a 'qcomp' not a 'qreal' despite validation; see applyMultiStateControlledDiagMatrPower()
463
464 // harmlessly re-validates
465 applyMultiStateControlledDiagMatrPower(qureg, controls, nullptr, numControls, targets, numTargets, matrix, exponent);
466}

Referenced by applyMultiControlledDiagMatrPower().

◆ applyMultiStateControlledDiagMatr()

void applyMultiStateControlledDiagMatr ( Qureg qureg,
int * controls,
int * states,
int numControls,
int * targets,
int numTargets,
DiagMatr matrix )
Note
Documentation for this function or struct is under construction!
See also
applyMultiStateControlledCompMatr1()

Definition at line 372 of file operations.cpp.

372 {
373
374 validateAndApplyAnyCtrlAnyTargUnitaryMatrix(qureg, controls, states, numControls, targets, numTargets, matrix, __func__);
375}

Referenced by applyMultiStateControlledDiagMatr().

◆ applyMultiStateControlledDiagMatrPower()

void applyMultiStateControlledDiagMatrPower ( Qureg qureg,
int * controls,
int * states,
int numControls,
int * targets,
int numTargets,
DiagMatr matrix,
qcomp exponent )
Note
Documentation for this function or struct is under construction!
See also

Definition at line 468 of file operations.cpp.

468 {
469 validate_quregFields(qureg, __func__);
470 validate_controlsAndTargets(qureg, controls, numControls, targets, numTargets, __func__);
471 validate_controlStates(states, numControls, __func__); // can be nullptr, ignoring numControls
472 validate_matrixDimMatchesTargets(matrix, numTargets, __func__);
473 validate_matrixIsUnitary(matrix, __func__);
474 validate_matrixExpIsNonDiverging(matrix, exponent, __func__);
475 validate_unitaryExponentIsReal(exponent, __func__);
476
477 // unlike calcExpecDiagMatrPower which accepts a 'qreal' exponent,
478 // this function accepts a 'qcomp'. This is because it always
479 // evaluates the relatively numerically unstable pow(qcomp,qcomp)
480 // overload, rather than pow(qreal,qreal), since there is no reason
481 // to think matrix is real (unitarity permits it to be complex).
482 // As such, despite unitarity requiring exponent is also real, we
483 // accept a qcomp types so that complex exponents can be passed
484 // when numerical validation is disabled without a separate func.
485
486 bool conj = false;
487 auto ctrlVec = util_getVector(controls, numControls);
488 auto stateVec = util_getVector(states, numControls); // empty if states==nullptr
489 auto targVec = util_getVector(targets, numTargets);
490 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
491
492 if (!qureg.isDensityMatrix)
493 return;
494
495 conj = true;
496 ctrlVec = util_getBraQubits(ctrlVec, qureg);
497 targVec = util_getBraQubits(targVec, qureg);
498 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, ctrlVec, stateVec, targVec, matrix, exponent, conj);
499}

Referenced by applyControlledDiagMatrPower(), applyDiagMatrPower(), applyMultiControlledDiagMatrPower(), and applyMultiStateControlledDiagMatrPower().

◆ multiplyDiagMatr()

void multiplyDiagMatr ( Qureg qureg,
int * targets,
int numTargets,
DiagMatr matrix )
Note
Documentation for this function or struct is under construction!
See also
multiplyCompMatr1()

Definition at line 347 of file operations.cpp.

347 {
348 validate_quregFields(qureg, __func__);
349 validate_targets(qureg, targets, numTargets, __func__);
350 validate_matrixDimMatchesTargets(matrix, numTargets, __func__); // also validates fields and is-sync, but not unitarity
351
352 bool conj = false;
353 qcomp exponent = 1;
354 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, exponent, conj);
355}

Referenced by multiplyDiagMatr().

◆ multiplyDiagMatrPower()

void multiplyDiagMatrPower ( Qureg qureg,
int * targets,
int numTargets,
DiagMatr matrix,
qcomp exponent )
Note
Documentation for this function or struct is under construction!
See also

Definition at line 416 of file operations.cpp.

416 {
417 validate_quregFields(qureg, __func__);
418 validate_targets(qureg, targets, numTargets, __func__);
419 validate_matrixDimMatchesTargets(matrix, numTargets, __func__); // also validates fields and is-sync, but not unitarity
420 validate_matrixExpIsNonDiverging(matrix, exponent, __func__); // harmlessly re-validates fields and is-sync
421
422 bool conj = false;
423 localiser_statevec_anyCtrlAnyTargDiagMatr(qureg, {}, {}, util_getVector(targets, numTargets), matrix, exponent, conj);
424}

Referenced by multiplyDiagMatrPower().