<!-- HTML header for doxygen 1.8.8-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- For Mobile Devices -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<title>QuEST: QuEST_cpu_internal.h File Reference</title>
<!--<link href="tabs.css" rel="stylesheet" type="text/css"/>-->
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="style.css" rel="stylesheet" type="text/css"/>
<link href='https://fonts.googleapis.com/css?family=Roboto+Slab' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="jquery.smartmenus.bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="jquery.smartmenus.js"></script>
<!-- SmartMenus jQuery Bootstrap Addon -->
<script type="text/javascript" src="jquery.smartmenus.bootstrap.js"></script>
<!-- SmartMenus jQuery plugin -->
</head>
<body>
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand"><img alt="Logo" src="logo.png"/></a>
<a class="navbar-brand"><b>QuEST</b> v3.4.0<br>The Quantum Exact Simulation Toolkit</a>
</div>
</div>
</nav>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div class="content" id="content">
<div class="container">
<div class="row">
<div class="col-sm-12 panel " style="padding-bottom: 15px;">
<div style="margin-bottom: 15px;">
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',false,false,'search.php','Search');
});
/* @license-end */</script>
<div id="main-nav"></div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_e145b6391efe0b6e575fd5bb5f76dbf8.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_aaf4e0c86438000dc030ca371e863336.html">QuEST</a></li><li class="navelem"><a class="el" href="dir_288db1ec25fc0ec29a6dc915511dd336.html">src</a></li><li class="navelem"><a class="el" href="dir_9ac8631f294bc067d7e4c007a43fb043.html">CPU</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">QuEST_cpu_internal.h File Reference</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include "<a class="el" href="QuEST__precision_8h_source.html">QuEST_precision.h</a>"</code><br />
</div>
<p><a href="QuEST__cpu__internal_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:afa58cf7cb98a25ab33621120c5c330d0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#afa58cf7cb98a25ab33621120c5c330d0">densmatr_applyDiagonalOpLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:afa58cf7cb98a25ab33621120c5c330d0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aeb4453a2e609e5359d2995bccf6663ca"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#aeb4453a2e609e5359d2995bccf6663ca">densmatr_calcExpecDiagonalOpLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:aeb4453a2e609e5359d2995bccf6663ca"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7772f97cb4d92a9825bf3b7c82c3230c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a7772f97cb4d92a9825bf3b7c82c3230c">densmatr_calcFidelityLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structQureg.html">Qureg</a> pureState)</td></tr>
<tr class="memdesc:a7772f97cb4d92a9825bf3b7c82c3230c"><td class="mdescLeft"> </td><td class="mdescRight">computes a few dens-columns-worth of (vec^*T) dens * vec <a href="QuEST__cpu__internal_8h.html#a7772f97cb4d92a9825bf3b7c82c3230c">More...</a><br /></td></tr>
<tr class="separator:a7772f97cb4d92a9825bf3b7c82c3230c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a939897137596bb73ad7a028d0beaaa10"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a939897137596bb73ad7a028d0beaaa10">densmatr_calcHilbertSchmidtDistanceSquaredLocal</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b)</td></tr>
<tr class="memdesc:a939897137596bb73ad7a028d0beaaa10"><td class="mdescLeft"> </td><td class="mdescRight">computes Tr((a-b) conjTrans(a-b)) = sum of abs values of (a-b) <a href="QuEST__cpu__internal_8h.html#a939897137596bb73ad7a028d0beaaa10">More...</a><br /></td></tr>
<tr class="separator:a939897137596bb73ad7a028d0beaaa10"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a08392b1b27d10e3b8a8648a5afeaa629"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a08392b1b27d10e3b8a8648a5afeaa629">densmatr_calcInnerProductLocal</a> (<a class="el" href="structQureg.html">Qureg</a> a, <a class="el" href="structQureg.html">Qureg</a> b)</td></tr>
<tr class="memdesc:a08392b1b27d10e3b8a8648a5afeaa629"><td class="mdescLeft"> </td><td class="mdescRight">computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij) <a href="QuEST__cpu__internal_8h.html#a08392b1b27d10e3b8a8648a5afeaa629">More...</a><br /></td></tr>
<tr class="separator:a08392b1b27d10e3b8a8648a5afeaa629"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a4b0ef5ab721c43c5bacf957e11a65edf"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a4b0ef5ab721c43c5bacf957e11a65edf">densmatr_calcProbOfAllOutcomesLocal</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *retProbs, <a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits)</td></tr>
<tr class="separator:a4b0ef5ab721c43c5bacf957e11a65edf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af910c7cf2b85bdc2c399cfe8dbfb8b9c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#af910c7cf2b85bdc2c399cfe8dbfb8b9c">densmatr_calcPurityLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:af910c7cf2b85bdc2c399cfe8dbfb8b9c"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8bea931504c90d9bd97e74645667804e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a8bea931504c90d9bd97e74645667804e">densmatr_findProbabilityOfZeroLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit)</td></tr>
<tr class="separator:a8bea931504c90d9bd97e74645667804e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a1b36518c8fbbc3a5084bb4ad1fb05ea5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a1b36518c8fbbc3a5084bb4ad1fb05ea5">densmatr_initPureStateLocal</a> (<a class="el" href="structQureg.html">Qureg</a> targetQureg, <a class="el" href="structQureg.html">Qureg</a> copyQureg)</td></tr>
<tr class="separator:a1b36518c8fbbc3a5084bb4ad1fb05ea5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8d9c19a3424f0ad89bfbfd920d65301d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a8d9c19a3424f0ad89bfbfd920d65301d">densmatr_mixDampingDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping)</td></tr>
<tr class="separator:a8d9c19a3424f0ad89bfbfd920d65301d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab124a3a9956046bf9c0e1e3ae9171f42"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ab124a3a9956046bf9c0e1e3ae9171f42">densmatr_mixDampingLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> damping)</td></tr>
<tr class="separator:ab124a3a9956046bf9c0e1e3ae9171f42"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a88670d0e7cebe33f61c1dd98daa338b3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a88670d0e7cebe33f61c1dd98daa338b3">densmatr_mixDepolarisingDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel)</td></tr>
<tr class="separator:a88670d0e7cebe33f61c1dd98daa338b3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab750fb47da2fca9849c678c869e40e69"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ab750fb47da2fca9849c678c869e40e69">densmatr_mixDepolarisingLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> depolLevel)</td></tr>
<tr class="separator:ab750fb47da2fca9849c678c869e40e69"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a2f76ec8f08e19bb8e1254aafb10e160e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a2f76ec8f08e19bb8e1254aafb10e160e">densmatr_mixTwoQubitDepolarisingDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> delta, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> gamma)</td></tr>
<tr class="separator:a2f76ec8f08e19bb8e1254aafb10e160e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a3510f01d4d15dcc545564eb84c668cad"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a3510f01d4d15dcc545564eb84c668cad">densmatr_mixTwoQubitDepolarisingLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> delta, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> gamma)</td></tr>
<tr class="separator:a3510f01d4d15dcc545564eb84c668cad"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae90f82418e0aa67218d733dbbc681998"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ae90f82418e0aa67218d733dbbc681998">densmatr_mixTwoQubitDepolarisingLocalPart1</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qubit1, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> delta)</td></tr>
<tr class="separator:ae90f82418e0aa67218d733dbbc681998"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:acabdfbd3184d3ab3bded61e24142b800"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#acabdfbd3184d3ab3bded61e24142b800">densmatr_mixTwoQubitDepolarisingQ1LocalQ2DistributedPart3</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, int qubit2, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> delta, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> gamma)</td></tr>
<tr class="separator:acabdfbd3184d3ab3bded61e24142b800"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a100463f6ec212c76a5fad99579000505"><td class="memItemLeft" align="right" valign="top">static int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a100463f6ec212c76a5fad99579000505">extractBit</a> (const int locationOfBitFromRight, const long long int theEncodedNumber)</td></tr>
<tr class="separator:a100463f6ec212c76a5fad99579000505"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a234f55b49a14dc4c58b1959effeb1b56"><td class="memItemLeft" align="right" valign="top">static long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a234f55b49a14dc4c58b1959effeb1b56">flipBit</a> (const long long int number, const int bitInd)</td></tr>
<tr class="separator:a234f55b49a14dc4c58b1959effeb1b56"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8909226b5f0589d82b34af7f6bf2a339"><td class="memItemLeft" align="right" valign="top">static long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a8909226b5f0589d82b34af7f6bf2a339">insertTwoZeroBits</a> (const long long int number, const int bit1, const int bit2)</td></tr>
<tr class="separator:a8909226b5f0589d82b34af7f6bf2a339"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa183d46d750769c42ff07ae1aaedc105"><td class="memItemLeft" align="right" valign="top">static long long int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#aa183d46d750769c42ff07ae1aaedc105">insertZeroBit</a> (const long long int number, const int index)</td></tr>
<tr class="separator:aa183d46d750769c42ff07ae1aaedc105"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0e4eb651e7cb309bcd664b89ac9a2242"><td class="memItemLeft" align="right" valign="top">static int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a0e4eb651e7cb309bcd664b89ac9a2242">isOddParity</a> (const long long int number, const int qb1, const int qb2)</td></tr>
<tr class="separator:a0e4eb651e7cb309bcd664b89ac9a2242"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae94d012c3da6c84599e99f6afea81f5f"><td class="memItemLeft" align="right" valign="top">static int </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ae94d012c3da6c84599e99f6afea81f5f">maskContainsBit</a> (const long long int mask, const int bitInd)</td></tr>
<tr class="separator:ae94d012c3da6c84599e99f6afea81f5f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a16ccb485bcffb328bbd5b2af6977cead"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a16ccb485bcffb328bbd5b2af6977cead">statevec_calcExpecDiagonalOpLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structDiagonalOp.html">DiagonalOp</a> op)</td></tr>
<tr class="separator:a16ccb485bcffb328bbd5b2af6977cead"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a6fbb3b693f25dde1e9e3dc87dc1984f7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structComplex.html">Complex</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a6fbb3b693f25dde1e9e3dc87dc1984f7">statevec_calcInnerProductLocal</a> (<a class="el" href="structQureg.html">Qureg</a> bra, <a class="el" href="structQureg.html">Qureg</a> ket)</td></tr>
<tr class="separator:a6fbb3b693f25dde1e9e3dc87dc1984f7"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aff4deaf21eb4ae6ae4de30779aae3b53"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#aff4deaf21eb4ae6ae4de30779aae3b53">statevec_calcProbOfAllOutcomesLocal</a> (<a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *retProbs, <a class="el" href="structQureg.html">Qureg</a> qureg, int *qubits, int numQubits)</td></tr>
<tr class="separator:aff4deaf21eb4ae6ae4de30779aae3b53"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ad09bb76ad67581b03ab176832cca37cf"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ad09bb76ad67581b03ab176832cca37cf">statevec_collapseToKnownProbOutcomeDistributedRenorm</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability)</td></tr>
<tr class="memdesc:ad09bb76ad67581b03ab176832cca37cf"><td class="mdescLeft"> </td><td class="mdescRight">Renormalise parts of the state vector where measureQubit=0 or 1, based on the total probability of that qubit being in state 0 or 1. <a href="QuEST__cpu__internal_8h.html#ad09bb76ad67581b03ab176832cca37cf">More...</a><br /></td></tr>
<tr class="separator:ad09bb76ad67581b03ab176832cca37cf"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab02bce0ebbb8f624e8ced8b09b99cdef"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ab02bce0ebbb8f624e8ced8b09b99cdef">statevec_collapseToKnownProbOutcomeLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit, int outcome, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability)</td></tr>
<tr class="memdesc:ab02bce0ebbb8f624e8ced8b09b99cdef"><td class="mdescLeft"> </td><td class="mdescRight">Update the state vector to be consistent with measuring measureQubit=0 if outcome=0 and measureQubit=1 if outcome=1. <a href="QuEST__cpu__internal_8h.html#ab02bce0ebbb8f624e8ced8b09b99cdef">More...</a><br /></td></tr>
<tr class="separator:ab02bce0ebbb8f624e8ced8b09b99cdef"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a7ea68e9132ed9db9c242353a33dba2f0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a7ea68e9132ed9db9c242353a33dba2f0">statevec_collapseToOutcomeDistributedSetZero</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="separator:a7ea68e9132ed9db9c242353a33dba2f0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0a7a35628b1c1eb47336deb9afda5b68"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a0a7a35628b1c1eb47336deb9afda5b68">statevec_compactUnitaryDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structComplex.html">Complex</a> rot1, <a class="el" href="structComplex.html">Complex</a> rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:a0a7a35628b1c1eb47336deb9afda5b68"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha and beta, and a subset of the state vector with upper and lower block values stored seperately. <a href="QuEST__cpu__internal_8h.html#a0a7a35628b1c1eb47336deb9afda5b68">More...</a><br /></td></tr>
<tr class="separator:a0a7a35628b1c1eb47336deb9afda5b68"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a5ddfdb22e4704b680d67d08d9e80835b"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a5ddfdb22e4704b680d67d08d9e80835b">statevec_compactUnitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a5ddfdb22e4704b680d67d08d9e80835b"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a071baf8b6951d2a7d6529394b6f39364"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a071baf8b6951d2a7d6529394b6f39364">statevec_controlledCompactUnitaryDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, <a class="el" href="structComplex.html">Complex</a> rot1, <a class="el" href="structComplex.html">Complex</a> rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:a071baf8b6951d2a7d6529394b6f39364"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha and beta and a subset of the state vector with upper and lower block values stored seperately. <a href="QuEST__cpu__internal_8h.html#a071baf8b6951d2a7d6529394b6f39364">More...</a><br /></td></tr>
<tr class="separator:a071baf8b6951d2a7d6529394b6f39364"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a215e2d6f88dbecc0b408b3573b5e144f"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a215e2d6f88dbecc0b408b3573b5e144f">statevec_controlledCompactUnitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, <a class="el" href="structComplex.html">Complex</a> alpha, <a class="el" href="structComplex.html">Complex</a> beta)</td></tr>
<tr class="separator:a215e2d6f88dbecc0b408b3573b5e144f"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a393da4c4bc582a757ca8406d8501aca0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a393da4c4bc582a757ca8406d8501aca0">statevec_controlledNotDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, ComplexArray stateVecIn, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:a393da4c4bc582a757ca8406d8501aca0"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by {{0,1},{1,0}. <a href="QuEST__cpu__internal_8h.html#a393da4c4bc582a757ca8406d8501aca0">More...</a><br /></td></tr>
<tr class="separator:a393da4c4bc582a757ca8406d8501aca0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ace1482ef82b83e7f926634a67b322fc4"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ace1482ef82b83e7f926634a67b322fc4">statevec_controlledNotLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit)</td></tr>
<tr class="separator:ace1482ef82b83e7f926634a67b322fc4"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae64f9630325b6f93c6e1e17b9918ecef"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ae64f9630325b6f93c6e1e17b9918ecef">statevec_controlledPauliYDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, ComplexArray stateVecIn, ComplexArray stateVecOut, int conjFactor)</td></tr>
<tr class="separator:ae64f9630325b6f93c6e1e17b9918ecef"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abc6383ac53124601e58922205b3cc484"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#abc6383ac53124601e58922205b3cc484">statevec_controlledPauliYLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, int conjFactor)</td></tr>
<tr class="separator:abc6383ac53124601e58922205b3cc484"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a57368529b2a7e76fec423cbfe9980b22"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a57368529b2a7e76fec423cbfe9980b22">statevec_controlledUnitaryDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, <a class="el" href="structComplex.html">Complex</a> rot1, <a class="el" href="structComplex.html">Complex</a> rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:a57368529b2a7e76fec423cbfe9980b22"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha and beta and a subset of the state vector with upper and lower block values stored seperately. <a href="QuEST__cpu__internal_8h.html#a57368529b2a7e76fec423cbfe9980b22">More...</a><br /></td></tr>
<tr class="separator:a57368529b2a7e76fec423cbfe9980b22"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a903beb4f5d8753a964ce2dc5f9096a24"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a903beb4f5d8753a964ce2dc5f9096a24">statevec_controlledUnitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int controlQubit, int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:a903beb4f5d8753a964ce2dc5f9096a24"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a430d98e35f1eae7f0815ac539057cf67"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a430d98e35f1eae7f0815ac539057cf67">statevec_findProbabilityOfZeroDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg)</td></tr>
<tr class="memdesc:a430d98e35f1eae7f0815ac539057cf67"><td class="mdescLeft"> </td><td class="mdescRight">Measure the probability of a specified qubit being in the zero state across all amplitudes held in this chunk. <a href="QuEST__cpu__internal_8h.html#a430d98e35f1eae7f0815ac539057cf67">More...</a><br /></td></tr>
<tr class="separator:a430d98e35f1eae7f0815ac539057cf67"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a8535bc15c2ff249ddddb3fde6eff1490"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a8535bc15c2ff249ddddb3fde6eff1490">statevec_findProbabilityOfZeroLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int measureQubit)</td></tr>
<tr class="memdesc:a8535bc15c2ff249ddddb3fde6eff1490"><td class="mdescLeft"> </td><td class="mdescRight">Measure the total probability of a specified qubit being in the zero state across all amplitudes in this chunk. <a href="QuEST__cpu__internal_8h.html#a8535bc15c2ff249ddddb3fde6eff1490">More...</a><br /></td></tr>
<tr class="separator:a8535bc15c2ff249ddddb3fde6eff1490"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abea6570b95fdfa102511ccd1fcb30685"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#abea6570b95fdfa102511ccd1fcb30685">statevec_hadamardDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut, int updateUpper)</td></tr>
<tr class="memdesc:abea6570b95fdfa102511ccd1fcb30685"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by {{1,1},{1,-1}}/sqrt2. <a href="QuEST__cpu__internal_8h.html#abea6570b95fdfa102511ccd1fcb30685">More...</a><br /></td></tr>
<tr class="separator:abea6570b95fdfa102511ccd1fcb30685"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a86dbcc3db99294add9964741e19fbdab"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a86dbcc3db99294add9964741e19fbdab">statevec_hadamardLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:a86dbcc3db99294add9964741e19fbdab"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ae6f0c9ed9261afbab4712e056a88763d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ae6f0c9ed9261afbab4712e056a88763d">statevec_multiControlledMultiQubitNotDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int ctrlMask, int targMask, ComplexArray stateVecIn, ComplexArray stateVecOut)</td></tr>
<tr class="separator:ae6f0c9ed9261afbab4712e056a88763d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ac7d30ce54573c75b35386cd0e284adc5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ac7d30ce54573c75b35386cd0e284adc5">statevec_multiControlledMultiQubitNotLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int ctrlMask, int targMask)</td></tr>
<tr class="separator:ac7d30ce54573c75b35386cd0e284adc5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0aedcccfa50c7aaa8b7fc4c14d7cdfb8"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a0aedcccfa50c7aaa8b7fc4c14d7cdfb8">statevec_multiControlledMultiQubitUnitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int *targs, int numTargs, <a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> u)</td></tr>
<tr class="separator:a0aedcccfa50c7aaa8b7fc4c14d7cdfb8"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:af8236a00389137b5eff986a40577eaf3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#af8236a00389137b5eff986a40577eaf3">statevec_multiControlledTwoQubitUnitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, long long int ctrlMask, int q1, int q2, <a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> u)</td></tr>
<tr class="separator:af8236a00389137b5eff986a40577eaf3"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab58fe4be895283c2c4eb86ec9af5682e"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ab58fe4be895283c2c4eb86ec9af5682e">statevec_multiControlledUnitaryDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, long long int ctrlQubitsMask, long long int ctrlFlipMask, <a class="el" href="structComplex.html">Complex</a> rot1, <a class="el" href="structComplex.html">Complex</a> rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:ab58fe4be895283c2c4eb86ec9af5682e"><td class="mdescLeft"> </td><td class="mdescRight">Apply a unitary operation to a single qubit in the state vector of probability amplitudes, given a subset of the state vector with upper and lower block values stored seperately. <a href="QuEST__cpu__internal_8h.html#ab58fe4be895283c2c4eb86ec9af5682e">More...</a><br /></td></tr>
<tr class="separator:ab58fe4be895283c2c4eb86ec9af5682e"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab19f28e68330da68ea3caa2bdef32da9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ab19f28e68330da68ea3caa2bdef32da9">statevec_multiControlledUnitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, long long int ctrlQubitsMask, long long int ctrlFlipMask, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:ab19f28e68330da68ea3caa2bdef32da9"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a464efbd1d7ca5a7b25c83ada001955c2"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a464efbd1d7ca5a7b25c83ada001955c2">statevec_pauliXDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, ComplexArray stateVecIn, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:a464efbd1d7ca5a7b25c83ada001955c2"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by {{0,1},{1,0}. <a href="QuEST__cpu__internal_8h.html#a464efbd1d7ca5a7b25c83ada001955c2">More...</a><br /></td></tr>
<tr class="separator:a464efbd1d7ca5a7b25c83ada001955c2"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aa987d1e0ba97da2ca540194356dd62de"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#aa987d1e0ba97da2ca540194356dd62de">statevec_pauliXLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit)</td></tr>
<tr class="separator:aa987d1e0ba97da2ca540194356dd62de"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0f562af6cb665a8a7a3f80e9449734d5"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a0f562af6cb665a8a7a3f80e9449734d5">statevec_pauliYDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, ComplexArray stateVecIn, ComplexArray stateVecOut, int updateUpper, int conjFac)</td></tr>
<tr class="memdesc:a0f562af6cb665a8a7a3f80e9449734d5"><td class="mdescLeft"> </td><td class="mdescRight">Rotate a single qubit by +-{{0,-i},{i,0}. <a href="QuEST__cpu__internal_8h.html#a0f562af6cb665a8a7a3f80e9449734d5">More...</a><br /></td></tr>
<tr class="separator:a0f562af6cb665a8a7a3f80e9449734d5"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a45b0916c3e121837f214b64f7424e479"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a45b0916c3e121837f214b64f7424e479">statevec_pauliYLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, int conjFac)</td></tr>
<tr class="separator:a45b0916c3e121837f214b64f7424e479"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:abe74a5a9db8340e37b80fbc77338894d"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#abe74a5a9db8340e37b80fbc77338894d">statevec_swapQubitAmpsDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int pairRank, int qb1, int qb2)</td></tr>
<tr class="memdesc:abe74a5a9db8340e37b80fbc77338894d"><td class="mdescLeft"> </td><td class="mdescRight">qureg.pairStateVec contains the entire set of amplitudes of the paired node which includes the set of all amplitudes which need to be swapped between |..0..1..> and |..1..0..> <a href="QuEST__cpu__internal_8h.html#abe74a5a9db8340e37b80fbc77338894d">More...</a><br /></td></tr>
<tr class="separator:abe74a5a9db8340e37b80fbc77338894d"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:ab5b51a28caa8792a3f0c637409a694b0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#ab5b51a28caa8792a3f0c637409a694b0">statevec_swapQubitAmpsLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int qb1, int qb2)</td></tr>
<tr class="memdesc:ab5b51a28caa8792a3f0c637409a694b0"><td class="mdescLeft"> </td><td class="mdescRight">It is ensured that all amplitudes needing to be swapped are on this node. <a href="QuEST__cpu__internal_8h.html#ab5b51a28caa8792a3f0c637409a694b0">More...</a><br /></td></tr>
<tr class="separator:ab5b51a28caa8792a3f0c637409a694b0"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:a0ce2c2fd54df25495e99dc5b95bed4b2"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#a0ce2c2fd54df25495e99dc5b95bed4b2">statevec_unitaryDistributed</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, <a class="el" href="structComplex.html">Complex</a> rot1, <a class="el" href="structComplex.html">Complex</a> rot2, ComplexArray stateVecUp, ComplexArray stateVecLo, ComplexArray stateVecOut)</td></tr>
<tr class="memdesc:a0ce2c2fd54df25495e99dc5b95bed4b2"><td class="mdescLeft"> </td><td class="mdescRight">Apply a unitary operation to a single qubit given a subset of the state vector with upper and lower block values stored seperately. <a href="QuEST__cpu__internal_8h.html#a0ce2c2fd54df25495e99dc5b95bed4b2">More...</a><br /></td></tr>
<tr class="separator:a0ce2c2fd54df25495e99dc5b95bed4b2"><td class="memSeparator" colspan="2"> </td></tr>
<tr class="memitem:aafc398f8f479fcc066a2dea700235635"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="QuEST__cpu__internal_8h.html#aafc398f8f479fcc066a2dea700235635">statevec_unitaryLocal</a> (<a class="el" href="structQureg.html">Qureg</a> qureg, int targetQubit, <a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> u)</td></tr>
<tr class="separator:aafc398f8f479fcc066a2dea700235635"><td class="memSeparator" colspan="2"> </td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Internal functions used to implement the pure backend in ../QuEST_ops_pure.h. Do not call these functions directly. In general, qubits_cpu_local.c and qubits_cpu_mpi.c will implement the pure backend by choosing the correct function or combination of functions to use from those included here, which are defined in <a class="el" href="QuEST__cpu_8c.html">QuEST_cpu.c</a></p>
<dl class="section author"><dt>Author</dt><dd>Ania Brown </dd>
<dd>
Tyson Jones </dd>
<dd>
Balint Koczor </dd></dl>
<p class="definition">Definition in file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
</div><h2 class="groupheader">Function Documentation</h2>
<a id="afa58cf7cb98a25ab33621120c5c330d0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afa58cf7cb98a25ab33621120c5c330d0">◆ </a></span>densmatr_applyDiagonalOpLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_applyDiagonalOpLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l04082">4082</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>  {</div>
<div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>  </div>
<div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>  <span class="comment">/* ALL values of op are pre-loaded into qureg.pairStateVector (on every node).</span></div>
<div class="line"><a name="l04085"></a><span class="lineno"> 4085</span> <span class="comment"> * Furthermore, since it's gauranteed each node contains an integer number of </span></div>
<div class="line"><a name="l04086"></a><span class="lineno"> 4086</span> <span class="comment"> * columns of qureg (because op upperlimits the number of nodes; 1 per element),</span></div>
<div class="line"><a name="l04087"></a><span class="lineno"> 4087</span> <span class="comment"> * then we know iteration below begins at the 'top' of a column, and there is </span></div>
<div class="line"><a name="l04088"></a><span class="lineno"> 4088</span> <span class="comment"> * no offset for op (pairStateVector)</span></div>
<div class="line"><a name="l04089"></a><span class="lineno"> 4089</span> <span class="comment"> */</span></div>
<div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>  </div>
<div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>  <span class="keywordtype">int</span> opDim = (1 << op.<a class="code" href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">numQubits</a>);</div>
<div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>  </div>
<div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opRe = qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real;</div>
<div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opIm = qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag;</div>
<div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>  </div>
<div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> a,b,c,d;</div>
<div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>  </div>
<div class="line"><a name="l04102"></a><span class="lineno"> 4102</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l04103"></a><span class="lineno"> 4103</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l04104"></a><span class="lineno"> 4104</span> <span class="preprocessor"> shared (stateRe,stateIm, opRe,opIm, numAmps,opDim) \</span></div>
<div class="line"><a name="l04105"></a><span class="lineno"> 4105</span> <span class="preprocessor"> private (index, a,b,c,d)</span></div>
<div class="line"><a name="l04106"></a><span class="lineno"> 4106</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>  {</div>
<div class="line"><a name="l04108"></a><span class="lineno"> 4108</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l04109"></a><span class="lineno"> 4109</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l04110"></a><span class="lineno"> 4110</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>  <span class="keywordflow">for</span> (index=0LL; index<numAmps; index++) {</div>
<div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>  a = stateRe[index];</div>
<div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>  b = stateIm[index];</div>
<div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>  c = opRe[index % opDim];</div>
<div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>  d = opIm[index % opDim];</div>
<div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>  </div>
<div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>  <span class="comment">// (a + b i)(c + d i) = (a c - b d) + i (a d + b c)</span></div>
<div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>  stateRe[index] = a*c - b*d;</div>
<div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>  stateIm[index] = a*d + b*c;</div>
<div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>  }</div>
<div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>  }</div>
<div class="line"><a name="l04122"></a><span class="lineno"> 4122</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00300">DiagonalOp::numQubits</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01594">densmatr_applyDiagonalOp()</a>.</p>
</div>
</div>
<a id="aeb4453a2e609e5359d2995bccf6663ca"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aeb4453a2e609e5359d2995bccf6663ca">◆ </a></span>densmatr_calcExpecDiagonalOpLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> densmatr_calcExpecDiagonalOpLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l04167">4167</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>  {</div>
<div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>  </div>
<div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>  <span class="comment">/* since for every 1 element in \p op, there exists a column in \p qureg, </span></div>
<div class="line"><a name="l04170"></a><span class="lineno"> 4170</span> <span class="comment"> * we know that the elements in \p op live on the same node as the </span></div>
<div class="line"><a name="l04171"></a><span class="lineno"> 4171</span> <span class="comment"> * corresponding diagonal elements of \p qureg. This means, the problem is </span></div>
<div class="line"><a name="l04172"></a><span class="lineno"> 4172</span> <span class="comment"> * embarrassingly parallelisable, and the code below works for both </span></div>
<div class="line"><a name="l04173"></a><span class="lineno"> 4173</span> <span class="comment"> * serial and distributed modes.</span></div>
<div class="line"><a name="l04174"></a><span class="lineno"> 4174</span> <span class="comment"> */</span></div>
<div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>  </div>
<div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>  <span class="comment">// computes first local index containing a diagonal element</span></div>
<div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagSpacing = 1LL + (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numPrevDiags = (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>>0)? 1+(qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>*qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>)/diagSpacing : 0;</div>
<div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalIndNextDiag = diagSpacing * numPrevDiags;</div>
<div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> localIndNextDiag = globalIndNextDiag % qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>  </div>
<div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opReal = op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>;</div>
<div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* opImag = op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>;</div>
<div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>  </div>
<div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecRe = 0;</div>
<div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecIm = 0;</div>
<div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>  </div>
<div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> stateInd;</div>
<div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> opInd;</div>
<div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> matRe, matIm, opRe, opIm;</div>
<div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>  </div>
<div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>  <span class="comment">// visits every diagonal element with global index (2^n + 1)i for i in [0, 2^n-1]</span></div>
<div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>  </div>
<div class="line"><a name="l04197"></a><span class="lineno"> 4197</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l04198"></a><span class="lineno"> 4198</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l04199"></a><span class="lineno"> 4199</span> <span class="preprocessor"> shared (stateReal,stateImag, opReal,opImag, localIndNextDiag,diagSpacing,numAmps) \</span></div>
<div class="line"><a name="l04200"></a><span class="lineno"> 4200</span> <span class="preprocessor"> private (stateInd,opInd, matRe,matIm, opRe,opIm) \</span></div>
<div class="line"><a name="l04201"></a><span class="lineno"> 4201</span> <span class="preprocessor"> reduction ( +:expecRe, expecIm )</span></div>
<div class="line"><a name="l04202"></a><span class="lineno"> 4202</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>  {</div>
<div class="line"><a name="l04204"></a><span class="lineno"> 4204</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l04205"></a><span class="lineno"> 4205</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l04206"></a><span class="lineno"> 4206</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>  <span class="keywordflow">for</span> (stateInd=localIndNextDiag; stateInd < numAmps; stateInd += diagSpacing) {</div>
<div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>  </div>
<div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>  matRe = stateReal[stateInd];</div>
<div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>  matIm = stateImag[stateInd];</div>
<div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>  opInd = (stateInd - localIndNextDiag) / diagSpacing;</div>
<div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>  opRe = opReal[opInd];</div>
<div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>  opIm = opImag[opInd];</div>
<div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>  </div>
<div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>  <span class="comment">// (matRe + matIm i)(opRe + opIm i) = </span></div>
<div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>  <span class="comment">// (matRe opRe - matIm opIm) + i (matRe opIm + matIm opRe)</span></div>
<div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>  expecRe += matRe * opRe - matIm * opIm;</div>
<div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>  expecIm += matRe * opIm + matIm * opRe;</div>
<div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>  }</div>
<div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>  }</div>
<div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>  </div>
<div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>  <a class="code" href="structComplex.html">Complex</a> expecVal;</div>
<div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>  expecVal.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = expecRe;</div>
<div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>  expecVal.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = expecIm;</div>
<div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>  <span class="keywordflow">return</span> expecVal;</div>
<div class="line"><a name="l04226"></a><span class="lineno"> 4226</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00310">DiagonalOp::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, <a class="el" href="QuEST_8h_source.html#l00308">DiagonalOp::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01618">densmatr_calcExpecDiagonalOp()</a>.</p>
</div>
</div>
<a id="a7772f97cb4d92a9825bf3b7c82c3230c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7772f97cb4d92a9825bf3b7c82c3230c">◆ </a></span>densmatr_calcFidelityLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcFidelityLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>pureState</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes a few dens-columns-worth of (vec^*T) dens * vec </p>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l01001">1001</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  {</div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  </div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  <span class="comment">/* Here, elements of pureState are not accessed (instead grabbed from qureg.pair).</span></div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span> <span class="comment"> * We only consult the attributes.</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span> <span class="comment"> *</span></div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span> <span class="comment"> * qureg is a density matrix, and pureState is a statevector.</span></div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span> <span class="comment"> * Every node contains as many columns of qureg as amps by pureState.</span></div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span> <span class="comment"> * (each node contains an integer, exponent-of-2 number of whole columns of qureg)</span></div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span> <span class="comment"> * Ergo, this node contains columns:</span></div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span> <span class="comment"> * qureg.chunkID * pureState.numAmpsPerChunk to</span></div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span> <span class="comment"> * (qureg.chunkID + 1) * pureState.numAmpsPerChunk</span></div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span> <span class="comment"> *</span></div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span> <span class="comment"> * The first pureState.numAmpsTotal elements of qureg.pairStateVec are the</span></div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span> <span class="comment"> * entire pureState state-vector</span></div>
<div class="line"><a name="l01015"></a><span class="lineno"> 1015</span> <span class="comment"> */</span></div>
<div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  </div>
<div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="comment">// unpack everything for OPENMP</span></div>
<div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecRe = qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real;</div>
<div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecIm = qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag;</div>
<div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densRe = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densIm = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  </div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  <span class="keywordtype">int</span> row, col;</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  <span class="keywordtype">int</span> dim = (int) pureState.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>; </div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  <span class="keywordtype">int</span> colsPerNode = (<span class="keywordtype">int</span>) pureState.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="comment">// using only int, because density matrix has squared as many amps so its </span></div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  <span class="comment">// iteration would be impossible if the pureStates numAmpsTotal didn't fit into int</span></div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  </div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  <span class="comment">// starting GLOBAL column index of the qureg columns on this node</span></div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordtype">int</span> startCol = (int) (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> * pureState.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>);</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  </div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densElemRe, densElemIm;</div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prefacRe, prefacIm;</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rowSumRe, rowSumIm;</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> vecElemRe, vecElemIm;</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>  </div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="comment">// quantity computed by this node</span></div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> globalSumRe = 0; <span class="comment">// imag-component is assumed zero</span></div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  </div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span> <span class="preprocessor"> shared (vecRe,vecIm,densRe,densIm, dim,colsPerNode,startCol) \</span></div>
<div class="line"><a name="l01043"></a><span class="lineno"> 1043</span> <span class="preprocessor"> private (row,col, prefacRe,prefacIm, rowSumRe,rowSumIm, densElemRe,densElemIm, vecElemRe,vecElemIm) \</span></div>
<div class="line"><a name="l01044"></a><span class="lineno"> 1044</span> <span class="preprocessor"> reduction ( +:globalSumRe )</span></div>
<div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  {</div>
<div class="line"><a name="l01047"></a><span class="lineno"> 1047</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01048"></a><span class="lineno"> 1048</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l01049"></a><span class="lineno"> 1049</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// indices of my GLOBAL row</span></div>
<div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">for</span> (row=0; row < dim; row++) {</div>
<div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  </div>
<div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  <span class="comment">// single element of conj(pureState)</span></div>
<div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  prefacRe = vecRe[row];</div>
<div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  prefacIm = - vecIm[row];</div>
<div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  </div>
<div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  rowSumRe = 0;</div>
<div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  rowSumIm = 0;</div>
<div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  </div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>  <span class="comment">// indices of my LOCAL column</span></div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="keywordflow">for</span> (col=0; col < colsPerNode; col++) {</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  </div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  <span class="comment">// my local density element</span></div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  densElemRe = densRe[row + dim*col];</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  densElemIm = densIm[row + dim*col];</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>  </div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  <span class="comment">// state-vector element</span></div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  vecElemRe = vecRe[startCol + col];</div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  vecElemIm = vecIm[startCol + col];</div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  </div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  rowSumRe += densElemRe*vecElemRe - densElemIm*vecElemIm;</div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  rowSumIm += densElemRe*vecElemIm + densElemIm*vecElemRe;</div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  }</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  </div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  globalSumRe += rowSumRe*prefacRe - rowSumIm*prefacIm; </div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  }</div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  }</div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  </div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="keywordflow">return</span> globalSumRe;</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00334">Qureg::numAmpsTotal</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00429">densmatr_calcFidelity()</a>.</p>
</div>
</div>
<a id="a939897137596bb73ad7a028d0beaaa10"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a939897137596bb73ad7a028d0beaaa10">◆ </a></span>densmatr_calcHilbertSchmidtDistanceSquaredLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcHilbertSchmidtDistanceSquaredLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes Tr((a-b) conjTrans(a-b)) = sum of abs values of (a-b) </p>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00934">934</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  {</div>
<div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  </div>
<div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = a.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  </div>
<div class="line"><a name="l00939"></a><span class="lineno"> 939</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aRe = a.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aIm = a.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00941"></a><span class="lineno"> 941</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bRe = b.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bIm = b.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  </div>
<div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace = 0;</div>
<div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> difRe, difIm;</div>
<div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  </div>
<div class="line"><a name="l00947"></a><span class="lineno"> 947</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00948"></a><span class="lineno"> 948</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00949"></a><span class="lineno"> 949</span> <span class="preprocessor"> shared (aRe,aIm, bRe,bIm, numAmps) \</span></div>
<div class="line"><a name="l00950"></a><span class="lineno"> 950</span> <span class="preprocessor"> private (index,difRe,difIm) \</span></div>
<div class="line"><a name="l00951"></a><span class="lineno"> 951</span> <span class="preprocessor"> reduction ( +:trace )</span></div>
<div class="line"><a name="l00952"></a><span class="lineno"> 952</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  {</div>
<div class="line"><a name="l00954"></a><span class="lineno"> 954</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00955"></a><span class="lineno"> 955</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00956"></a><span class="lineno"> 956</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00957"></a><span class="lineno"> 957</span>  <span class="keywordflow">for</span> (index=0LL; index<numAmps; index++) {</div>
<div class="line"><a name="l00958"></a><span class="lineno"> 958</span>  </div>
<div class="line"><a name="l00959"></a><span class="lineno"> 959</span>  difRe = aRe[index] - bRe[index];</div>
<div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  difIm = aIm[index] - bIm[index];</div>
<div class="line"><a name="l00961"></a><span class="lineno"> 961</span>  trace += difRe*difRe + difIm*difIm;</div>
<div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  }</div>
<div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  }</div>
<div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  </div>
<div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  <span class="keywordflow">return</span> trace;</div>
<div class="line"><a name="l00966"></a><span class="lineno"> 966</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00444">densmatr_calcHilbertSchmidtDistance()</a>.</p>
</div>
</div>
<a id="a08392b1b27d10e3b8a8648a5afeaa629"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a08392b1b27d10e3b8a8648a5afeaa629">◆ </a></span>densmatr_calcInnerProductLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcInnerProductLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>b</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>computes Tr(conjTrans(a) b) = sum of (a_ij^* b_ij) </p>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00969">969</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  {</div>
<div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  </div>
<div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = a.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  </div>
<div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aRe = a.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *aIm = a.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bRe = b.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *bIm = b.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  </div>
<div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace = 0;</div>
<div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  </div>
<div class="line"><a name="l00981"></a><span class="lineno"> 981</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00982"></a><span class="lineno"> 982</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00983"></a><span class="lineno"> 983</span> <span class="preprocessor"> shared (aRe,aIm, bRe,bIm, numAmps) \</span></div>
<div class="line"><a name="l00984"></a><span class="lineno"> 984</span> <span class="preprocessor"> private (index) \</span></div>
<div class="line"><a name="l00985"></a><span class="lineno"> 985</span> <span class="preprocessor"> reduction ( +:trace )</span></div>
<div class="line"><a name="l00986"></a><span class="lineno"> 986</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  {</div>
<div class="line"><a name="l00988"></a><span class="lineno"> 988</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00989"></a><span class="lineno"> 989</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00990"></a><span class="lineno"> 990</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  <span class="keywordflow">for</span> (index=0LL; index<numAmps; index++) {</div>
<div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  trace += aRe[index]*bRe[index] + aIm[index]*bIm[index];</div>
<div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  }</div>
<div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  }</div>
<div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  </div>
<div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  <span class="keywordflow">return</span> trace;</div>
<div class="line"><a name="l00997"></a><span class="lineno"> 997</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00455">densmatr_calcInnerProduct()</a>.</p>
</div>
</div>
<a id="a4b0ef5ab721c43c5bacf957e11a65edf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4b0ef5ab721c43c5bacf957e11a65edf">◆ </a></span>densmatr_calcProbOfAllOutcomesLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_calcProbOfAllOutcomesLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>retProbs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03616">3616</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>  {</div>
<div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>  </div>
<div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>  <span class="comment">// clear outcomeProbs (in parallel, in case it's large)</span></div>
<div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numOutcomeProbs = (1 << numQubits);</div>
<div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> j;</div>
<div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>  </div>
<div class="line"><a name="l03622"></a><span class="lineno"> 3622</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03623"></a><span class="lineno"> 3623</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03624"></a><span class="lineno"> 3624</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03625"></a><span class="lineno"> 3625</span> <span class="preprocessor"> shared (numOutcomeProbs,outcomeProbs) \</span></div>
<div class="line"><a name="l03626"></a><span class="lineno"> 3626</span> <span class="preprocessor"> private (j)</span></div>
<div class="line"><a name="l03627"></a><span class="lineno"> 3627</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>  {</div>
<div class="line"><a name="l03629"></a><span class="lineno"> 3629</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03630"></a><span class="lineno"> 3630</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03631"></a><span class="lineno"> 3631</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>  <span class="keywordflow">for</span> (j=0; j<numOutcomeProbs; j++)</div>
<div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>  outcomeProbs[j] = 0;</div>
<div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>  } </div>
<div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>  </div>
<div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>  <span class="comment">// compute first local index containing a diagonal element</span></div>
<div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> localNumAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagSpacing = 1LL + densityDim;</div>
<div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> maxNumDiagsPerChunk = 1 + localNumAmps / diagSpacing;</div>
<div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numPrevDiags = (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>>0)? 1+(qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>*localNumAmps)/diagSpacing : 0;</div>
<div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalIndNextDiag = diagSpacing * numPrevDiags;</div>
<div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> localIndNextDiag = globalIndNextDiag % localNumAmps;</div>
<div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>  </div>
<div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>  <span class="comment">// computes how many diagonals are contained in this chunk</span></div>
<div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numDiagsInThisChunk = maxNumDiagsPerChunk;</div>
<div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>  <span class="keywordflow">if</span> (localIndNextDiag + (numDiagsInThisChunk-1)*diagSpacing >= localNumAmps)</div>
<div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>  numDiagsInThisChunk -= 1;</div>
<div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>  </div>
<div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> visitedDiags; <span class="comment">// number of visited diagonals in this chunk so far</span></div>
<div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> basisStateInd; <span class="comment">// current diagonal index being considered</span></div>
<div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index; <span class="comment">// index in the local chunk</span></div>
<div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>  </div>
<div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>  <span class="keywordtype">int</span> q;</div>
<div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outcomeInd;</div>
<div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateRe = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>  </div>
<div class="line"><a name="l03658"></a><span class="lineno"> 3658</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03659"></a><span class="lineno"> 3659</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03660"></a><span class="lineno"> 3660</span> <span class="preprocessor"> shared (localIndNextDiag, numPrevDiags, diagSpacing, stateRe, numDiagsInThisChunk, qubits,numQubits, outcomeProbs) \</span></div>
<div class="line"><a name="l03661"></a><span class="lineno"> 3661</span> <span class="preprocessor"> private (visitedDiags, basisStateInd, index, q,outcomeInd)</span></div>
<div class="line"><a name="l03662"></a><span class="lineno"> 3662</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>  {</div>
<div class="line"><a name="l03664"></a><span class="lineno"> 3664</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03665"></a><span class="lineno"> 3665</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03666"></a><span class="lineno"> 3666</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>  <span class="comment">// sums the diagonal elems of the density matrix where measureQubit=0</span></div>
<div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>  <span class="keywordflow">for</span> (visitedDiags = 0; visitedDiags < numDiagsInThisChunk; visitedDiags++) {</div>
<div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>  </div>
<div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>  basisStateInd = numPrevDiags + visitedDiags;</div>
<div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>  index = localIndNextDiag + diagSpacing * visitedDiags;</div>
<div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>  </div>
<div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>  <span class="comment">// determine outcome implied by basisStateInd</span></div>
<div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>  outcomeInd = 0;</div>
<div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>  <span class="keywordflow">for</span> (q=0; q<numQubits; q++)</div>
<div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>  outcomeInd += <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], basisStateInd) * (1LL << q);</div>
<div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>  </div>
<div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>  <span class="comment">// atomicly update corresponding outcome array element</span></div>
<div class="line"><a name="l03679"></a><span class="lineno"> 3679</span> <span class="preprocessor"> # ifdef _OPENMP</span></div>
<div class="line"><a name="l03680"></a><span class="lineno"> 3680</span> <span class="preprocessor"> # pragma omp atomic</span></div>
<div class="line"><a name="l03681"></a><span class="lineno"> 3681</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>  outcomeProbs[outcomeInd] += stateRe[index];</div>
<div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>  }</div>
<div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>  }</div>
<div class="line"><a name="l03685"></a><span class="lineno"> 3685</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01349">densmatr_calcProbOfAllOutcomes()</a>.</p>
</div>
</div>
<a id="af910c7cf2b85bdc2c399cfe8dbfb8b9c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af910c7cf2b85bdc2c399cfe8dbfb8b9c">◆ </a></span>densmatr_calcPurityLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_calcPurityLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00872">872</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  {</div>
<div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  </div>
<div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="comment">/* sum of qureg^2, which is sum_i |qureg[i]|^2 */</span></div>
<div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  </div>
<div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> trace = 0;</div>
<div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecRe = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l00880"></a><span class="lineno"> 880</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *vecIm = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  </div>
<div class="line"><a name="l00882"></a><span class="lineno"> 882</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00883"></a><span class="lineno"> 883</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00884"></a><span class="lineno"> 884</span> <span class="preprocessor"> shared (vecRe, vecIm, numAmps) \</span></div>
<div class="line"><a name="l00885"></a><span class="lineno"> 885</span> <span class="preprocessor"> private (index) \</span></div>
<div class="line"><a name="l00886"></a><span class="lineno"> 886</span> <span class="preprocessor"> reduction ( +:trace )</span></div>
<div class="line"><a name="l00887"></a><span class="lineno"> 887</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  {</div>
<div class="line"><a name="l00889"></a><span class="lineno"> 889</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00890"></a><span class="lineno"> 890</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00891"></a><span class="lineno"> 891</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00892"></a><span class="lineno"> 892</span>  <span class="keywordflow">for</span> (index=0LL; index<numAmps; index++) {</div>
<div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  </div>
<div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  trace += vecRe[index]*vecRe[index] + vecIm[index]*vecIm[index];</div>
<div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  }</div>
<div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  }</div>
<div class="line"><a name="l00897"></a><span class="lineno"> 897</span>  </div>
<div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">return</span> trace;</div>
<div class="line"><a name="l00899"></a><span class="lineno"> 899</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01358">densmatr_calcPurity()</a>.</p>
</div>
</div>
<a id="a8bea931504c90d9bd97e74645667804e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8bea931504c90d9bd97e74645667804e">◆ </a></span>densmatr_findProbabilityOfZeroLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> densmatr_findProbabilityOfZeroLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03402">3402</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>  {</div>
<div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>  </div>
<div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>  <span class="comment">// computes first local index containing a diagonal element</span></div>
<div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> localNumAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> densityDim = (1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> diagSpacing = 1LL + densityDim;</div>
<div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> maxNumDiagsPerChunk = 1 + localNumAmps / diagSpacing;</div>
<div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numPrevDiags = (qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>>0)? 1+(qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>*localNumAmps)/diagSpacing : 0;</div>
<div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalIndNextDiag = diagSpacing * numPrevDiags;</div>
<div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> localIndNextDiag = globalIndNextDiag % localNumAmps;</div>
<div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>  </div>
<div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>  <span class="comment">// computes how many diagonals are contained in this chunk</span></div>
<div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numDiagsInThisChunk = maxNumDiagsPerChunk;</div>
<div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>  <span class="keywordflow">if</span> (localIndNextDiag + (numDiagsInThisChunk-1)*diagSpacing >= localNumAmps)</div>
<div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>  numDiagsInThisChunk -= 1;</div>
<div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>  </div>
<div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> visitedDiags; <span class="comment">// number of visited diagonals in this chunk so far</span></div>
<div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> basisStateInd; <span class="comment">// current diagonal index being considered</span></div>
<div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index; <span class="comment">// index in the local chunk</span></div>
<div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>  </div>
<div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> zeroProb = 0;</div>
<div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>  </div>
<div class="line"><a name="l03425"></a><span class="lineno"> 3425</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03426"></a><span class="lineno"> 3426</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03427"></a><span class="lineno"> 3427</span> <span class="preprocessor"> shared (localIndNextDiag, numPrevDiags, diagSpacing, stateVecReal, numDiagsInThisChunk) \</span></div>
<div class="line"><a name="l03428"></a><span class="lineno"> 3428</span> <span class="preprocessor"> private (visitedDiags, basisStateInd, index) \</span></div>
<div class="line"><a name="l03429"></a><span class="lineno"> 3429</span> <span class="preprocessor"> reduction ( +:zeroProb )</span></div>
<div class="line"><a name="l03430"></a><span class="lineno"> 3430</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>  {</div>
<div class="line"><a name="l03432"></a><span class="lineno"> 3432</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03433"></a><span class="lineno"> 3433</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03434"></a><span class="lineno"> 3434</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>  <span class="comment">// sums the diagonal elems of the density matrix where measureQubit=0</span></div>
<div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>  <span class="keywordflow">for</span> (visitedDiags = 0; visitedDiags < numDiagsInThisChunk; visitedDiags++) {</div>
<div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>  </div>
<div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>  basisStateInd = numPrevDiags + visitedDiags;</div>
<div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>  index = localIndNextDiag + diagSpacing * visitedDiags;</div>
<div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>  </div>
<div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(measureQubit, basisStateInd) == 0)</div>
<div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>  zeroProb += stateVecReal[index]; <span class="comment">// assume imag[diagonls] ~ 0</span></div>
<div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>  </div>
<div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>  }</div>
<div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>  }</div>
<div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>  </div>
<div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>  <span class="keywordflow">return</span> zeroProb;</div>
<div class="line"><a name="l03448"></a><span class="lineno"> 3448</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01328">densmatr_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="a1b36518c8fbbc3a5084bb4ad1fb05ea5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1b36518c8fbbc3a5084bb4ad1fb05ea5">◆ </a></span>densmatr_initPureStateLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_initPureStateLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>targetQureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>copyQureg</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l01195">1195</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  {</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  </div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <span class="comment">/* copyQureg amps aren't explicitly used - they're accessed through targetQureg.pair,</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span> <span class="comment"> * which contains the full pure statevector.</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span> <span class="comment"> * targetQureg has as many columns on node as copyQureg has amps</span></div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span> <span class="comment"> */</span></div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  </div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colOffset = targetQureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> * copyQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> colsPerNode = copyQureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> rowsPerNode = copyQureg.<a class="code" href="structQureg.html#adef4935cac95763c29164cf99b144ed4">numAmpsTotal</a>;</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  </div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  <span class="comment">// unpack vars for OpenMP</span></div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecRe = targetQureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real;</div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* vecIm = targetQureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag;</div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densRe = targetQureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* densIm = targetQureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  </div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> col, row, index;</div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  </div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  <span class="comment">// a_i conj(a_j) |i><j|</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> ketRe, ketIm, braRe, braIm;</div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  </div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span> <span class="preprocessor"> shared (colOffset, colsPerNode,rowsPerNode, vecRe,vecIm,densRe,densIm) \</span></div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span> <span class="preprocessor"> private (col,row, ketRe,ketIm,braRe,braIm, index) </span></div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  {</div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  <span class="comment">// local column</span></div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>  <span class="keywordflow">for</span> (col=0; col < colsPerNode; col++) {</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  </div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>  <span class="comment">// global row</span></div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  <span class="keywordflow">for</span> (row=0; row < rowsPerNode; row++) {</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>  </div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="comment">// get pure state amps</span></div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  ketRe = vecRe[row];</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  ketIm = vecIm[row];</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  braRe = vecRe[col + colOffset];</div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  braIm = - vecIm[col + colOffset]; <span class="comment">// minus for conjugation</span></div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  </div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  <span class="comment">// update density matrix</span></div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  index = row + col*rowsPerNode; <span class="comment">// local ind</span></div>
<div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>  densRe[index] = ketRe*braRe - ketIm*braIm;</div>
<div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  densIm[index] = ketRe*braIm + ketIm*braRe;</div>
<div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  }</div>
<div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>  }</div>
<div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  }</div>
<div class="line"><a name="l01246"></a><span class="lineno"> 1246</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00334">Qureg::numAmpsTotal</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00466">densmatr_initPureState()</a>.</p>
</div>
</div>
<a id="a8d9c19a3424f0ad89bfbfd920d65301d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8d9c19a3424f0ad89bfbfd920d65301d">◆ </a></span>densmatr_mixDampingDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDampingDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>damping</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00306">306</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  {</div>
<div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain=1-damping;</div>
<div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase=sqrt(1-damping);</div>
<div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  </div>
<div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="comment">// multiply the off-diagonal (|0><1| and |1><0|) terms by sqrt(1-damping)</span></div>
<div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <a class="code" href="QuEST__cpu_8c.html#a717a0448066831cb5b392bcf2e1d0529">densmatr_oneQubitDegradeOffDiagonal</a>(qureg, targetQubit, dephase);</div>
<div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  </div>
<div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="comment">// below, we modify the diagonals terms which require |1><1| to |0><0| communication</span></div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  </div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeInnerBlock, sizeInnerHalfBlock;</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeOuterColumn, sizeOuterHalfColumn;</div>
<div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisInnerBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  thisOuterColumn, <span class="comment">// current column in density matrix</span></div>
<div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  thisIndex, <span class="comment">// current index in (density matrix representation) state vector</span></div>
<div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  thisIndexInOuterColumn,</div>
<div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  thisIndexInInnerBlock; </div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordtype">int</span> outerBit; </div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordtype">int</span> stateBit;</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  </div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  </div>
<div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  sizeInnerHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  sizeInnerBlock = 2LL * sizeInnerHalfBlock; </div>
<div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  sizeOuterColumn = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  sizeOuterHalfColumn = sizeOuterColumn >> 1;</div>
<div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  </div>
<div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="preprocessor"> shared (sizeInnerBlock,sizeInnerHalfBlock,sizeOuterColumn,sizeOuterHalfColumn, \</span></div>
<div class="line"><a name="l00338"></a><span class="lineno"> 338</span> <span class="preprocessor"> qureg,damping, retain, dephase, numTasks,targetQubit) \</span></div>
<div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="preprocessor"> private (thisTask,thisInnerBlock,thisOuterColumn,thisIndex,thisIndexInOuterColumn, \</span></div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span> <span class="preprocessor"> thisIndexInInnerBlock,outerBit, stateBit)</span></div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  {</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="comment">// thisTask iterates over half the elements in this process' chunk of the density matrix</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="comment">// treat this as iterating over all columns, then iterating over half the values</span></div>
<div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="comment">// within one column.</span></div>
<div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="comment">// If this function has been called, this process' chunk contains half an </span></div>
<div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="comment">// outer block or less</span></div>
<div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="comment">// we want to process all columns in the density matrix,</span></div>
<div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="comment">// updating the values for half of each column (one half of each inner block)</span></div>
<div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  thisOuterColumn = thisTask / sizeOuterHalfColumn;</div>
<div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  thisIndexInOuterColumn = thisTask&(sizeOuterHalfColumn-1); <span class="comment">// thisTask % sizeOuterHalfColumn</span></div>
<div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  thisInnerBlock = thisIndexInOuterColumn/sizeInnerHalfBlock;</div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="comment">// get index in state vector corresponding to upper inner block</span></div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  thisIndexInInnerBlock = thisTask&(sizeInnerHalfBlock-1); <span class="comment">// thisTask % sizeInnerHalfBlock</span></div>
<div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  thisIndex = thisOuterColumn*sizeOuterColumn + thisInnerBlock*sizeInnerBlock </div>
<div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  + thisIndexInInnerBlock;</div>
<div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="comment">// check if we are in the upper or lower half of an outer block</span></div>
<div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  outerBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(targetQubit, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)>>qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="comment">// if we are in the lower half of an outer block, shift to be in the lower half</span></div>
<div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="comment">// of the inner block as well (we want to dephase |0><0| and |1><1| only)</span></div>
<div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  thisIndex += outerBit*(sizeInnerHalfBlock);</div>
<div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  </div>
<div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="comment">// NOTE: at this point thisIndex should be the index of the element we want to </span></div>
<div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="comment">// dephase in the chunk of the state vector on this process, in the </span></div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="comment">// density matrix representation. </span></div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="comment">// thisTask is the index of the pair element in pairStateVec</span></div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  </div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="comment">// Extract state bit, is 0 if thisIndex corresponds to a state with 0 in the target qubit</span></div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="comment">// and is 1 if thisIndex corresponds to a state with 1 in the target qubit</span></div>
<div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  stateBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(targetQubit, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>));</div>
<div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  </div>
<div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="comment">// state[thisIndex] = (1-depolLevel)*state[thisIndex] + depolLevel*(state[thisIndex]</span></div>
<div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="comment">// + pair[thisTask])/2</span></div>
<div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordflow">if</span>(stateBit == 0){</div>
<div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] +</div>
<div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  damping*( qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real[thisTask]);</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  </div>
<div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] +</div>
<div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  damping*( qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag[thisTask]);</div>
<div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  } <span class="keywordflow">else</span>{</div>
<div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex];</div>
<div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  </div>
<div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex];</div>
<div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  }</div>
<div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  } </div>
<div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  } </div>
<div class="line"><a name="l00391"></a><span class="lineno"> 391</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00054">densmatr_oneQubitDegradeOffDiagonal()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00739">densmatr_mixDamping()</a>.</p>
</div>
</div>
<a id="ab124a3a9956046bf9c0e1e3ae9171f42"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab124a3a9956046bf9c0e1e3ae9171f42">◆ </a></span>densmatr_mixDampingLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDampingLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>damping</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00180">180</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  {</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain=1-damping;</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> dephase=sqrt(retain);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  </div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> innerMask = 1LL << targetQubit;</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerMask = 1LL << (targetQubit + (qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>));</div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totMask = innerMask|outerMask;</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  </div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> partner;</div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisPattern;</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  </div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">//qreal realAv, imagAv;</span></div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  </div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span> <span class="preprocessor"> shared (innerMask,outerMask,totMask,qureg,retain,damping,dephase,numTasks) \</span></div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span> <span class="preprocessor"> private (thisTask,partner,thisPattern)</span></div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  {</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++){</div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  thisPattern = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMask;</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span> ((thisPattern==innerMask) || (thisPattern==outerMask)){</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="comment">// do dephase</span></div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="comment">// the lines below will degrade the off-diagonal terms |..0..><..1..| and |..1..><..0..|</span></div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = dephase*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask]; </div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = dephase*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask]; </div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keywordflow">if</span> ((thisTask&totMask)==0){ <span class="comment">//this element relates to targetQubit in state 0</span></div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="comment">// do depolarise</span></div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  partner = thisTask | totMask;</div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="comment">//realAv = (qureg.stateVec.real[thisTask] + qureg.stateVec.real[partner]) /2 ;</span></div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="comment">//imagAv = (qureg.stateVec.imag[thisTask] + qureg.stateVec.imag[partner]) /2 ;</span></div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  </div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] + damping*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner];</div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] + damping*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner];</div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  </div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner];</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner];</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  }</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  }</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  } </div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  }</div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00739">densmatr_mixDamping()</a>.</p>
</div>
</div>
<a id="a88670d0e7cebe33f61c1dd98daa338b3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a88670d0e7cebe33f61c1dd98daa338b3">◆ </a></span>densmatr_mixDepolarisingDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDepolarisingDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00230">230</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  {</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  </div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="comment">// first do dephase part. </span></div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="comment">// TODO -- this might be more efficient to do at the same time as the depolarise if we move to</span></div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="comment">// iterating over all elements in the state vector for the purpose of vectorisation</span></div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="comment">// TODO -- if we keep this split, move this function to densmatr_mixDepolarising()</span></div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <a class="code" href="QuEST__cpu_8c.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a>(qureg, targetQubit, depolLevel);</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  </div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeInnerBlock, sizeInnerHalfBlock;</div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeOuterColumn, sizeOuterHalfColumn;</div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisInnerBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  thisOuterColumn, <span class="comment">// current column in density matrix</span></div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  thisIndex, <span class="comment">// current index in (density matrix representation) state vector</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  thisIndexInOuterColumn,</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  thisIndexInInnerBlock; </div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordtype">int</span> outerBit; </div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  </div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  </div>
<div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  sizeInnerHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  sizeInnerBlock = 2LL * sizeInnerHalfBlock; </div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  sizeOuterColumn = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  sizeOuterHalfColumn = sizeOuterColumn >> 1;</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  </div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span> <span class="preprocessor"> shared (sizeInnerBlock,sizeInnerHalfBlock,sizeOuterColumn,sizeOuterHalfColumn, \</span></div>
<div class="line"><a name="l00260"></a><span class="lineno"> 260</span> <span class="preprocessor"> qureg,depolLevel,numTasks,targetQubit) \</span></div>
<div class="line"><a name="l00261"></a><span class="lineno"> 261</span> <span class="preprocessor"> private (thisTask,thisInnerBlock,thisOuterColumn,thisIndex,thisIndexInOuterColumn, \</span></div>
<div class="line"><a name="l00262"></a><span class="lineno"> 262</span> <span class="preprocessor"> thisIndexInInnerBlock,outerBit)</span></div>
<div class="line"><a name="l00263"></a><span class="lineno"> 263</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  {</div>
<div class="line"><a name="l00265"></a><span class="lineno"> 265</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="comment">// thisTask iterates over half the elements in this process' chunk of the density matrix</span></div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="comment">// treat this as iterating over all columns, then iterating over half the values</span></div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">// within one column.</span></div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="comment">// If this function has been called, this process' chunk contains half an </span></div>
<div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment">// outer block or less</span></div>
<div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="comment">// we want to process all columns in the density matrix,</span></div>
<div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="comment">// updating the values for half of each column (one half of each inner block)</span></div>
<div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  thisOuterColumn = thisTask / sizeOuterHalfColumn;</div>
<div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  thisIndexInOuterColumn = thisTask&(sizeOuterHalfColumn-1); <span class="comment">// thisTask % sizeOuterHalfColumn</span></div>
<div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  thisInnerBlock = thisIndexInOuterColumn/sizeInnerHalfBlock;</div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="comment">// get index in state vector corresponding to upper inner block</span></div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  thisIndexInInnerBlock = thisTask&(sizeInnerHalfBlock-1); <span class="comment">// thisTask % sizeInnerHalfBlock</span></div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  thisIndex = thisOuterColumn*sizeOuterColumn + thisInnerBlock*sizeInnerBlock </div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  + thisIndexInInnerBlock;</div>
<div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="comment">// check if we are in the upper or lower half of an outer block</span></div>
<div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  outerBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(targetQubit, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)>>qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="comment">// if we are in the lower half of an outer block, shift to be in the lower half</span></div>
<div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">// of the inner block as well (we want to dephase |0><0| and |1><1| only)</span></div>
<div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  thisIndex += outerBit*(sizeInnerHalfBlock);</div>
<div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  </div>
<div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="comment">// NOTE: at this point thisIndex should be the index of the element we want to </span></div>
<div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="comment">// dephase in the chunk of the state vector on this process, in the </span></div>
<div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="comment">// density matrix representation. </span></div>
<div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="comment">// thisTask is the index of the pair element in pairStateVec</span></div>
<div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  </div>
<div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  </div>
<div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="comment">// state[thisIndex] = (1-depolLevel)*state[thisIndex] + depolLevel*(state[thisIndex]</span></div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="comment">// + pair[thisTask])/2</span></div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] = (1-depolLevel)*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] +</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  depolLevel*(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] + qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real[thisTask])/2;</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  </div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] = (1-depolLevel)*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] +</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  depolLevel*(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] + qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag[thisTask])/2;</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  } </div>
<div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  } </div>
<div class="line"><a name="l00304"></a><span class="lineno"> 304</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__cpu_8c_source.html#l00085">densmatr_mixDephasing()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00712">densmatr_mixDepolarising()</a>.</p>
</div>
</div>
<a id="ab750fb47da2fca9849c678c869e40e69"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab750fb47da2fca9849c678c869e40e69">◆ </a></span>densmatr_mixDepolarisingLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixDepolarisingLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>depolLevel</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00131">131</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> retain=1-depolLevel;</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  </div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> innerMask = 1LL << targetQubit;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerMask = 1LL << (targetQubit + (qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>));</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totMask = innerMask|outerMask;</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  </div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> partner;</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisPattern;</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  </div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> realAv, imagAv;</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="preprocessor"> shared (innerMask,outerMask,totMask,qureg,retain,depolLevel,numTasks) \</span></div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="preprocessor"> private (thisTask,partner,thisPattern,realAv,imagAv)</span></div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  {</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++){</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  thisPattern = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMask;</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordflow">if</span> ((thisPattern==innerMask) || (thisPattern==outerMask)){</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// do dephase</span></div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// the lines below will degrade the off-diagonal terms |..0..><..1..| and |..1..><..0..|</span></div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask]; </div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask]; </div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">if</span> ((thisTask&totMask)==0){ <span class="comment">//this element relates to targetQubit in state 0</span></div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="comment">// do depolarise</span></div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  partner = thisTask | totMask;</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  realAv = (qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] + qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner]) /2 ;</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  imagAv = (qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] + qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner]) /2 ;</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  </div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] + depolLevel*realAv;</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] + depolLevel*imagAv;</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] + depolLevel*realAv;</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] = retain*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] + depolLevel*imagAv;</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  }</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  }</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  } </div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  }</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00712">densmatr_mixDepolarising()</a>.</p>
</div>
</div>
<a id="a2f76ec8f08e19bb8e1254aafb10e160e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a2f76ec8f08e19bb8e1254aafb10e160e">◆ </a></span>densmatr_mixTwoQubitDepolarisingDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDepolarisingDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>delta</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>gamma</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00547">547</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  {</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  </div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeInnerBlockQ1, sizeInnerHalfBlockQ1;</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeInnerBlockQ2, sizeInnerHalfBlockQ2, sizeInnerQuarterBlockQ2;</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeOuterColumn, sizeOuterQuarterColumn;</div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisInnerBlockQ2,</div>
<div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  thisOuterColumn, <span class="comment">// current column in density matrix</span></div>
<div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  thisIndex, <span class="comment">// current index in (density matrix representation) state vector</span></div>
<div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  thisIndexInOuterColumn,</div>
<div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  thisIndexInInnerBlockQ1, </div>
<div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  thisIndexInInnerBlockQ2, </div>
<div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  thisInnerBlockQ1InInnerBlockQ2;</div>
<div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordtype">int</span> outerBitQ1, outerBitQ2; </div>
<div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  </div>
<div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>2;</div>
<div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  </div>
<div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  sizeInnerHalfBlockQ1 = 1LL << targetQubit; </div>
<div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  sizeInnerHalfBlockQ2 = 1LL << qubit2; </div>
<div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  sizeInnerQuarterBlockQ2 = sizeInnerHalfBlockQ2 >> 1; </div>
<div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  sizeInnerBlockQ2 = sizeInnerHalfBlockQ2 << 1; </div>
<div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  sizeInnerBlockQ1 = 2LL * sizeInnerHalfBlockQ1; </div>
<div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  sizeOuterColumn = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  sizeOuterQuarterColumn = sizeOuterColumn >> 2;</div>
<div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  </div>
<div class="line"><a name="l00574"></a><span class="lineno"> 574</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00575"></a><span class="lineno"> 575</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00576"></a><span class="lineno"> 576</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00577"></a><span class="lineno"> 577</span> <span class="preprocessor"> shared (sizeInnerBlockQ1,sizeInnerHalfBlockQ1,sizeInnerBlockQ2,sizeInnerHalfBlockQ2,sizeInnerQuarterBlockQ2,\</span></div>
<div class="line"><a name="l00578"></a><span class="lineno"> 578</span> <span class="preprocessor"> sizeOuterColumn,sizeOuterQuarterColumn,qureg,delta,gamma,numTasks,targetQubit,qubit2) \</span></div>
<div class="line"><a name="l00579"></a><span class="lineno"> 579</span> <span class="preprocessor"> private (thisTask,thisInnerBlockQ2,thisInnerBlockQ1InInnerBlockQ2, \</span></div>
<div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <span class="preprocessor"> thisOuterColumn,thisIndex,thisIndexInOuterColumn, \</span></div>
<div class="line"><a name="l00581"></a><span class="lineno"> 581</span> <span class="preprocessor"> thisIndexInInnerBlockQ1,thisIndexInInnerBlockQ2,outerBitQ1,outerBitQ2)</span></div>
<div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  {</div>
<div class="line"><a name="l00584"></a><span class="lineno"> 584</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00585"></a><span class="lineno"> 585</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00586"></a><span class="lineno"> 586</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="comment">// thisTask iterates over half the elements in this process' chunk of the density matrix</span></div>
<div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="comment">// treat this as iterating over all columns, then iterating over half the values</span></div>
<div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="comment">// within one column.</span></div>
<div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="comment">// If this function has been called, this process' chunk contains half an </span></div>
<div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="comment">// outer block or less</span></div>
<div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  <span class="comment">// we want to process all columns in the density matrix,</span></div>
<div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="comment">// updating the values for half of each column (one half of each inner block)</span></div>
<div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  thisOuterColumn = thisTask / sizeOuterQuarterColumn;</div>
<div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="comment">// thisTask % sizeOuterQuarterColumn</span></div>
<div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  thisIndexInOuterColumn = thisTask&(sizeOuterQuarterColumn-1); </div>
<div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  thisInnerBlockQ2 = thisIndexInOuterColumn / sizeInnerQuarterBlockQ2;</div>
<div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="comment">// thisTask % sizeInnerQuarterBlockQ2;</span></div>
<div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  thisIndexInInnerBlockQ2 = thisTask&(sizeInnerQuarterBlockQ2-1);</div>
<div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  thisInnerBlockQ1InInnerBlockQ2 = thisIndexInInnerBlockQ2 / sizeInnerHalfBlockQ1;</div>
<div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="comment">// thisTask % sizeInnerHalfBlockQ1;</span></div>
<div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  thisIndexInInnerBlockQ1 = thisTask&(sizeInnerHalfBlockQ1-1);</div>
<div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  </div>
<div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  <span class="comment">// get index in state vector corresponding to upper inner block</span></div>
<div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  thisIndex = thisOuterColumn*sizeOuterColumn + thisInnerBlockQ2*sizeInnerBlockQ2 </div>
<div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  + thisInnerBlockQ1InInnerBlockQ2*sizeInnerBlockQ1 + thisIndexInInnerBlockQ1;</div>
<div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  </div>
<div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="comment">// check if we are in the upper or lower half of an outer block for Q1</span></div>
<div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  outerBitQ1 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(targetQubit, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)>>qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="comment">// if we are in the lower half of an outer block, shift to be in the lower half</span></div>
<div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="comment">// of the inner block as well (we want to dephase |0><0| and |1><1| only)</span></div>
<div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  thisIndex += outerBitQ1*(sizeInnerHalfBlockQ1);</div>
<div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  </div>
<div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="comment">// check if we are in the upper or lower half of an outer block for Q2</span></div>
<div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  outerBitQ2 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubit2, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)>>qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  <span class="comment">// if we are in the lower half of an outer block, shift to be in the lower half</span></div>
<div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="comment">// of the inner block as well (we want to dephase |0><0| and |1><1| only)</span></div>
<div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  thisIndex += outerBitQ2*(sizeInnerQuarterBlockQ2<<1);</div>
<div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  </div>
<div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="comment">// NOTE: at this point thisIndex should be the index of the element we want to </span></div>
<div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="comment">// dephase in the chunk of the state vector on this process, in the </span></div>
<div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="comment">// density matrix representation. </span></div>
<div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="comment">// thisTask is the index of the pair element in pairStateVec</span></div>
<div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  </div>
<div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  </div>
<div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="comment">// state[thisIndex] = (1-depolLevel)*state[thisIndex] + depolLevel*(state[thisIndex]</span></div>
<div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="comment">// + pair[thisTask])/2</span></div>
<div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="comment">// NOTE: must set gamma=1 if using this function for steps 1 or 2</span></div>
<div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] = gamma*(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] +</div>
<div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  delta*qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real[thisTask]);</div>
<div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] = gamma*(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] +</div>
<div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  delta*qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag[thisTask]);</div>
<div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  } </div>
<div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  } </div>
<div class="line"><a name="l00636"></a><span class="lineno"> 636</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00766">densmatr_mixTwoQubitDepolarising()</a>.</p>
</div>
</div>
<a id="a3510f01d4d15dcc545564eb84c668cad"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3510f01d4d15dcc545564eb84c668cad">◆ </a></span>densmatr_mixTwoQubitDepolarisingLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDepolarisingLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>delta</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>gamma</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00393">393</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  {</div>
<div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> innerMaskQubit1 = 1LL << qubit1;</div>
<div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerMaskQubit1= 1LL << (qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totMaskQubit1 = innerMaskQubit1 | outerMaskQubit1;</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> innerMaskQubit2 = 1LL << qubit2;</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerMaskQubit2 = 1LL << (qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totMaskQubit2 = innerMaskQubit2 | outerMaskQubit2;</div>
<div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  </div>
<div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> partner;</div>
<div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisPatternQubit1, thisPatternQubit2;</div>
<div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  </div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> real00, imag00;</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  </div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span> <span class="preprocessor"> shared (totMaskQubit1,totMaskQubit2,qureg,delta,gamma,numTasks) \</span></div>
<div class="line"><a name="l00412"></a><span class="lineno"> 412</span> <span class="preprocessor"> private (thisTask,partner,thisPatternQubit1,thisPatternQubit2,real00,imag00)</span></div>
<div class="line"><a name="l00413"></a><span class="lineno"> 413</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  {</div>
<div class="line"><a name="l00415"></a><span class="lineno"> 415</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00416"></a><span class="lineno"> 416</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00417"></a><span class="lineno"> 417</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="comment">//--------------------------------------- STEP ONE ---------------------</span></div>
<div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++){ </div>
<div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  thisPatternQubit1 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit1;</div>
<div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  thisPatternQubit2 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit2;</div>
<div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="keywordflow">if</span> ((thisPatternQubit1==0) && ((thisPatternQubit2==0) </div>
<div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  || (thisPatternQubit2==totMaskQubit2))){ </div>
<div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="comment">//this element of form |...X...0...><...X...0...| for X either 0 or 1.</span></div>
<div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  partner = thisTask | totMaskQubit1;</div>
<div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  real00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask];</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  imag00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask];</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  </div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] </div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner];</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] </div>
<div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner];</div>
<div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  </div>
<div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] + delta*real00;</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] + delta*imag00;</div>
<div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  </div>
<div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  }</div>
<div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div>
<div class="line"><a name="l00439"></a><span class="lineno"> 439</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00440"></a><span class="lineno"> 440</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00441"></a><span class="lineno"> 441</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="comment">//--------------------------------------- STEP TWO ---------------------</span></div>
<div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++){ </div>
<div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  thisPatternQubit1 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit1;</div>
<div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  thisPatternQubit2 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit2;</div>
<div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">if</span> ((thisPatternQubit2==0) && ((thisPatternQubit1==0) </div>
<div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  || (thisPatternQubit1==totMaskQubit1))){ </div>
<div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="comment">//this element of form |...0...X...><...0...X...| for X either 0 or 1.</span></div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  partner = thisTask | totMaskQubit2;</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  real00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask];</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  imag00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask];</div>
<div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  </div>
<div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] </div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner];</div>
<div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] </div>
<div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner];</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  </div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] + delta*real00;</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] + delta*imag00;</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  </div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  }</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  }</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  </div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="comment">//--------------------------------------- STEP THREE ---------------------</span></div>
<div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++){ </div>
<div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  thisPatternQubit1 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit1;</div>
<div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  thisPatternQubit2 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit2;</div>
<div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">if</span> ((thisPatternQubit2==0) && ((thisPatternQubit1==0) </div>
<div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  || (thisPatternQubit1==totMaskQubit1))){ </div>
<div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="comment">//this element of form |...0...X...><...0...X...| for X either 0 or 1.</span></div>
<div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  partner = thisTask | totMaskQubit2;</div>
<div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  partner = partner ^ totMaskQubit1;</div>
<div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  real00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask];</div>
<div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  imag00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask];</div>
<div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  </div>
<div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = gamma * (qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] </div>
<div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner]);</div>
<div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = gamma * (qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] </div>
<div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner]);</div>
<div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  </div>
<div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] = gamma * (qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] </div>
<div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  + delta*real00);</div>
<div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] = gamma * (qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] </div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  + delta*imag00);</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  </div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  }</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  }</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00766">densmatr_mixTwoQubitDepolarising()</a>.</p>
</div>
</div>
<a id="ae90f82418e0aa67218d733dbbc681998"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae90f82418e0aa67218d733dbbc681998">◆ </a></span>densmatr_mixTwoQubitDepolarisingLocalPart1()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDepolarisingLocalPart1 </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>delta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00494">494</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  {</div>
<div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> innerMaskQubit1 = 1LL << qubit1;</div>
<div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerMaskQubit1= 1LL << (qubit1 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totMaskQubit1 = innerMaskQubit1 | outerMaskQubit1;</div>
<div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> innerMaskQubit2 = 1LL << qubit2;</div>
<div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outerMaskQubit2 = 1LL << (qubit2 + qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> totMaskQubit2 = innerMaskQubit2 | outerMaskQubit2;</div>
<div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="comment">// correct for being in a particular chunk</span></div>
<div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="comment">//totMaskQubit2 = totMaskQubit2&(qureg.numAmpsPerChunk-1); // totMaskQubit2 % numAmpsPerChunk</span></div>
<div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  </div>
<div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  </div>
<div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> partner;</div>
<div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisPatternQubit1, thisPatternQubit2;</div>
<div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  </div>
<div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> real00, imag00;</div>
<div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  </div>
<div class="line"><a name="l00512"></a><span class="lineno"> 512</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00513"></a><span class="lineno"> 513</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00514"></a><span class="lineno"> 514</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00515"></a><span class="lineno"> 515</span> <span class="preprocessor"> shared (totMaskQubit1,totMaskQubit2,qureg,delta,numTasks) \</span></div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span> <span class="preprocessor"> private (thisTask,partner,thisPatternQubit1,thisPatternQubit2,real00,imag00)</span></div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  {</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  </div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00521"></a><span class="lineno"> 521</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00522"></a><span class="lineno"> 522</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">//--------------------------------------- STEP ONE ---------------------</span></div>
<div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask ++){ </div>
<div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  thisPatternQubit1 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit1;</div>
<div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  thisPatternQubit2 = (thisTask+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)&totMaskQubit2;</div>
<div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">if</span> ((thisPatternQubit1==0) && ((thisPatternQubit2==0) </div>
<div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  || (thisPatternQubit2==totMaskQubit2))){ </div>
<div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="comment">//this element of form |...X...0...><...X...0...| for X either 0 or 1.</span></div>
<div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  partner = thisTask | totMaskQubit1;</div>
<div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  real00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask];</div>
<div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  imag00 = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask];</div>
<div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  </div>
<div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisTask] </div>
<div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner];</div>
<div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisTask] </div>
<div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  + delta*qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner];</div>
<div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  </div>
<div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[partner] + delta*real00;</div>
<div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[partner] + delta*imag00;</div>
<div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  </div>
<div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  }</div>
<div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div>
<div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  }</div>
<div class="line"><a name="l00545"></a><span class="lineno"> 545</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00766">densmatr_mixTwoQubitDepolarising()</a>.</p>
</div>
</div>
<a id="acabdfbd3184d3ab3bded61e24142b800"></a>
<h2 class="memtitle"><span class="permalink"><a href="#acabdfbd3184d3ab3bded61e24142b800">◆ </a></span>densmatr_mixTwoQubitDepolarisingQ1LocalQ2DistributedPart3()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void densmatr_mixTwoQubitDepolarisingQ1LocalQ2DistributedPart3 </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qubit2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>delta</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>gamma</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l00638">638</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  {</div>
<div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  </div>
<div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeInnerBlockQ1, sizeInnerHalfBlockQ1;</div>
<div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeInnerBlockQ2, sizeInnerHalfBlockQ2, sizeInnerQuarterBlockQ2;</div>
<div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeOuterColumn, sizeOuterQuarterColumn;</div>
<div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisInnerBlockQ2,</div>
<div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  thisOuterColumn, <span class="comment">// current column in density matrix</span></div>
<div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  thisIndex, <span class="comment">// current index in (density matrix representation) state vector</span></div>
<div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  thisIndexInPairVector,</div>
<div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  thisIndexInOuterColumn,</div>
<div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  thisIndexInInnerBlockQ1, </div>
<div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  thisIndexInInnerBlockQ2, </div>
<div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  thisInnerBlockQ1InInnerBlockQ2;</div>
<div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordtype">int</span> outerBitQ1, outerBitQ2; </div>
<div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  </div>
<div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>2;</div>
<div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  </div>
<div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  sizeInnerHalfBlockQ1 = 1LL << targetQubit; </div>
<div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  sizeInnerHalfBlockQ2 = 1LL << qubit2; </div>
<div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  sizeInnerQuarterBlockQ2 = sizeInnerHalfBlockQ2 >> 1; </div>
<div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  sizeInnerBlockQ2 = sizeInnerHalfBlockQ2 << 1; </div>
<div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  sizeInnerBlockQ1 = 2LL * sizeInnerHalfBlockQ1; </div>
<div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  sizeOuterColumn = 1LL << qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>;</div>
<div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  sizeOuterQuarterColumn = sizeOuterColumn >> 2;</div>
<div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  </div>
<div class="line"><a name="l00666"></a><span class="lineno"> 666</span> <span class="comment">//# if 0</span></div>
<div class="line"><a name="l00667"></a><span class="lineno"> 667</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00668"></a><span class="lineno"> 668</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l00669"></a><span class="lineno"> 669</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l00670"></a><span class="lineno"> 670</span> <span class="preprocessor"> shared (sizeInnerBlockQ1,sizeInnerHalfBlockQ1,sizeInnerBlockQ2,sizeInnerHalfBlockQ2,sizeInnerQuarterBlockQ2,\</span></div>
<div class="line"><a name="l00671"></a><span class="lineno"> 671</span> <span class="preprocessor"> sizeOuterColumn,sizeOuterQuarterColumn,qureg,delta,gamma, numTasks,targetQubit,qubit2) \</span></div>
<div class="line"><a name="l00672"></a><span class="lineno"> 672</span> <span class="preprocessor"> private (thisTask,thisInnerBlockQ2,thisInnerBlockQ1InInnerBlockQ2, \</span></div>
<div class="line"><a name="l00673"></a><span class="lineno"> 673</span> <span class="preprocessor"> thisOuterColumn,thisIndex,thisIndexInPairVector,thisIndexInOuterColumn, \</span></div>
<div class="line"><a name="l00674"></a><span class="lineno"> 674</span> <span class="preprocessor"> thisIndexInInnerBlockQ1,thisIndexInInnerBlockQ2,outerBitQ1,outerBitQ2)</span></div>
<div class="line"><a name="l00675"></a><span class="lineno"> 675</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  {</div>
<div class="line"><a name="l00677"></a><span class="lineno"> 677</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l00678"></a><span class="lineno"> 678</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l00679"></a><span class="lineno"> 679</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l00680"></a><span class="lineno"> 680</span> <span class="comment">//# endif</span></div>
<div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="comment">// thisTask iterates over half the elements in this process' chunk of the density matrix</span></div>
<div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="comment">// treat this as iterating over all columns, then iterating over half the values</span></div>
<div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="comment">// within one column.</span></div>
<div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="comment">// If this function has been called, this process' chunk contains half an </span></div>
<div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="comment">// outer block or less</span></div>
<div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="comment">// we want to process all columns in the density matrix,</span></div>
<div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="comment">// updating the values for half of each column (one half of each inner block)</span></div>
<div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  thisOuterColumn = thisTask / sizeOuterQuarterColumn;</div>
<div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="comment">// thisTask % sizeOuterQuarterColumn</span></div>
<div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  thisIndexInOuterColumn = thisTask&(sizeOuterQuarterColumn-1); </div>
<div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  thisInnerBlockQ2 = thisIndexInOuterColumn / sizeInnerQuarterBlockQ2;</div>
<div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="comment">// thisTask % sizeInnerQuarterBlockQ2;</span></div>
<div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  thisIndexInInnerBlockQ2 = thisTask&(sizeInnerQuarterBlockQ2-1);</div>
<div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  thisInnerBlockQ1InInnerBlockQ2 = thisIndexInInnerBlockQ2 / sizeInnerHalfBlockQ1;</div>
<div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="comment">// thisTask % sizeInnerHalfBlockQ1;</span></div>
<div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  thisIndexInInnerBlockQ1 = thisTask&(sizeInnerHalfBlockQ1-1);</div>
<div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  </div>
<div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="comment">// get index in state vector corresponding to upper inner block</span></div>
<div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  thisIndex = thisOuterColumn*sizeOuterColumn + thisInnerBlockQ2*sizeInnerBlockQ2 </div>
<div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  + thisInnerBlockQ1InInnerBlockQ2*sizeInnerBlockQ1 + thisIndexInInnerBlockQ1;</div>
<div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  </div>
<div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="comment">// check if we are in the upper or lower half of an outer block for Q1</span></div>
<div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  outerBitQ1 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(targetQubit, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)>>qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="comment">// if we are in the lower half of an outer block, shift to be in the lower half</span></div>
<div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <span class="comment">// of the inner block as well (we want to dephase |0><0| and |1><1| only)</span></div>
<div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  thisIndex += outerBitQ1*(sizeInnerHalfBlockQ1);</div>
<div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  </div>
<div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="comment">// For part 3 we need to match elements such that (my Q1 != pair Q1) AND (my Q2 != pair Q2)</span></div>
<div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="comment">// Find correct index in pairStateVector</span></div>
<div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  thisIndexInPairVector = thisTask + (1-outerBitQ1)*sizeInnerHalfBlockQ1*sizeOuterQuarterColumn -</div>
<div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  outerBitQ1*sizeInnerHalfBlockQ1*sizeOuterQuarterColumn;</div>
<div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  </div>
<div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  <span class="comment">// check if we are in the upper or lower half of an outer block for Q2</span></div>
<div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  outerBitQ2 = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubit2, (thisIndex+qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>*qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>)>>qureg.<a class="code" href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">numQubitsRepresented</a>);</div>
<div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="comment">// if we are in the lower half of an outer block, shift to be in the lower half</span></div>
<div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  <span class="comment">// of the inner block as well (we want to dephase |0><0| and |1><1| only)</span></div>
<div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  thisIndex += outerBitQ2*(sizeInnerQuarterBlockQ2<<1);</div>
<div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  </div>
<div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  </div>
<div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="comment">// NOTE: at this point thisIndex should be the index of the element we want to </span></div>
<div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="comment">// dephase in the chunk of the state vector on this process, in the </span></div>
<div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <span class="comment">// density matrix representation. </span></div>
<div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  </div>
<div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  </div>
<div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="comment">// state[thisIndex] = (1-depolLevel)*state[thisIndex] + depolLevel*(state[thisIndex]</span></div>
<div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="comment">// + pair[thisIndexInPairVector])/2</span></div>
<div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] = gamma*(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real[thisIndex] +</div>
<div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  delta*qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real[thisIndexInPairVector]);</div>
<div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  </div>
<div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] = gamma*(qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag[thisIndex] +</div>
<div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  delta*qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag[thisIndexInPairVector]);</div>
<div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  } </div>
<div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  } </div>
<div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  </div>
<div class="line"><a name="l00736"></a><span class="lineno"> 736</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00327">Qureg::numQubitsRepresented</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00766">densmatr_mixTwoQubitDepolarising()</a>.</p>
</div>
</div>
<a id="a100463f6ec212c76a5fad99579000505"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a100463f6ec212c76a5fad99579000505">◆ </a></span>extractBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static int extractBit </td>
<td>(</td>
<td class="paramtype">const int </td>
<td class="paramname"><em>locationOfBitFromRight</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>theEncodedNumber</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu__internal_8h_source.html#l00026">26</a> of file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
<div class="fragment"><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  {</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keywordflow">return</span> (theEncodedNumber & ( 1LL << locationOfBitFromRight )) >> locationOfBitFromRight;</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__internal_8h_source.html#l00038">isOddParity()</a>.</p>
</div>
</div>
<a id="a234f55b49a14dc4c58b1959effeb1b56"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a234f55b49a14dc4c58b1959effeb1b56">◆ </a></span>flipBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static long long int flipBit </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bitInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu__internal_8h_source.html#l00030">30</a> of file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
<div class="fragment"><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  {</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keywordflow">return</span> (number ^ (1LL << bitInd));</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span> }</div>
</div><!-- fragment -->
</div>
</div>
<a id="a8909226b5f0589d82b34af7f6bf2a339"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8909226b5f0589d82b34af7f6bf2a339">◆ </a></span>insertTwoZeroBits()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static long long int insertTwoZeroBits </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bit1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bit2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu__internal_8h_source.html#l00049">49</a> of file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
<div class="fragment"><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  {</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="keywordtype">int</span> small = (bit1 < bit2)? bit1 : bit2;</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordtype">int</span> big = (bit1 < bit2)? bit2 : bit1;</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keywordflow">return</span> <a class="code" href="QuEST__cpu__internal_8h.html#aa183d46d750769c42ff07ae1aaedc105">insertZeroBit</a>(<a class="code" href="QuEST__cpu__internal_8h.html#aa183d46d750769c42ff07ae1aaedc105">insertZeroBit</a>(number, small), big);</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__cpu__internal_8h_source.html#l00042">insertZeroBit()</a>.</p>
</div>
</div>
<a id="aa183d46d750769c42ff07ae1aaedc105"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa183d46d750769c42ff07ae1aaedc105">◆ </a></span>insertZeroBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static long long int insertZeroBit </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>index</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu__internal_8h_source.html#l00042">42</a> of file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
<div class="fragment"><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  {</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> left, right;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  left = (number >> index) << index;</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  right = number - left;</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keywordflow">return</span> (left << 1) ^ right;</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__internal_8h_source.html#l00049">insertTwoZeroBits()</a>.</p>
</div>
</div>
<a id="a0e4eb651e7cb309bcd664b89ac9a2242"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0e4eb651e7cb309bcd664b89ac9a2242">◆ </a></span>isOddParity()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static int isOddParity </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>number</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu__internal_8h_source.html#l00038">38</a> of file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
<div class="fragment"><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  {</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="keywordflow">return</span> <a class="code" href="QuEST__cpu__internal_8h.html#a100463f6ec212c76a5fad99579000505">extractBit</a>(qb1, number) != <a class="code" href="QuEST__cpu__internal_8h.html#a100463f6ec212c76a5fad99579000505">extractBit</a>(qb2, number);</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__cpu__internal_8h_source.html#l00026">extractBit()</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu_8c_source.html#l03965">statevec_swapQubitAmpsDistributed()</a>.</p>
</div>
</div>
<a id="ae94d012c3da6c84599e99f6afea81f5f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae94d012c3da6c84599e99f6afea81f5f">◆ </a></span>maskContainsBit()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static int maskContainsBit </td>
<td>(</td>
<td class="paramtype">const long long int </td>
<td class="paramname"><em>mask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const int </td>
<td class="paramname"><em>bitInd</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu__internal_8h_source.html#l00034">34</a> of file <a class="el" href="QuEST__cpu__internal_8h_source.html">QuEST_cpu_internal.h</a>.</p>
<div class="fragment"><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  {</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="keywordflow">return</span> mask & (1LL << bitInd);</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span> }</div>
</div><!-- fragment -->
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01514">statevec_multiControlledMultiQubitUnitary()</a>, and <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01458">statevec_multiControlledTwoQubitUnitary()</a>.</p>
</div>
</div>
<a id="a16ccb485bcffb328bbd5b2af6977cead"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a16ccb485bcffb328bbd5b2af6977cead">◆ </a></span>statevec_calcExpecDiagonalOpLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> statevec_calcExpecDiagonalOpLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structDiagonalOp.html">DiagonalOp</a> </td>
<td class="paramname"><em>op</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l04124">4124</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>  {</div>
<div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>  </div>
<div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecRe = 0;</div>
<div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> expecIm = 0;</div>
<div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>  </div>
<div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *opReal = op.<a class="code" href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">real</a>;</div>
<div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *opImag = op.<a class="code" href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">imag</a>;</div>
<div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>  </div>
<div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> vecRe,vecIm,vecAbs, opRe, opIm;</div>
<div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>  </div>
<div class="line"><a name="l04138"></a><span class="lineno"> 4138</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l04139"></a><span class="lineno"> 4139</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l04140"></a><span class="lineno"> 4140</span> <span class="preprocessor"> shared (stateReal, stateImag, opReal, opImag, numAmps) \</span></div>
<div class="line"><a name="l04141"></a><span class="lineno"> 4141</span> <span class="preprocessor"> private (index, vecRe,vecIm,vecAbs, opRe,opIm) \</span></div>
<div class="line"><a name="l04142"></a><span class="lineno"> 4142</span> <span class="preprocessor"> reduction ( +:expecRe, expecIm )</span></div>
<div class="line"><a name="l04143"></a><span class="lineno"> 4143</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>  {</div>
<div class="line"><a name="l04145"></a><span class="lineno"> 4145</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l04146"></a><span class="lineno"> 4146</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l04147"></a><span class="lineno"> 4147</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>  <span class="keywordflow">for</span> (index=0; index < numAmps; index++) {</div>
<div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>  vecRe = stateReal[index];</div>
<div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>  vecIm = stateImag[index];</div>
<div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>  opRe = opReal[index];</div>
<div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>  opIm = opImag[index];</div>
<div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>  </div>
<div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>  <span class="comment">// abs(vec)^2 op</span></div>
<div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>  vecAbs = vecRe*vecRe + vecIm*vecIm;</div>
<div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>  expecRe += vecAbs*opRe;</div>
<div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>  expecIm += vecAbs*opIm;</div>
<div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>  }</div>
<div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>  }</div>
<div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>  </div>
<div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>  <a class="code" href="structComplex.html">Complex</a> innerProd;</div>
<div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>  innerProd.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = expecRe;</div>
<div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>  innerProd.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = expecIm;</div>
<div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>  <span class="keywordflow">return</span> innerProd;</div>
<div class="line"><a name="l04165"></a><span class="lineno"> 4165</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00310">DiagonalOp::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, <a class="el" href="QuEST_8h_source.html#l00308">DiagonalOp::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01600">statevec_calcExpecDiagonalOp()</a>.</p>
</div>
</div>
<a id="a6fbb3b693f25dde1e9e3dc87dc1984f7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6fbb3b693f25dde1e9e3dc87dc1984f7">◆ </a></span>statevec_calcInnerProductLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structComplex.html">Complex</a> statevec_calcInnerProductLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>bra</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>ket</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l01082">1082</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  {</div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>  </div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdReal = 0;</div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> innerProdImag = 0;</div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  </div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> index;</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = bra.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *braVecReal = bra.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *braVecImag = bra.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *ketVecReal = ket.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *ketVecImag = ket.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>  </div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> braRe, braIm, ketRe, ketIm;</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  </div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span> <span class="preprocessor"> shared (braVecReal, braVecImag, ketVecReal, ketVecImag, numAmps) \</span></div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span> <span class="preprocessor"> private (index, braRe, braIm, ketRe, ketIm) \</span></div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span> <span class="preprocessor"> reduction ( +:innerProdReal, innerProdImag )</span></div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  {</div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  <span class="keywordflow">for</span> (index=0; index < numAmps; index++) {</div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  braRe = braVecReal[index];</div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  braIm = braVecImag[index];</div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  ketRe = ketVecReal[index];</div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  ketIm = ketVecImag[index];</div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  </div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <span class="comment">// conj(bra_i) * ket_i</span></div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  innerProdReal += braRe*ketRe + braIm*ketIm;</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  innerProdImag += braRe*ketIm - braIm*ketRe;</div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  }</div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>  }</div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  </div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  <a class="code" href="structComplex.html">Complex</a> innerProd;</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>  innerProd.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a> = innerProdReal;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  innerProd.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a> = innerProdImag;</div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  <span class="keywordflow">return</span> innerProd;</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00035">statevec_calcInnerProduct()</a>.</p>
</div>
</div>
<a id="aff4deaf21eb4ae6ae4de30779aae3b53"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aff4deaf21eb4ae6ae4de30779aae3b53">◆ </a></span>statevec_calcProbOfAllOutcomesLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_calcProbOfAllOutcomesLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> * </td>
<td class="paramname"><em>retProbs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>qubits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numQubits</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03549">3549</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>  {</div>
<div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>  </div>
<div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>  <span class="comment">/* Below, we manually reduce amplitudes into outcomeProbs by using atomic update.</span></div>
<div class="line"><a name="l03552"></a><span class="lineno"> 3552</span> <span class="comment"> * This maintains OpenMP 3.1 compatibility. An alternative is to use array reduction </span></div>
<div class="line"><a name="l03553"></a><span class="lineno"> 3553</span> <span class="comment"> * (requires OpenMP 4.5, limits #qubits since outcomeProbs must be a local stack array)</span></div>
<div class="line"><a name="l03554"></a><span class="lineno"> 3554</span> <span class="comment"> * or a dynamic list of omp locks (duplicates memory cost of outcomeProbs).</span></div>
<div class="line"><a name="l03555"></a><span class="lineno"> 3555</span> <span class="comment"> * Using locks was always slower than the method below. Using reduction was only </span></div>
<div class="line"><a name="l03556"></a><span class="lineno"> 3556</span> <span class="comment"> * faster for very few threads, or very few outcomeProbs.</span></div>
<div class="line"><a name="l03557"></a><span class="lineno"> 3557</span> <span class="comment"> * Finally, we exclude the 'update' clause after 'atomic' to maintain MSVC compatibility </span></div>
<div class="line"><a name="l03558"></a><span class="lineno"> 3558</span> <span class="comment"> */</span></div>
<div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>  </div>
<div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numOutcomeProbs = (1 << numQubits);</div>
<div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> j;</div>
<div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>  </div>
<div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>  <span class="comment">// clear outcomeProbs (in parallel, in case it's large)</span></div>
<div class="line"><a name="l03564"></a><span class="lineno"> 3564</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03565"></a><span class="lineno"> 3565</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03566"></a><span class="lineno"> 3566</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03567"></a><span class="lineno"> 3567</span> <span class="preprocessor"> shared (numOutcomeProbs,outcomeProbs) \</span></div>
<div class="line"><a name="l03568"></a><span class="lineno"> 3568</span> <span class="preprocessor"> private (j)</span></div>
<div class="line"><a name="l03569"></a><span class="lineno"> 3569</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>  {</div>
<div class="line"><a name="l03571"></a><span class="lineno"> 3571</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03572"></a><span class="lineno"> 3572</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03573"></a><span class="lineno"> 3573</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>  <span class="keywordflow">for</span> (j=0; j<numOutcomeProbs; j++)</div>
<div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>  outcomeProbs[j] = 0;</div>
<div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>  } </div>
<div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>  </div>
<div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> offset = qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>*qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>  </div>
<div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> i;</div>
<div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outcomeInd;</div>
<div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>  <span class="keywordtype">int</span> q;</div>
<div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> prob;</div>
<div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>  </div>
<div class="line"><a name="l03588"></a><span class="lineno"> 3588</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03589"></a><span class="lineno"> 3589</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03590"></a><span class="lineno"> 3590</span> <span class="preprocessor"> shared (numTasks,offset, qubits,numQubits, stateRe,stateIm, outcomeProbs) \</span></div>
<div class="line"><a name="l03591"></a><span class="lineno"> 3591</span> <span class="preprocessor"> private (i, q, outcomeInd, prob)</span></div>
<div class="line"><a name="l03592"></a><span class="lineno"> 3592</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>  {</div>
<div class="line"><a name="l03594"></a><span class="lineno"> 3594</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03595"></a><span class="lineno"> 3595</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03596"></a><span class="lineno"> 3596</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>  <span class="comment">// every amplitude contributes to a single element of retProbs</span></div>
<div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>  <span class="keywordflow">for</span> (i=0; i<numTasks; i++) {</div>
<div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>  </div>
<div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>  <span class="comment">// determine index informed by qubits outcome</span></div>
<div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>  outcomeInd = 0;</div>
<div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>  <span class="keywordflow">for</span> (q=0; q<numQubits; q++)</div>
<div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>  outcomeInd += <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(qubits[q], i + offset) * (1LL << q);</div>
<div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>  </div>
<div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>  prob = stateRe[i]*stateRe[i] + stateIm[i]*stateIm[i];</div>
<div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>  </div>
<div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>  <span class="comment">// atomicly update corresponding outcome array element</span></div>
<div class="line"><a name="l03608"></a><span class="lineno"> 3608</span> <span class="preprocessor"> # ifdef _OPENMP</span></div>
<div class="line"><a name="l03609"></a><span class="lineno"> 3609</span> <span class="preprocessor"> # pragma omp atomic</span></div>
<div class="line"><a name="l03610"></a><span class="lineno"> 3610</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>  outcomeProbs[outcomeInd] += prob;</div>
<div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>  }</div>
<div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>  }</div>
<div class="line"><a name="l03614"></a><span class="lineno"> 3614</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01340">statevec_calcProbOfAllOutcomes()</a>.</p>
</div>
</div>
<a id="ad09bb76ad67581b03ab176832cca37cf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad09bb76ad67581b03ab176832cca37cf">◆ </a></span>statevec_collapseToKnownProbOutcomeDistributedRenorm()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_collapseToKnownProbOutcomeDistributedRenorm </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>totalProbability</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Renormalise parts of the state vector where measureQubit=0 or 1, based on the total probability of that qubit being in state 0 or 1. </p>
<p>Measure in Zero performs an irreversible change to the state vector: it updates the vector according to the event that the value 'outcome' has been measured on the qubit indicated by measureQubit (where this label starts from 0, of course). It achieves this by setting all inconsistent amplitudes to 0 and then renormalising based on the total probability of measuring measureQubit=0 if outcome=0 and measureQubit=1 if outcome=1. In the distributed version, one block (with measureQubit=0 in the first half of the block and measureQubit=1 in the second half of the block) is spread over multiple chunks, meaning that each chunks performs only renormalisation or only setting amplitudes to 0. This function handles the renormalisation.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">measureQubit</td><td>qubit to measure </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">totalProbability</td><td>probability of qubit measureQubit being zero </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03849">3849</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span> {</div>
<div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>  </div>
<div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> renorm=1/sqrt(totalProbability);</div>
<div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>  </div>
<div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>  </div>
<div class="line"><a name="l03860"></a><span class="lineno"> 3860</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03861"></a><span class="lineno"> 3861</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03862"></a><span class="lineno"> 3862</span> <span class="preprocessor"> shared (numTasks,stateVecReal,stateVecImag) \</span></div>
<div class="line"><a name="l03863"></a><span class="lineno"> 3863</span> <span class="preprocessor"> private (thisTask)</span></div>
<div class="line"><a name="l03864"></a><span class="lineno"> 3864</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>  {</div>
<div class="line"><a name="l03866"></a><span class="lineno"> 3866</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03867"></a><span class="lineno"> 3867</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03868"></a><span class="lineno"> 3868</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>  stateVecReal[thisTask] = stateVecReal[thisTask]*renorm;</div>
<div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>  stateVecImag[thisTask] = stateVecImag[thisTask]*renorm;</div>
<div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>  }</div>
<div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>  }</div>
<div class="line"><a name="l03874"></a><span class="lineno"> 3874</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01368">statevec_collapseToKnownProbOutcome()</a>.</p>
</div>
</div>
<a id="ab02bce0ebbb8f624e8ced8b09b99cdef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab02bce0ebbb8f624e8ced8b09b99cdef">◆ </a></span>statevec_collapseToKnownProbOutcomeLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_collapseToKnownProbOutcomeLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>outcome</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> </td>
<td class="paramname"><em>totalProbability</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Update the state vector to be consistent with measuring measureQubit=0 if outcome=0 and measureQubit=1 if outcome=1. </p>
<p>Performs an irreversible change to the state vector: it updates the vector according to the event that an outcome have been measured on the qubit indicated by measureQubit (where this label starts from 0, of course). It achieves this by setting all inconsistent amplitudes to 0 and then renormalising based on the total probability of measuring measureQubit=0 or 1 according to the value of outcome. In the local version, one or more blocks (with measureQubit=0 in the first half of the block and measureQubit=1 in the second half of the block) fit entirely into one chunk.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">measureQubit</td><td>qubit to measure </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">totalProbability</td><td>probability of qubit measureQubit being either zero or one </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">outcome</td><td>to measure the probability of and set the state to – either zero or one </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03767">3767</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span> {</div>
<div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> renorm; <span class="comment">// probability (returned) value</span></div>
<div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>  <span class="comment">// (good for shared memory parallelism)</span></div>
<div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>  </div>
<div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>  </div>
<div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>  renorm=1/sqrt(totalProbability);</div>
<div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>  </div>
<div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>  </div>
<div class="line"><a name="l03794"></a><span class="lineno"> 3794</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03795"></a><span class="lineno"> 3795</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03796"></a><span class="lineno"> 3796</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03797"></a><span class="lineno"> 3797</span> <span class="preprocessor"> shared (numTasks,sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag,renorm,outcome) \</span></div>
<div class="line"><a name="l03798"></a><span class="lineno"> 3798</span> <span class="preprocessor"> private (thisTask,thisBlock,index)</span></div>
<div class="line"><a name="l03799"></a><span class="lineno"> 3799</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>  {</div>
<div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>  <span class="keywordflow">if</span> (outcome==0){</div>
<div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>  <span class="comment">// measure qubit is 0</span></div>
<div class="line"><a name="l03803"></a><span class="lineno"> 3803</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03804"></a><span class="lineno"> 3804</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03805"></a><span class="lineno"> 3805</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>  stateVecReal[index]=stateVecReal[index]*renorm;</div>
<div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>  stateVecImag[index]=stateVecImag[index]*renorm;</div>
<div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>  </div>
<div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>  stateVecReal[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>  stateVecImag[index+sizeHalfBlock]=0;</div>
<div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>  }</div>
<div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>  } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>  <span class="comment">// measure qubit is 1</span></div>
<div class="line"><a name="l03817"></a><span class="lineno"> 3817</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03818"></a><span class="lineno"> 3818</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03819"></a><span class="lineno"> 3819</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>  stateVecReal[index]=0;</div>
<div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>  stateVecImag[index]=0;</div>
<div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>  </div>
<div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>  stateVecReal[index+sizeHalfBlock]=stateVecReal[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>  stateVecImag[index+sizeHalfBlock]=stateVecImag[index+sizeHalfBlock]*renorm;</div>
<div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>  }</div>
<div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>  }</div>
<div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>  }</div>
<div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>  </div>
<div class="line"><a name="l03832"></a><span class="lineno"> 3832</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01368">statevec_collapseToKnownProbOutcome()</a>.</p>
</div>
</div>
<a id="a7ea68e9132ed9db9c242353a33dba2f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7ea68e9132ed9db9c242353a33dba2f0">◆ </a></span>statevec_collapseToOutcomeDistributedSetZero()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_collapseToOutcomeDistributedSetZero </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03887">3887</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span> {</div>
<div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>  </div>
<div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>  </div>
<div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>  </div>
<div class="line"><a name="l03900"></a><span class="lineno"> 3900</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03901"></a><span class="lineno"> 3901</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03902"></a><span class="lineno"> 3902</span> <span class="preprocessor"> shared (numTasks,stateVecReal,stateVecImag) \</span></div>
<div class="line"><a name="l03903"></a><span class="lineno"> 3903</span> <span class="preprocessor"> private (thisTask)</span></div>
<div class="line"><a name="l03904"></a><span class="lineno"> 3904</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>  {</div>
<div class="line"><a name="l03906"></a><span class="lineno"> 3906</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03907"></a><span class="lineno"> 3907</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03908"></a><span class="lineno"> 3908</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>  stateVecReal[thisTask] = 0;</div>
<div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>  stateVecImag[thisTask] = 0;</div>
<div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>  }</div>
<div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>  }</div>
<div class="line"><a name="l03914"></a><span class="lineno"> 3914</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01368">statevec_collapseToKnownProbOutcome()</a>.</p>
</div>
</div>
<a id="a0a7a35628b1c1eb47336deb9afda5b68"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0a7a35628b1c1eb47336deb9afda5b68">◆ </a></span>statevec_compactUnitaryDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_compactUnitaryDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecUp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecLo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha and beta, and a subset of the state vector with upper and lower block values stored seperately. </p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot1</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot2</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecUp</td><td>probability amplitudes in upper half of a block </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecLo</td><td>probability amplitudes in lower half of a block </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02095">2095</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span> {</div>
<div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>  </div>
<div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>  </div>
<div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot1Real=rot1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot1Imag=rot1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot2Real=rot2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot2Imag=rot2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealUp=stateVecUp.real, *stateVecImagUp=stateVecUp.imag;</div>
<div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealLo=stateVecLo.real, *stateVecImagLo=stateVecLo.imag;</div>
<div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>  </div>
<div class="line"><a name="l02112"></a><span class="lineno"> 2112</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02113"></a><span class="lineno"> 2113</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02114"></a><span class="lineno"> 2114</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02115"></a><span class="lineno"> 2115</span> <span class="preprocessor"> shared (stateVecRealUp,stateVecImagUp,stateVecRealLo,stateVecImagLo,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02116"></a><span class="lineno"> 2116</span> <span class="preprocessor"> rot1Real,rot1Imag, rot2Real,rot2Imag,numTasks) \</span></div>
<div class="line"><a name="l02117"></a><span class="lineno"> 2117</span> <span class="preprocessor"> private (thisTask,stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l02118"></a><span class="lineno"> 2118</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>  {</div>
<div class="line"><a name="l02120"></a><span class="lineno"> 2120</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02121"></a><span class="lineno"> 2121</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02122"></a><span class="lineno"> 2122</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>  stateRealUp = stateVecRealUp[thisTask];</div>
<div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>  stateImagUp = stateVecImagUp[thisTask];</div>
<div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>  </div>
<div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>  stateRealLo = stateVecRealLo[thisTask];</div>
<div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>  stateImagLo = stateVecImagLo[thisTask];</div>
<div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>  </div>
<div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>  stateVecRealOut[thisTask] = rot1Real*stateRealUp - rot1Imag*stateImagUp + rot2Real*stateRealLo + rot2Imag*stateImagLo;</div>
<div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>  stateVecImagOut[thisTask] = rot1Real*stateImagUp + rot1Imag*stateRealUp + rot2Real*stateImagLo - rot2Imag*stateRealLo;</div>
<div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>  }</div>
<div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>  }</div>
<div class="line"><a name="l02136"></a><span class="lineno"> 2136</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00858">statevec_compactUnitary()</a>.</p>
</div>
</div>
<a id="a5ddfdb22e4704b680d67d08d9e80835b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5ddfdb22e4704b680d67d08d9e80835b">◆ </a></span>statevec_compactUnitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_compactUnitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l01754">1754</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span> {</div>
<div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>  </div>
<div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>  </div>
<div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>  </div>
<div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> alphaImag=alpha.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, alphaReal=alpha.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> betaImag=beta.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, betaReal=beta.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>  </div>
<div class="line"><a name="l01774"></a><span class="lineno"> 1774</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01775"></a><span class="lineno"> 1775</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l01776"></a><span class="lineno"> 1776</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l01777"></a><span class="lineno"> 1777</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, alphaReal,alphaImag, betaReal,betaImag, numTasks) \</span></div>
<div class="line"><a name="l01778"></a><span class="lineno"> 1778</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l01779"></a><span class="lineno"> 1779</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>  {</div>
<div class="line"><a name="l01781"></a><span class="lineno"> 1781</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01782"></a><span class="lineno"> 1782</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l01783"></a><span class="lineno"> 1783</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>  </div>
<div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>  </div>
<div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>  </div>
<div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>  </div>
<div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>  </div>
<div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>  } </div>
<div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>  }</div>
<div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>  </div>
<div class="line"><a name="l01811"></a><span class="lineno"> 1811</span> } </div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00858">statevec_compactUnitary()</a>.</p>
</div>
</div>
<a id="a071baf8b6951d2a7d6529394b6f39364"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a071baf8b6951d2a7d6529394b6f39364">◆ </a></span>statevec_controlledCompactUnitaryDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledCompactUnitaryDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecUp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecLo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha and beta and a subset of the state vector with upper and lower block values stored seperately. </p>
<p>Only perform the rotation where the control qubit is one.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>qubit to determine whether or not to perform a rotation </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot1</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot2</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecUp</td><td>probability amplitudes in upper half of a block </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecLo</td><td>probability amplitudes in lower half of a block </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02414">2414</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span> {</div>
<div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>  </div>
<div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>  </div>
<div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>  </div>
<div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot1Real=rot1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot1Imag=rot1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot2Real=rot2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot2Imag=rot2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealUp=stateVecUp.real, *stateVecImagUp=stateVecUp.imag;</div>
<div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealLo=stateVecLo.real, *stateVecImagLo=stateVecLo.imag;</div>
<div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>  </div>
<div class="line"><a name="l02435"></a><span class="lineno"> 2435</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02436"></a><span class="lineno"> 2436</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02437"></a><span class="lineno"> 2437</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02438"></a><span class="lineno"> 2438</span> <span class="preprocessor"> shared (stateVecRealUp,stateVecImagUp,stateVecRealLo,stateVecImagLo,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02439"></a><span class="lineno"> 2439</span> <span class="preprocessor"> rot1Real,rot1Imag, rot2Real,rot2Imag,numTasks,chunkId,chunkSize,controlQubit) \</span></div>
<div class="line"><a name="l02440"></a><span class="lineno"> 2440</span> <span class="preprocessor"> private (thisTask,stateRealUp,stateImagUp,stateRealLo,stateImagLo,controlBit)</span></div>
<div class="line"><a name="l02441"></a><span class="lineno"> 2441</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>  {</div>
<div class="line"><a name="l02443"></a><span class="lineno"> 2443</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02444"></a><span class="lineno"> 2444</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02445"></a><span class="lineno"> 2445</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (controlQubit, thisTask+chunkId*chunkSize);</div>
<div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>  stateRealUp = stateVecRealUp[thisTask];</div>
<div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>  stateImagUp = stateVecImagUp[thisTask];</div>
<div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>  </div>
<div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>  stateRealLo = stateVecRealLo[thisTask];</div>
<div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>  stateImagLo = stateVecImagLo[thisTask];</div>
<div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>  </div>
<div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>  stateVecRealOut[thisTask] = rot1Real*stateRealUp - rot1Imag*stateImagUp + rot2Real*stateRealLo + rot2Imag*stateImagLo;</div>
<div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>  stateVecImagOut[thisTask] = rot1Real*stateImagUp + rot1Imag*stateRealUp + rot2Real*stateImagLo - rot2Imag*stateRealLo;</div>
<div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>  }</div>
<div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>  }</div>
<div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>  }</div>
<div class="line"><a name="l02462"></a><span class="lineno"> 2462</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00934">statevec_controlledCompactUnitary()</a>.</p>
</div>
</div>
<a id="a215e2d6f88dbecc0b408b3573b5e144f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a215e2d6f88dbecc0b408b3573b5e144f">◆ </a></span>statevec_controlledCompactUnitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledCompactUnitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>alpha</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>beta</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02196">2196</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span> {</div>
<div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>  </div>
<div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>  </div>
<div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>  </div>
<div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>  </div>
<div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> alphaImag=alpha.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, alphaReal=alpha.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> betaImag=beta.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>, betaReal=beta.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>;</div>
<div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>  </div>
<div class="line"><a name="l02221"></a><span class="lineno"> 2221</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02222"></a><span class="lineno"> 2222</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02223"></a><span class="lineno"> 2223</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02224"></a><span class="lineno"> 2224</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, alphaReal,alphaImag, betaReal,betaImag, \</span></div>
<div class="line"><a name="l02225"></a><span class="lineno"> 2225</span> <span class="preprocessor"> numTasks,chunkId,chunkSize,controlQubit) \</span></div>
<div class="line"><a name="l02226"></a><span class="lineno"> 2226</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,stateRealLo,stateImagLo,controlBit)</span></div>
<div class="line"><a name="l02227"></a><span class="lineno"> 2227</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>  {</div>
<div class="line"><a name="l02229"></a><span class="lineno"> 2229</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02230"></a><span class="lineno"> 2230</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02231"></a><span class="lineno"> 2231</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>  </div>
<div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>  </div>
<div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (controlQubit, indexUp+chunkId*chunkSize);</div>
<div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>  </div>
<div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>  </div>
<div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>  <span class="comment">// state[indexUp] = alpha * state[indexUp] - conj(beta) * state[indexLo]</span></div>
<div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>  stateVecReal[indexUp] = alphaReal*stateRealUp - alphaImag*stateImagUp </div>
<div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>  - betaReal*stateRealLo - betaImag*stateImagLo;</div>
<div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>  stateVecImag[indexUp] = alphaReal*stateImagUp + alphaImag*stateRealUp </div>
<div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>  - betaReal*stateImagLo + betaImag*stateRealLo;</div>
<div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>  </div>
<div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>  <span class="comment">// state[indexLo] = beta * state[indexUp] + conj(alpha) * state[indexLo]</span></div>
<div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>  stateVecReal[indexLo] = betaReal*stateRealUp - betaImag*stateImagUp </div>
<div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>  + alphaReal*stateRealLo + alphaImag*stateImagLo;</div>
<div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>  stateVecImag[indexLo] = betaReal*stateImagUp + betaImag*stateRealUp </div>
<div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>  + alphaReal*stateImagLo - alphaImag*stateRealLo;</div>
<div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>  }</div>
<div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>  } </div>
<div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>  }</div>
<div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>  </div>
<div class="line"><a name="l02262"></a><span class="lineno"> 2262</span> } </div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00934">statevec_controlledCompactUnitary()</a>.</p>
</div>
</div>
<a id="a393da4c4bc582a757ca8406d8501aca0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a393da4c4bc582a757ca8406d8501aca0">◆ </a></span>statevec_controlledNotDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledNotDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by {{0,1},{1,0}. </p>
<p>Operate on a subset of the state vector with upper and lower block values stored seperately. This rotation is just swapping upper and lower values, and stateVecIn must already be the correct section for this chunk. Only perform the rotation for elements where controlQubit is one.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>the control qubit </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecIn</td><td>probability amplitudes in lower or upper half of a block depending on chunkId </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02742">2742</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span> {</div>
<div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>  </div>
<div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>  </div>
<div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>  </div>
<div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealIn=stateVecIn.real, *stateVecImagIn=stateVecIn.imag;</div>
<div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>  </div>
<div class="line"><a name="l02757"></a><span class="lineno"> 2757</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02758"></a><span class="lineno"> 2758</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02759"></a><span class="lineno"> 2759</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02760"></a><span class="lineno"> 2760</span> <span class="preprocessor"> shared (stateVecRealIn,stateVecImagIn,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02761"></a><span class="lineno"> 2761</span> <span class="preprocessor"> numTasks,chunkId,chunkSize,controlQubit) \</span></div>
<div class="line"><a name="l02762"></a><span class="lineno"> 2762</span> <span class="preprocessor"> private (thisTask,controlBit)</span></div>
<div class="line"><a name="l02763"></a><span class="lineno"> 2763</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>  {</div>
<div class="line"><a name="l02765"></a><span class="lineno"> 2765</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02766"></a><span class="lineno"> 2766</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02767"></a><span class="lineno"> 2767</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (controlQubit, thisTask+chunkId*chunkSize);</div>
<div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>  stateVecRealOut[thisTask] = stateVecRealIn[thisTask];</div>
<div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>  stateVecImagOut[thisTask] = stateVecImagIn[thisTask];</div>
<div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>  }</div>
<div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>  }</div>
<div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>  }</div>
<div class="line"><a name="l02776"></a><span class="lineno"> 2776</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01075">statevec_controlledNot()</a>.</p>
</div>
</div>
<a id="ace1482ef82b83e7f926634a67b322fc4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ace1482ef82b83e7f926634a67b322fc4">◆ </a></span>statevec_controlledNotLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledNotLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02679">2679</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span> {</div>
<div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>  </div>
<div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateImagUp;</div>
<div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>  </div>
<div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>  </div>
<div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>  </div>
<div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>  </div>
<div class="line"><a name="l02701"></a><span class="lineno"> 2701</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02702"></a><span class="lineno"> 2702</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02703"></a><span class="lineno"> 2703</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02704"></a><span class="lineno"> 2704</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag,numTasks,chunkId,chunkSize,controlQubit) \</span></div>
<div class="line"><a name="l02705"></a><span class="lineno"> 2705</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,controlBit)</span></div>
<div class="line"><a name="l02706"></a><span class="lineno"> 2706</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>  {</div>
<div class="line"><a name="l02708"></a><span class="lineno"> 2708</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02709"></a><span class="lineno"> 2709</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02710"></a><span class="lineno"> 2710</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>  </div>
<div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp+chunkId*chunkSize);</div>
<div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>  </div>
<div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>  </div>
<div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>  }</div>
<div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>  } </div>
<div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>  }</div>
<div class="line"><a name="l02729"></a><span class="lineno"> 2729</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01075">statevec_controlledNot()</a>.</p>
</div>
</div>
<a id="ae64f9630325b6f93c6e1e17b9918ecef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae64f9630325b6f93c6e1e17b9918ecef">◆ </a></span>statevec_controlledPauliYDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPauliYDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conjFactor</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03036">3036</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span> {</div>
<div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>  </div>
<div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>  </div>
<div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>  </div>
<div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealIn=stateVecIn.real, *stateVecImagIn=stateVecIn.imag;</div>
<div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>  </div>
<div class="line"><a name="l03051"></a><span class="lineno"> 3051</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03052"></a><span class="lineno"> 3052</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03053"></a><span class="lineno"> 3053</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03054"></a><span class="lineno"> 3054</span> <span class="preprocessor"> shared (stateVecRealIn,stateVecImagIn,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l03055"></a><span class="lineno"> 3055</span> <span class="preprocessor"> numTasks,chunkId,chunkSize,controlQubit,conjFac) \</span></div>
<div class="line"><a name="l03056"></a><span class="lineno"> 3056</span> <span class="preprocessor"> private (thisTask,controlBit)</span></div>
<div class="line"><a name="l03057"></a><span class="lineno"> 3057</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>  {</div>
<div class="line"><a name="l03059"></a><span class="lineno"> 3059</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03060"></a><span class="lineno"> 3060</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03061"></a><span class="lineno"> 3061</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (controlQubit, thisTask+chunkId*chunkSize);</div>
<div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>  stateVecRealOut[thisTask] = conjFac * stateVecImagIn[thisTask];</div>
<div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>  stateVecImagOut[thisTask] = conjFac * -stateVecRealIn[thisTask];</div>
<div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>  }</div>
<div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>  }</div>
<div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>  }</div>
<div class="line"><a name="l03070"></a><span class="lineno"> 3070</span> } </div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01192">statevec_controlledPauliY()</a>, and <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01225">statevec_controlledPauliYConj()</a>.</p>
</div>
</div>
<a id="abc6383ac53124601e58922205b3cc484"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abc6383ac53124601e58922205b3cc484">◆ </a></span>statevec_controlledPauliYLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledPauliYLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conjFactor</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02982">2982</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span> {</div>
<div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>  </div>
<div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateImagUp;</div>
<div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>  </div>
<div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>  </div>
<div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>  </div>
<div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>  </div>
<div class="line"><a name="l03004"></a><span class="lineno"> 3004</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03005"></a><span class="lineno"> 3005</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03006"></a><span class="lineno"> 3006</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03007"></a><span class="lineno"> 3007</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, numTasks,chunkId, \</span></div>
<div class="line"><a name="l03008"></a><span class="lineno"> 3008</span> <span class="preprocessor"> chunkSize,controlQubit,conjFac) \</span></div>
<div class="line"><a name="l03009"></a><span class="lineno"> 3009</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,controlBit)</span></div>
<div class="line"><a name="l03010"></a><span class="lineno"> 3010</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>  {</div>
<div class="line"><a name="l03012"></a><span class="lineno"> 3012</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03013"></a><span class="lineno"> 3013</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03014"></a><span class="lineno"> 3014</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>  </div>
<div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(controlQubit, indexUp+chunkId*chunkSize);</div>
<div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>  </div>
<div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>  <span class="comment">// update under +-{{0, -i}, {i, 0}}</span></div>
<div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>  }</div>
<div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>  } </div>
<div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>  }</div>
<div class="line"><a name="l03033"></a><span class="lineno"> 3033</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01192">statevec_controlledPauliY()</a>, and <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01225">statevec_controlledPauliYConj()</a>.</p>
</div>
</div>
<a id="a57368529b2a7e76fec423cbfe9980b22"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a57368529b2a7e76fec423cbfe9980b22">◆ </a></span>statevec_controlledUnitaryDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledUnitaryDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecUp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecLo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit in the state vector of probability amplitudes, given two complex numbers alpha and beta and a subset of the state vector with upper and lower block values stored seperately. </p>
<p>Only perform the rotation where the control qubit is one.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">controlQubit</td><td>qubit to determine whether or not to perform a rotation </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot1</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot2</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecUp</td><td>probability amplitudes in upper half of a block </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecLo</td><td>probability amplitudes in lower half of a block </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02476">2476</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span> {</div>
<div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>  </div>
<div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>  </div>
<div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>  </div>
<div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot1Real=rot1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot1Imag=rot1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot2Real=rot2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot2Imag=rot2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealUp=stateVecUp.real, *stateVecImagUp=stateVecUp.imag;</div>
<div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealLo=stateVecLo.real, *stateVecImagLo=stateVecLo.imag;</div>
<div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>  </div>
<div class="line"><a name="l02497"></a><span class="lineno"> 2497</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02498"></a><span class="lineno"> 2498</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02499"></a><span class="lineno"> 2499</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02500"></a><span class="lineno"> 2500</span> <span class="preprocessor"> shared (stateVecRealUp,stateVecImagUp,stateVecRealLo,stateVecImagLo,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02501"></a><span class="lineno"> 2501</span> <span class="preprocessor"> rot1Real,rot1Imag, rot2Real,rot2Imag, numTasks,chunkId,chunkSize,controlQubit) \</span></div>
<div class="line"><a name="l02502"></a><span class="lineno"> 2502</span> <span class="preprocessor"> private (thisTask,stateRealUp,stateImagUp,stateRealLo,stateImagLo,controlBit)</span></div>
<div class="line"><a name="l02503"></a><span class="lineno"> 2503</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>  {</div>
<div class="line"><a name="l02505"></a><span class="lineno"> 2505</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02506"></a><span class="lineno"> 2506</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02507"></a><span class="lineno"> 2507</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (controlQubit, thisTask+chunkId*chunkSize);</div>
<div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>  stateRealUp = stateVecRealUp[thisTask];</div>
<div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>  stateImagUp = stateVecImagUp[thisTask];</div>
<div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>  </div>
<div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>  stateRealLo = stateVecRealLo[thisTask];</div>
<div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>  stateImagLo = stateVecImagLo[thisTask];</div>
<div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>  </div>
<div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>  stateVecRealOut[thisTask] = rot1Real*stateRealUp - rot1Imag*stateImagUp </div>
<div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>  + rot2Real*stateRealLo - rot2Imag*stateImagLo;</div>
<div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>  stateVecImagOut[thisTask] = rot1Real*stateImagUp + rot1Imag*stateRealUp </div>
<div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>  + rot2Real*stateImagLo + rot2Imag*stateRealLo;</div>
<div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>  }</div>
<div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>  }</div>
<div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>  }</div>
<div class="line"><a name="l02525"></a><span class="lineno"> 2525</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00972">statevec_controlledUnitary()</a>.</p>
</div>
</div>
<a id="a903beb4f5d8753a964ce2dc5f9096a24"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a903beb4f5d8753a964ce2dc5f9096a24">◆ </a></span>statevec_controlledUnitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_controlledUnitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>controlQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02336">2336</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span> {</div>
<div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>  </div>
<div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>  </div>
<div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>  <span class="keywordtype">int</span> controlBit;</div>
<div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>  </div>
<div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>  </div>
<div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>  </div>
<div class="line"><a name="l02359"></a><span class="lineno"> 2359</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02360"></a><span class="lineno"> 2360</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02361"></a><span class="lineno"> 2361</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02362"></a><span class="lineno"> 2362</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, u,numTasks,chunkId,chunkSize,controlQubit) \</span></div>
<div class="line"><a name="l02363"></a><span class="lineno"> 2363</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,stateRealLo,stateImagLo,controlBit)</span></div>
<div class="line"><a name="l02364"></a><span class="lineno"> 2364</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>  {</div>
<div class="line"><a name="l02366"></a><span class="lineno"> 2366</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02367"></a><span class="lineno"> 2367</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02368"></a><span class="lineno"> 2368</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>  </div>
<div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>  </div>
<div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>  controlBit = <a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a> (controlQubit, indexUp+chunkId*chunkSize);</div>
<div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>  <span class="keywordflow">if</span> (controlBit){</div>
<div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>  </div>
<div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>  </div>
<div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>  </div>
<div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>  stateVecReal[indexUp] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]*stateRealUp - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0]*stateImagUp </div>
<div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]*stateRealLo - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1]*stateImagLo;</div>
<div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>  stateVecImag[indexUp] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]*stateImagUp + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0]*stateRealUp </div>
<div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]*stateImagLo + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1]*stateRealLo;</div>
<div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>  </div>
<div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>  stateVecReal[indexLo] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]*stateRealUp - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0]*stateImagUp </div>
<div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]*stateRealLo - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1]*stateImagLo;</div>
<div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>  stateVecImag[indexLo] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]*stateImagUp + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0]*stateRealUp </div>
<div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]*stateImagLo + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1]*stateRealLo;</div>
<div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>  }</div>
<div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>  } </div>
<div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>  }</div>
<div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>  </div>
<div class="line"><a name="l02400"></a><span class="lineno"> 2400</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST_8h_source.html#l00140">ComplexMatrix2::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00139">ComplexMatrix2::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00972">statevec_controlledUnitary()</a>.</p>
</div>
</div>
<a id="a430d98e35f1eae7f0815ac539057cf67"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a430d98e35f1eae7f0815ac539057cf67">◆ </a></span>statevec_findProbabilityOfZeroDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_findProbabilityOfZeroDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Measure the probability of a specified qubit being in the zero state across all amplitudes held in this chunk. </p>
<p>Size of regions to skip is a multiple of chunkSize. The results are communicated and aggregated by the caller</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>probability of qubit measureQubit being zero </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03513">3513</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>  {</div>
<div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability; <span class="comment">// probability (returned) value</span></div>
<div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; <span class="comment">// task based approach for expose loop with small granularity</span></div>
<div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>  </div>
<div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>  <span class="comment">// find probability //</span></div>
<div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>  </div>
<div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>  <span class="comment">// initialise returned value</span></div>
<div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>  totalProbability = 0.0;</div>
<div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>  </div>
<div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>  </div>
<div class="line"><a name="l03530"></a><span class="lineno"> 3530</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03531"></a><span class="lineno"> 3531</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03532"></a><span class="lineno"> 3532</span> <span class="preprocessor"> shared (numTasks,stateVecReal,stateVecImag) \</span></div>
<div class="line"><a name="l03533"></a><span class="lineno"> 3533</span> <span class="preprocessor"> private (thisTask) \</span></div>
<div class="line"><a name="l03534"></a><span class="lineno"> 3534</span> <span class="preprocessor"> reduction ( +:totalProbability )</span></div>
<div class="line"><a name="l03535"></a><span class="lineno"> 3535</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>  {</div>
<div class="line"><a name="l03537"></a><span class="lineno"> 3537</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03538"></a><span class="lineno"> 3538</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03539"></a><span class="lineno"> 3539</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>  totalProbability += stateVecReal[thisTask]*stateVecReal[thisTask]</div>
<div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>  + stateVecImag[thisTask]*stateVecImag[thisTask];</div>
<div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>  }</div>
<div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>  }</div>
<div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>  </div>
<div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>  <span class="keywordflow">return</span> totalProbability;</div>
<div class="line"><a name="l03547"></a><span class="lineno"> 3547</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01312">statevec_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="a8535bc15c2ff249ddddb3fde6eff1490"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8535bc15c2ff249ddddb3fde6eff1490">◆ </a></span>statevec_findProbabilityOfZeroLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> statevec_findProbabilityOfZeroLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>measureQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Measure the total probability of a specified qubit being in the zero state across all amplitudes in this chunk. </p>
<p>Size of regions to skip is less than the size of one chunk. <br />
</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">measureQubit</td><td>qubit to measure </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>probability of qubit measureQubit being zero </dd></dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03457">3457</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span> {</div>
<div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>  <span class="comment">// ----- sizes</span></div>
<div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, <span class="comment">// size of blocks</span></div>
<div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>  sizeHalfBlock; <span class="comment">// size of blocks halved</span></div>
<div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>  <span class="comment">// ----- indices</span></div>
<div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>  index; <span class="comment">// current index for first half block</span></div>
<div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>  <span class="comment">// ----- measured probability</span></div>
<div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> totalProbability; <span class="comment">// probability (returned) value</span></div>
<div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>  <span class="comment">// ----- temp variables</span></div>
<div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>  </div>
<div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>  <span class="comment">// dimensions //</span></div>
<div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>  <span class="comment">// ---------------------------------------------------------------- //</span></div>
<div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>  sizeHalfBlock = 1LL << (measureQubit); <span class="comment">// number of state vector elements to sum,</span></div>
<div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>  <span class="comment">// and then the number to skip</span></div>
<div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>  sizeBlock = 2LL * sizeHalfBlock; <span class="comment">// size of blocks (pairs of measure and skip entries)</span></div>
<div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>  </div>
<div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>  <span class="comment">// initialise returned value</span></div>
<div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>  totalProbability = 0.0;</div>
<div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>  </div>
<div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>  </div>
<div class="line"><a name="l03485"></a><span class="lineno"> 3485</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03486"></a><span class="lineno"> 3486</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03487"></a><span class="lineno"> 3487</span> <span class="preprocessor"> shared (numTasks,sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag) \</span></div>
<div class="line"><a name="l03488"></a><span class="lineno"> 3488</span> <span class="preprocessor"> private (thisTask,thisBlock,index) \</span></div>
<div class="line"><a name="l03489"></a><span class="lineno"> 3489</span> <span class="preprocessor"> reduction ( +:totalProbability )</span></div>
<div class="line"><a name="l03490"></a><span class="lineno"> 3490</span> <span class="preprocessor"># endif </span></div>
<div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>  {</div>
<div class="line"><a name="l03492"></a><span class="lineno"> 3492</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03493"></a><span class="lineno"> 3493</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03494"></a><span class="lineno"> 3494</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>  index = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>  </div>
<div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>  totalProbability += stateVecReal[index]*stateVecReal[index]</div>
<div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>  + stateVecImag[index]*stateVecImag[index];</div>
<div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>  }</div>
<div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>  }</div>
<div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>  <span class="keywordflow">return</span> totalProbability;</div>
<div class="line"><a name="l03504"></a><span class="lineno"> 3504</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01312">statevec_calcProbOfOutcome()</a>.</p>
</div>
</div>
<a id="abea6570b95fdfa102511ccd1fcb30685"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abea6570b95fdfa102511ccd1fcb30685">◆ </a></span>statevec_hadamardDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_hadamardDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecUp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecLo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>updateUpper</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by {{1,1},{1,-1}}/sqrt2. </p>
<p>Operate on a subset of the state vector with upper and lower block values stored seperately. This rotation is just swapping upper and lower values, and stateVecIn must already be the correct section for this chunk</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecUp</td><td>probability amplitudes in upper half of a block depending on chunkId </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecLo</td><td>probability amplitudes in lower half of a block depending on chunkId </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">updateUpper</td><td>flag, 1: updating upper values, 0: updating lower values in block </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03139">3139</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span> {</div>
<div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>  </div>
<div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>  </div>
<div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>  <span class="keywordtype">int</span> sign;</div>
<div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>  <span class="keywordflow">if</span> (updateUpper) sign=1;</div>
<div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>  <span class="keywordflow">else</span> sign=-1;</div>
<div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>  </div>
<div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> recRoot2 = 1.0/sqrt(2);</div>
<div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>  </div>
<div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealUp=stateVecUp.real, *stateVecImagUp=stateVecUp.imag;</div>
<div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealLo=stateVecLo.real, *stateVecImagLo=stateVecLo.imag;</div>
<div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>  </div>
<div class="line"><a name="l03160"></a><span class="lineno"> 3160</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03161"></a><span class="lineno"> 3161</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03162"></a><span class="lineno"> 3162</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03163"></a><span class="lineno"> 3163</span> <span class="preprocessor"> shared (stateVecRealUp,stateVecImagUp,stateVecRealLo,stateVecImagLo,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l03164"></a><span class="lineno"> 3164</span> <span class="preprocessor"> recRoot2, sign, numTasks) \</span></div>
<div class="line"><a name="l03165"></a><span class="lineno"> 3165</span> <span class="preprocessor"> private (thisTask,stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l03166"></a><span class="lineno"> 3166</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>  {</div>
<div class="line"><a name="l03168"></a><span class="lineno"> 3168</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03169"></a><span class="lineno"> 3169</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03170"></a><span class="lineno"> 3170</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>  stateRealUp = stateVecRealUp[thisTask];</div>
<div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>  stateImagUp = stateVecImagUp[thisTask];</div>
<div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>  </div>
<div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>  stateRealLo = stateVecRealLo[thisTask];</div>
<div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>  stateImagLo = stateVecImagLo[thisTask];</div>
<div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>  </div>
<div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>  stateVecRealOut[thisTask] = recRoot2*(stateRealUp + sign*stateRealLo);</div>
<div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>  stateVecImagOut[thisTask] = recRoot2*(stateImagUp + sign*stateImagLo);</div>
<div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>  }</div>
<div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>  }</div>
<div class="line"><a name="l03183"></a><span class="lineno"> 3183</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01258">statevec_hadamard()</a>.</p>
</div>
</div>
<a id="a86dbcc3db99294add9964741e19fbdab"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a86dbcc3db99294add9964741e19fbdab">◆ </a></span>statevec_hadamardLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_hadamardLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03078">3078</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span> {</div>
<div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>  </div>
<div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>  </div>
<div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>  </div>
<div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>  </div>
<div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> recRoot2 = 1.0/sqrt(2);</div>
<div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>  </div>
<div class="line"><a name="l03098"></a><span class="lineno"> 3098</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03099"></a><span class="lineno"> 3099</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03100"></a><span class="lineno"> 3100</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03101"></a><span class="lineno"> 3101</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, recRoot2, numTasks) \</span></div>
<div class="line"><a name="l03102"></a><span class="lineno"> 3102</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l03103"></a><span class="lineno"> 3103</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>  {</div>
<div class="line"><a name="l03105"></a><span class="lineno"> 3105</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03106"></a><span class="lineno"> 3106</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03107"></a><span class="lineno"> 3107</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>  </div>
<div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>  </div>
<div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>  </div>
<div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>  stateVecReal[indexUp] = recRoot2*(stateRealUp + stateRealLo);</div>
<div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>  stateVecImag[indexUp] = recRoot2*(stateImagUp + stateImagLo);</div>
<div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>  </div>
<div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>  stateVecReal[indexLo] = recRoot2*(stateRealUp - stateRealLo);</div>
<div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>  stateVecImag[indexLo] = recRoot2*(stateImagUp - stateImagLo);</div>
<div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>  } </div>
<div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>  }</div>
<div class="line"><a name="l03126"></a><span class="lineno"> 3126</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01258">statevec_hadamard()</a>.</p>
</div>
</div>
<a id="ae6f0c9ed9261afbab4712e056a88763d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae6f0c9ed9261afbab4712e056a88763d">◆ </a></span>statevec_multiControlledMultiQubitNotDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiQubitNotDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02834">2834</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>  {</div>
<div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalOffset = qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> * numAmps;</div>
<div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>  </div>
<div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>  <span class="comment">/* stateVecOut is qureg's local state-vector partition, which we modify.</span></div>
<div class="line"><a name="l02843"></a><span class="lineno"> 2843</span> <span class="comment"> * stateVecIn is the pair node's state-vector partition, in an order which </span></div>
<div class="line"><a name="l02844"></a><span class="lineno"> 2844</span> <span class="comment"> * does not necessarily correlate to stateVecOut's </span></div>
<div class="line"><a name="l02845"></a><span class="lineno"> 2845</span> <span class="comment"> */</span></div>
<div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* inReal = stateVecIn.real;</div>
<div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* inImag = stateVecIn.imag;</div>
<div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* outReal = stateVecOut.real;</div>
<div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* outImag = stateVecOut.imag;</div>
<div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>  </div>
<div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> outInd, outIndGlobal, inInd, inIndGlobal;</div>
<div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>  </div>
<div class="line"><a name="l02853"></a><span class="lineno"> 2853</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02854"></a><span class="lineno"> 2854</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02855"></a><span class="lineno"> 2855</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02856"></a><span class="lineno"> 2856</span> <span class="preprocessor"> shared (inReal,inImag,outReal,outImag, numAmps,globalOffset, ctrlMask,targMask) \</span></div>
<div class="line"><a name="l02857"></a><span class="lineno"> 2857</span> <span class="preprocessor"> private (outInd,outIndGlobal, inInd,inIndGlobal)</span></div>
<div class="line"><a name="l02858"></a><span class="lineno"> 2858</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>  {</div>
<div class="line"><a name="l02860"></a><span class="lineno"> 2860</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02861"></a><span class="lineno"> 2861</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02862"></a><span class="lineno"> 2862</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>  <span class="keywordflow">for</span> (outInd = 0; outInd < numAmps; outInd++) {</div>
<div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>  </div>
<div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>  <span class="comment">// modify amplitude only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>  outIndGlobal = outInd + globalOffset;</div>
<div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & outIndGlobal) != ctrlMask))</div>
<div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>  <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>  <span class="comment">/* it is a premature optimisation to remove this seemingly wasteful abort above,</span></div>
<div class="line"><a name="l02870"></a><span class="lineno"> 2870</span> <span class="comment"> * because the maximum skipped amplitudes is 1/2 that stored in the node </span></div>
<div class="line"><a name="l02871"></a><span class="lineno"> 2871</span> <span class="comment"> * (since this function is not called if all amps should be skipped)</span></div>
<div class="line"><a name="l02872"></a><span class="lineno"> 2872</span> <span class="comment"> */</span></div>
<div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>  </div>
<div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>  <span class="comment">/* unlike statevec_controlledNotDistributed(), we cannot assume stateVecOut </span></div>
<div class="line"><a name="l02875"></a><span class="lineno"> 2875</span> <span class="comment"> * maps contiguously/parallel into stateVecIn; we must map each amplitude, bit-wise.</span></div>
<div class="line"><a name="l02876"></a><span class="lineno"> 2876</span> <span class="comment"> * However, the arithmetic doesn't necessitate knowing the rank of stateVecIn </span></div>
<div class="line"><a name="l02877"></a><span class="lineno"> 2877</span> <span class="comment"> */</span></div>
<div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>  inIndGlobal = outIndGlobal ^ targMask;</div>
<div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>  inInd = inIndGlobal % numAmps; <span class="comment">// = inIndGlobal - pairRank * numAmps</span></div>
<div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>  </div>
<div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>  outReal[outInd] = inReal[inInd];</div>
<div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>  outImag[outInd] = inImag[inInd];</div>
<div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>  }</div>
<div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>  }</div>
<div class="line"><a name="l02885"></a><span class="lineno"> 2885</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01097">statevec_multiControlledMultiQubitNot()</a>.</p>
</div>
</div>
<a id="ac7d30ce54573c75b35386cd0e284adc5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac7d30ce54573c75b35386cd0e284adc5">◆ </a></span>statevec_multiControlledMultiQubitNotLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiQubitNotLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targMask</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02778">2778</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>  {</div>
<div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateRe = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* stateIm = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>  </div>
<div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalOffset = qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> * numAmps;</div>
<div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>  </div>
<div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>  <span class="comment">// each amplitude is swapped with a 'mate' amplitude</span></div>
<div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInd, mateInd, globalInd;</div>
<div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> mateRe, mateIm;</div>
<div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>  </div>
<div class="line"><a name="l02789"></a><span class="lineno"> 2789</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02790"></a><span class="lineno"> 2790</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02791"></a><span class="lineno"> 2791</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02792"></a><span class="lineno"> 2792</span> <span class="preprocessor"> shared (stateRe,stateIm, numAmps, ctrlMask,targMask, globalOffset) \</span></div>
<div class="line"><a name="l02793"></a><span class="lineno"> 2793</span> <span class="preprocessor"> private (ampInd, mateInd,mateRe,mateIm, globalInd)</span></div>
<div class="line"><a name="l02794"></a><span class="lineno"> 2794</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>  {</div>
<div class="line"><a name="l02796"></a><span class="lineno"> 2796</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02797"></a><span class="lineno"> 2797</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02798"></a><span class="lineno"> 2798</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>  <span class="keywordflow">for</span> (ampInd = 0; ampInd < numAmps; ampInd++) {</div>
<div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>  </div>
<div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>  <span class="comment">/* it may be a premature optimisation to remove the seemingly wasteful continues below,</span></div>
<div class="line"><a name="l02802"></a><span class="lineno"> 2802</span> <span class="comment"> * because the maximum skipped amplitudes is 1/2 that stored in the node </span></div>
<div class="line"><a name="l02803"></a><span class="lineno"> 2803</span> <span class="comment"> * (e.g. since this function is not called if all amps should be skipped via controls),</span></div>
<div class="line"><a name="l02804"></a><span class="lineno"> 2804</span> <span class="comment"> * and since we're memory-bandwidth bottlenecked. </span></div>
<div class="line"><a name="l02805"></a><span class="lineno"> 2805</span> <span class="comment"> */</span></div>
<div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>  </div>
<div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>  <span class="comment">// although amps are local, we may still be running in distributed mode, </span></div>
<div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>  <span class="comment">// and hence need to consult the global index to determine the values of </span></div>
<div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>  <span class="comment">// the control qubits</span></div>
<div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>  globalInd = ampInd + globalOffset;</div>
<div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>  </div>
<div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>  <span class="comment">// modify amplitude only if control qubits are 1 for this state</span></div>
<div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & globalInd) != ctrlMask))</div>
<div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>  <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>  </div>
<div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>  mateInd = ampInd ^ targMask;</div>
<div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>  </div>
<div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>  <span class="comment">// if the mate is behind, it was already processed</span></div>
<div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>  <span class="keywordflow">if</span> (mateInd < ampInd)</div>
<div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>  <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>  </div>
<div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>  mateRe = stateRe[mateInd];</div>
<div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>  mateIm = stateIm[mateInd];</div>
<div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>  </div>
<div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>  <span class="comment">// swap amp with mate</span></div>
<div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>  stateRe[mateInd] = stateRe[ampInd];</div>
<div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>  stateIm[mateInd] = stateIm[ampInd];</div>
<div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>  stateRe[ampInd] = mateRe;</div>
<div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>  stateIm[ampInd] = mateIm;</div>
<div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>  }</div>
<div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>  }</div>
<div class="line"><a name="l02832"></a><span class="lineno"> 2832</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01097">statevec_multiControlledMultiQubitNot()</a>.</p>
</div>
</div>
<a id="a0aedcccfa50c7aaa8b7fc4c14d7cdfb8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0aedcccfa50c7aaa8b7fc4c14d7cdfb8">◆ </a></span>statevec_multiControlledMultiQubitUnitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledMultiQubitUnitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int * </td>
<td class="paramname"><em>targs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>numTargs</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrixN.html">ComplexMatrixN</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l01912">1912</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span> {</div>
<div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>  <span class="comment">// can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>  </div>
<div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> numTargs; <span class="comment">// kernel called on every 1 in 2^numTargs amplitudes</span></div>
<div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTargAmps = 1 << u.<a class="code" href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">numQubits</a>; <span class="comment">// num amps to be modified by each task</span></div>
<div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>  </div>
<div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>  <span class="comment">// the global (between all nodes) index of this node's start index</span></div>
<div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalIndStart = qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>*qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>; </div>
<div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>  </div>
<div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisInd00; <span class="comment">// this thread's index of |..0..0..> (target qubits = 0) </span></div>
<div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisGlobalInd00; <span class="comment">// the global (between all nodes) index of this thread's |..0..0..> state</span></div>
<div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind; <span class="comment">// each thread's iteration of amplitudes to modify</span></div>
<div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>  <span class="keywordtype">int</span> i, t, r, c; <span class="comment">// each thread's iteration of amps and targets </span></div>
<div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> reElem, imElem; <span class="comment">// each thread's iteration of u elements</span></div>
<div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>  </div>
<div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>  <span class="comment">// each thread/task will record and modify numTargAmps amplitudes, privately</span></div>
<div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>  <span class="comment">// (of course, tasks eliminated by the ctrlMask won't edit their allocation)</span></div>
<div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>  <span class="comment">//</span></div>
<div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>  <span class="comment">// If we're NOT on windows, we can fortunately use the stack directly</span></div>
<div class="line"><a name="l01935"></a><span class="lineno"> 1935</span> <span class="preprocessor"> #ifndef _WIN32</span></div>
<div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ampInds[numTargAmps];</div>
<div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> reAmps[numTargAmps];</div>
<div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> imAmps[numTargAmps];</div>
<div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>  </div>
<div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>  <span class="keywordtype">int</span> sortedTargs[numTargs];</div>
<div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>  <span class="comment">// on Windows, with no VLA, we can use _malloca to allocate on stack (must free)</span></div>
<div class="line"><a name="l01942"></a><span class="lineno"> 1942</span> <span class="preprocessor"> #else</span></div>
<div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>* ampInds;</div>
<div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* reAmps;</div>
<div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>* imAmps;</div>
<div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>  <span class="keywordtype">int</span>* sortedTargs = (<span class="keywordtype">int</span>*) _malloca(numTargs * <span class="keyword">sizeof</span> *sortedTargs);</div>
<div class="line"><a name="l01947"></a><span class="lineno"> 1947</span> <span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>  </div>
<div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>  <span class="comment">// we need a sorted targets list to find thisInd00 for each task.</span></div>
<div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>  <span class="comment">// we can't modify targets, because the user-ordering of targets matters in u</span></div>
<div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> t=0; t < numTargs; t++) </div>
<div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>  sortedTargs[t] = targs[t];</div>
<div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>  qsort(sortedTargs, numTargs, <span class="keyword">sizeof</span>(<span class="keywordtype">int</span>), <a class="code" href="QuEST__cpu_8c.html#afa4231f79fe9498e4fd87cc70cde5a9d">qsortComp</a>);</div>
<div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>  </div>
<div class="line"><a name="l01955"></a><span class="lineno"> 1955</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01956"></a><span class="lineno"> 1956</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l01957"></a><span class="lineno"> 1957</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l01958"></a><span class="lineno"> 1958</span> <span class="preprocessor"> shared (reVec,imVec, numTasks,numTargAmps,globalIndStart, ctrlMask,targs,sortedTargs,u,numTargs) \</span></div>
<div class="line"><a name="l01959"></a><span class="lineno"> 1959</span> <span class="preprocessor"> private (thisTask,thisInd00,thisGlobalInd00,ind,i,t,r,c,reElem,imElem, ampInds,reAmps,imAmps)</span></div>
<div class="line"><a name="l01960"></a><span class="lineno"> 1960</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>  {</div>
<div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>  <span class="comment">// when manually allocating array memory (on Windows), this must be done in each thread</span></div>
<div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>  <span class="comment">// separately and is not performed automatically by declaring a var as omp-private</span></div>
<div class="line"><a name="l01964"></a><span class="lineno"> 1964</span> <span class="preprocessor"> # ifdef _WIN32</span></div>
<div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>  ampInds = (<span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span>*) _malloca(numTargAmps * <span class="keyword">sizeof</span> *ampInds);</div>
<div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>  reAmps = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) _malloca(numTargAmps * <span class="keyword">sizeof</span> *reAmps);</div>
<div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>  imAmps = (<a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>*) _malloca(numTargAmps * <span class="keyword">sizeof</span> *imAmps);</div>
<div class="line"><a name="l01968"></a><span class="lineno"> 1968</span> <span class="preprocessor"> # endif</span></div>
<div class="line"><a name="l01969"></a><span class="lineno"> 1969</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01970"></a><span class="lineno"> 1970</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l01971"></a><span class="lineno"> 1971</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>  </div>
<div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>  <span class="comment">// find this task's start index (where all targs are 0)</span></div>
<div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>  thisInd00 = thisTask;</div>
<div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>  <span class="keywordflow">for</span> (t=0; t < numTargs; t++)</div>
<div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>  thisInd00 = <a class="code" href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a>(thisInd00, sortedTargs[t]);</div>
<div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>  </div>
<div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>  <span class="comment">// this task only modifies amplitudes if control qubits are 1 for this state</span></div>
<div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>  thisGlobalInd00 = thisInd00 + globalIndStart;</div>
<div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & thisGlobalInd00) != ctrlMask))</div>
<div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>  <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>  </div>
<div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>  <span class="comment">// determine the indices and record values of this tasks's target amps</span></div>
<div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>  <span class="keywordflow">for</span> (i=0; i < numTargAmps; i++) {</div>
<div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>  </div>
<div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>  <span class="comment">// get statevec index of current target qubit assignment</span></div>
<div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>  ind = thisInd00;</div>
<div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>  <span class="keywordflow">for</span> (t=0; t < numTargs; t++)</div>
<div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a>(t, i))</div>
<div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>  ind = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind, targs[t]);</div>
<div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>  </div>
<div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>  <span class="comment">// update this tasks's private arrays</span></div>
<div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>  ampInds[i] = ind;</div>
<div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>  reAmps [i] = reVec[ind];</div>
<div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>  imAmps [i] = imVec[ind];</div>
<div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>  }</div>
<div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>  </div>
<div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>  <span class="comment">// modify this tasks's target amplitudes</span></div>
<div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>  <span class="keywordflow">for</span> (r=0; r < numTargAmps; r++) {</div>
<div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>  ind = ampInds[r];</div>
<div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>  reVec[ind] = 0;</div>
<div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>  imVec[ind] = 0;</div>
<div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>  </div>
<div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>  <span class="keywordflow">for</span> (c=0; c < numTargAmps; c++) {</div>
<div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>  reElem = u.<a class="code" href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">real</a>[r][c];</div>
<div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>  imElem = u.<a class="code" href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">imag</a>[r][c];</div>
<div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>  reVec[ind] += reAmps[c]*reElem - imAmps[c]*imElem;</div>
<div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>  imVec[ind] += reAmps[c]*imElem + imAmps[c]*reElem;</div>
<div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>  }</div>
<div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>  }</div>
<div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>  }</div>
<div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>  <span class="comment">// on Windows, we must explicitly free the stack structures</span></div>
<div class="line"><a name="l02014"></a><span class="lineno"> 2014</span> <span class="preprocessor"> #ifdef _WIN32</span></div>
<div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>  _freea(ampInds);</div>
<div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>  _freea(reAmps);</div>
<div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>  _freea(imAmps);</div>
<div class="line"><a name="l02018"></a><span class="lineno"> 2018</span> <span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>  }</div>
<div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>  </div>
<div class="line"><a name="l02021"></a><span class="lineno"> 2021</span> <span class="preprocessor"> #ifdef _WIN32</span></div>
<div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>  _freea(sortedTargs);</div>
<div class="line"><a name="l02023"></a><span class="lineno"> 2023</span> <span class="preprocessor"> #endif</span></div>
<div class="line"><a name="l02024"></a><span class="lineno"> 2024</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00082">extractBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST_8h_source.html#l00190">ComplexMatrixN::imag</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00099">insertZeroBit()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00188">ComplexMatrixN::numQubits</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST__cpu_8c_source.html#l01908">qsortComp()</a>, <a class="el" href="QuEST_8h_source.html#l00189">ComplexMatrixN::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01514">statevec_multiControlledMultiQubitUnitary()</a>.</p>
</div>
</div>
<a id="af8236a00389137b5eff986a40577eaf3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af8236a00389137b5eff986a40577eaf3">◆ </a></span>statevec_multiControlledTwoQubitUnitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledTwoQubitUnitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>q1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>q2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix4.html">ComplexMatrix4</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l01813">1813</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>  {</div>
<div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>  </div>
<div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>  <span class="comment">// can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>  </div>
<div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>  <span class="comment">// the global (between all nodes) index of this node's start index</span></div>
<div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalIndStart = qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>*qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>; </div>
<div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>  </div>
<div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 2; <span class="comment">// each iteration updates 4 amplitudes</span></div>
<div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisGlobalInd00;</div>
<div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00, ind01, ind10, ind11;</div>
<div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re00, re01, re10, re11;</div>
<div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im00, im01, im10, im11;</div>
<div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>  </div>
<div class="line"><a name="l01829"></a><span class="lineno"> 1829</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01830"></a><span class="lineno"> 1830</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l01831"></a><span class="lineno"> 1831</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l01832"></a><span class="lineno"> 1832</span> <span class="preprocessor"> shared (reVec,imVec,globalIndStart,numTasks,ctrlMask,u,q2,q1) \</span></div>
<div class="line"><a name="l01833"></a><span class="lineno"> 1833</span> <span class="preprocessor"> private (thisTask, thisGlobalInd00, ind00,ind01,ind10,ind11, re00,re01,re10,re11, im00,im01,im10,im11)</span></div>
<div class="line"><a name="l01834"></a><span class="lineno"> 1834</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>  {</div>
<div class="line"><a name="l01836"></a><span class="lineno"> 1836</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l01837"></a><span class="lineno"> 1837</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l01838"></a><span class="lineno"> 1838</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>  </div>
<div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>  <span class="comment">// determine ind00 of |..0..0..></span></div>
<div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(thisTask, q1, q2);</div>
<div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>  </div>
<div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>  <span class="comment">// skip amplitude if controls aren't in 1 state (overloaded for speed)</span></div>
<div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>  thisGlobalInd00 = ind00 + globalIndStart;</div>
<div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>  <span class="keywordflow">if</span> (ctrlMask && ((ctrlMask & thisGlobalInd00) != ctrlMask))</div>
<div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>  <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>  </div>
<div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>  <span class="comment">// inds of |..0..1..>, |..1..0..> and |..1..1..></span></div>
<div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, q1);</div>
<div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, q2);</div>
<div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>  ind11 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind01, q2);</div>
<div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>  </div>
<div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>  re00 = reVec[ind00]; im00 = imVec[ind00];</div>
<div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>  re11 = reVec[ind11]; im11 = imVec[ind11];</div>
<div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>  </div>
<div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>  <span class="comment">// apply u * {amp00, amp01, amp10, amp11}</span></div>
<div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>  reVec[ind00] = </div>
<div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][0]*re00 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][0]*im00 +</div>
<div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][1]*re01 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][1]*im01 +</div>
<div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][2]*re10 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][2]*im10 +</div>
<div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][3]*re11 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][3]*im11;</div>
<div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>  imVec[ind00] =</div>
<div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][0]*re00 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][0]*im00 +</div>
<div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][1]*re01 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][1]*im01 +</div>
<div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][2]*re10 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][2]*im10 +</div>
<div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[0][3]*re11 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[0][3]*im11;</div>
<div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>  </div>
<div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>  reVec[ind01] = </div>
<div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][0]*re00 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][0]*im00 +</div>
<div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][1]*re01 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][1]*im01 +</div>
<div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][2]*re10 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][2]*im10 +</div>
<div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][3]*re11 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][3]*im11;</div>
<div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>  imVec[ind01] =</div>
<div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][0]*re00 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][0]*im00 +</div>
<div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][1]*re01 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][1]*im01 +</div>
<div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][2]*re10 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][2]*im10 +</div>
<div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[1][3]*re11 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[1][3]*im11;</div>
<div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>  </div>
<div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>  reVec[ind10] = </div>
<div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][0]*re00 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][0]*im00 +</div>
<div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][1]*re01 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][1]*im01 +</div>
<div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][2]*re10 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][2]*im10 +</div>
<div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][3]*re11 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][3]*im11;</div>
<div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>  imVec[ind10] =</div>
<div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][0]*re00 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][0]*im00 +</div>
<div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][1]*re01 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][1]*im01 +</div>
<div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][2]*re10 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][2]*im10 +</div>
<div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[2][3]*re11 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[2][3]*im11; </div>
<div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>  </div>
<div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>  reVec[ind11] = </div>
<div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][0]*re00 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][0]*im00 +</div>
<div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][1]*re01 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][1]*im01 +</div>
<div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][2]*re10 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][2]*im10 +</div>
<div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>  u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][3]*re11 - u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][3]*im11;</div>
<div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>  imVec[ind11] =</div>
<div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][0]*re00 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][0]*im00 +</div>
<div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][1]*re01 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][1]*im01 +</div>
<div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][2]*re10 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][2]*im10 +</div>
<div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>  u.<a class="code" href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">imag</a>[3][3]*re11 + u.<a class="code" href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">real</a>[3][3]*im11; </div>
<div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>  }</div>
<div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>  }</div>
<div class="line"><a name="l01906"></a><span class="lineno"> 1906</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST_8h_source.html#l00178">ComplexMatrix4::imag</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00177">ComplexMatrix4::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01458">statevec_multiControlledTwoQubitUnitary()</a>.</p>
</div>
</div>
<a id="ab58fe4be895283c2c4eb86ec9af5682e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab58fe4be895283c2c4eb86ec9af5682e">◆ </a></span>statevec_multiControlledUnitaryDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledUnitaryDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlQubitsMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlFlipMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecUp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecLo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a unitary operation to a single qubit in the state vector of probability amplitudes, given a subset of the state vector with upper and lower block values stored seperately. </p>
<p>Only perform the rotation where all the control qubits are 1.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">targetQubit</td><td>qubit to rotate </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctrlQubitsMask</td><td>a bit mask indicating whether each qubit is a control (1) or not (0) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctrlFlipMask</td><td>a bit mask indicating whether each qubit (only controls are relevant) should be flipped when checking the control condition </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot1</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot2</td><td>rotation angle </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecUp</td><td>probability amplitudes in upper half of a block </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecLo</td><td>probability amplitudes in lower half of a block </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02542">2542</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span> {</div>
<div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>  </div>
<div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>  </div>
<div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot1Real=rot1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot1Imag=rot1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot2Real=rot2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot2Imag=rot2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealUp=stateVecUp.real, *stateVecImagUp=stateVecUp.imag;</div>
<div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealLo=stateVecLo.real, *stateVecImagLo=stateVecLo.imag;</div>
<div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>  </div>
<div class="line"><a name="l02564"></a><span class="lineno"> 2564</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02565"></a><span class="lineno"> 2565</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02566"></a><span class="lineno"> 2566</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02567"></a><span class="lineno"> 2567</span> <span class="preprocessor"> shared (stateVecRealUp,stateVecImagUp,stateVecRealLo,stateVecImagLo,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02568"></a><span class="lineno"> 2568</span> <span class="preprocessor"> rot1Real,rot1Imag, rot2Real,rot2Imag, ctrlQubitsMask,ctrlFlipMask, numTasks,chunkId,chunkSize) \</span></div>
<div class="line"><a name="l02569"></a><span class="lineno"> 2569</span> <span class="preprocessor"> private (thisTask,stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l02570"></a><span class="lineno"> 2570</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>  {</div>
<div class="line"><a name="l02572"></a><span class="lineno"> 2572</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02573"></a><span class="lineno"> 2573</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02574"></a><span class="lineno"> 2574</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>  <span class="keywordflow">if</span> (ctrlQubitsMask == (ctrlQubitsMask & ((thisTask+chunkId*chunkSize) ^ ctrlFlipMask))) {</div>
<div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>  stateRealUp = stateVecRealUp[thisTask];</div>
<div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>  stateImagUp = stateVecImagUp[thisTask];</div>
<div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>  </div>
<div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>  stateRealLo = stateVecRealLo[thisTask];</div>
<div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>  stateImagLo = stateVecImagLo[thisTask];</div>
<div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>  </div>
<div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>  stateVecRealOut[thisTask] = rot1Real*stateRealUp - rot1Imag*stateImagUp </div>
<div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>  + rot2Real*stateRealLo - rot2Imag*stateImagLo;</div>
<div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>  stateVecImagOut[thisTask] = rot1Real*stateImagUp + rot1Imag*stateRealUp </div>
<div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>  + rot2Real*stateImagLo + rot2Imag*stateRealLo;</div>
<div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>  }</div>
<div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>  }</div>
<div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>  }</div>
<div class="line"><a name="l02591"></a><span class="lineno"> 2591</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01011">statevec_multiControlledUnitary()</a>.</p>
</div>
</div>
<a id="ab19f28e68330da68ea3caa2bdef32da9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab19f28e68330da68ea3caa2bdef32da9">◆ </a></span>statevec_multiControlledUnitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_multiControlledUnitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlQubitsMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">long long int </td>
<td class="paramname"><em>ctrlFlipMask</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02268">2268</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span> {</div>
<div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>  </div>
<div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkSize=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> chunkId=qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a>;</div>
<div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>  </div>
<div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>  </div>
<div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>  </div>
<div class="line"><a name="l02291"></a><span class="lineno"> 2291</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02292"></a><span class="lineno"> 2292</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02293"></a><span class="lineno"> 2293</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02294"></a><span class="lineno"> 2294</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, u, ctrlQubitsMask,ctrlFlipMask, \</span></div>
<div class="line"><a name="l02295"></a><span class="lineno"> 2295</span> <span class="preprocessor"> numTasks,chunkId,chunkSize) \</span></div>
<div class="line"><a name="l02296"></a><span class="lineno"> 2296</span> <span class="preprocessor"> private (thisTask,thisBlock, indexUp,indexLo, stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l02297"></a><span class="lineno"> 2297</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>  {</div>
<div class="line"><a name="l02299"></a><span class="lineno"> 2299</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02300"></a><span class="lineno"> 2300</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02301"></a><span class="lineno"> 2301</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>  </div>
<div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>  </div>
<div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>  </div>
<div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>  <span class="comment">// take the basis index, flip the designated (XOR) 'control' bits, AND with the controls.</span></div>
<div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>  <span class="comment">// if this equals the control mask, the control qubits have the desired values in the basis index</span></div>
<div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>  <span class="keywordflow">if</span> (ctrlQubitsMask == (ctrlQubitsMask & ((indexUp+chunkId*chunkSize) ^ ctrlFlipMask))) {</div>
<div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>  </div>
<div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>  </div>
<div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>  stateVecReal[indexUp] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]*stateRealUp - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0]*stateImagUp </div>
<div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]*stateRealLo - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1]*stateImagLo;</div>
<div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>  stateVecImag[indexUp] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]*stateImagUp + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0]*stateRealUp </div>
<div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]*stateImagLo + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1]*stateRealLo;</div>
<div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>  </div>
<div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>  stateVecReal[indexLo] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]*stateRealUp - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0]*stateImagUp </div>
<div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]*stateRealLo - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1]*stateImagLo;</div>
<div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>  stateVecImag[indexLo] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]*stateImagUp + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0]*stateRealUp </div>
<div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]*stateImagLo + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1]*stateRealLo;</div>
<div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>  }</div>
<div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>  } </div>
<div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>  }</div>
<div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>  </div>
<div class="line"><a name="l02334"></a><span class="lineno"> 2334</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST_8h_source.html#l00140">ComplexMatrix2::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00139">ComplexMatrix2::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01011">statevec_multiControlledUnitary()</a>.</p>
</div>
</div>
<a id="a464efbd1d7ca5a7b25c83ada001955c2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a464efbd1d7ca5a7b25c83ada001955c2">◆ </a></span>statevec_pauliXDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliXDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by {{0,1},{1,0}. </p>
<p>Operate on a subset of the state vector with upper and lower block values stored seperately. This rotation is just swapping upper and lower values, and stateVecIn must already be the correct section for this chunk</p>
<dl class="section remark"><dt>Remarks</dt><dd>Qubits are zero-based and the <br />
the first qubit is the rightmost <br />
</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecIn</td><td>probability amplitudes in lower or upper half of a block depending on chunkId </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02651">2651</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span> {</div>
<div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>  </div>
<div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>  </div>
<div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealIn=stateVecIn.real, *stateVecImagIn=stateVecIn.imag;</div>
<div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>  </div>
<div class="line"><a name="l02662"></a><span class="lineno"> 2662</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02663"></a><span class="lineno"> 2663</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02664"></a><span class="lineno"> 2664</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02665"></a><span class="lineno"> 2665</span> <span class="preprocessor"> shared (stateVecRealIn,stateVecImagIn,stateVecRealOut,stateVecImagOut,numTasks) \</span></div>
<div class="line"><a name="l02666"></a><span class="lineno"> 2666</span> <span class="preprocessor"> private (thisTask)</span></div>
<div class="line"><a name="l02667"></a><span class="lineno"> 2667</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>  {</div>
<div class="line"><a name="l02669"></a><span class="lineno"> 2669</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02670"></a><span class="lineno"> 2670</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02671"></a><span class="lineno"> 2671</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>  stateVecRealOut[thisTask] = stateVecRealIn[thisTask];</div>
<div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>  stateVecImagOut[thisTask] = stateVecImagIn[thisTask];</div>
<div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>  }</div>
<div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>  }</div>
<div class="line"><a name="l02677"></a><span class="lineno"> 2677</span> } </div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01048">statevec_pauliX()</a>.</p>
</div>
</div>
<a id="aa987d1e0ba97da2ca540194356dd62de"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa987d1e0ba97da2ca540194356dd62de">◆ </a></span>statevec_pauliXLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliXLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02593">2593</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span> {</div>
<div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>  </div>
<div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateImagUp;</div>
<div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>  </div>
<div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>  </div>
<div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>  </div>
<div class="line"><a name="l02611"></a><span class="lineno"> 2611</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02612"></a><span class="lineno"> 2612</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02613"></a><span class="lineno"> 2613</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02614"></a><span class="lineno"> 2614</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, numTasks) \</span></div>
<div class="line"><a name="l02615"></a><span class="lineno"> 2615</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp)</span></div>
<div class="line"><a name="l02616"></a><span class="lineno"> 2616</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>  {</div>
<div class="line"><a name="l02618"></a><span class="lineno"> 2618</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02619"></a><span class="lineno"> 2619</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02620"></a><span class="lineno"> 2620</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>  </div>
<div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>  </div>
<div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>  stateVecReal[indexUp] = stateVecReal[indexLo];</div>
<div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>  stateVecImag[indexUp] = stateVecImag[indexLo];</div>
<div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>  </div>
<div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>  stateVecReal[indexLo] = stateRealUp;</div>
<div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>  stateVecImag[indexLo] = stateImagUp;</div>
<div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>  } </div>
<div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>  }</div>
<div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>  </div>
<div class="line"><a name="l02637"></a><span class="lineno"> 2637</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01048">statevec_pauliX()</a>.</p>
</div>
</div>
<a id="a0f562af6cb665a8a7a3f80e9449734d5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0f562af6cb665a8a7a3f80e9449734d5">◆ </a></span>statevec_pauliYDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliYDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecIn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>updateUpper</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conjFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Rotate a single qubit by +-{{0,-i},{i,0}. </p>
<p>Operate on a subset of the state vector with upper and lower block values stored seperately. This rotation is just swapping upper and lower values, and stateVecIn must already be the correct section for this chunk</p>
<dl class="section remark"><dt>Remarks</dt><dd>Qubits are zero-based and the <br />
the first qubit is the rightmost <br />
</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecIn</td><td>probability amplitudes in lower or upper half of a block depending on chunkId </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">updateUpper</td><td>flag, 1: updating upper values, 0: updating lower values in block </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">conjFac</td><td>1: apply conj(pauliY), 0: apply pauliY </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02945">2945</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span> {</div>
<div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>  </div>
<div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>  </div>
<div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealIn=stateVecIn.real, *stateVecImagIn=stateVecIn.imag;</div>
<div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>  </div>
<div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>  <span class="keywordtype">int</span> realSign=1, imagSign=1;</div>
<div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>  <span class="keywordflow">if</span> (updateUpper) imagSign=-1;</div>
<div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>  <span class="keywordflow">else</span> realSign = -1;</div>
<div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>  </div>
<div class="line"><a name="l02961"></a><span class="lineno"> 2961</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02962"></a><span class="lineno"> 2962</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02963"></a><span class="lineno"> 2963</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02964"></a><span class="lineno"> 2964</span> <span class="preprocessor"> shared (stateVecRealIn,stateVecImagIn,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02965"></a><span class="lineno"> 2965</span> <span class="preprocessor"> realSign,imagSign, numTasks,conjFac) \</span></div>
<div class="line"><a name="l02966"></a><span class="lineno"> 2966</span> <span class="preprocessor"> private (thisTask)</span></div>
<div class="line"><a name="l02967"></a><span class="lineno"> 2967</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>  {</div>
<div class="line"><a name="l02969"></a><span class="lineno"> 2969</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02970"></a><span class="lineno"> 2970</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02971"></a><span class="lineno"> 2971</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>  stateVecRealOut[thisTask] = conjFac * realSign * stateVecImagIn[thisTask];</div>
<div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>  stateVecImagOut[thisTask] = conjFac * imagSign * stateVecRealIn[thisTask];</div>
<div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>  }</div>
<div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>  }</div>
<div class="line"><a name="l02977"></a><span class="lineno"> 2977</span> } </div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, and <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01142">statevec_pauliY()</a>, and <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01167">statevec_pauliYConj()</a>.</p>
</div>
</div>
<a id="a45b0916c3e121837f214b64f7424e479"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a45b0916c3e121837f214b64f7424e479">◆ </a></span>statevec_pauliYLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_pauliYLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>conjFac</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02887">2887</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span> {</div>
<div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>  </div>
<div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateImagUp;</div>
<div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>  </div>
<div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>  </div>
<div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>  </div>
<div class="line"><a name="l02905"></a><span class="lineno"> 2905</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02906"></a><span class="lineno"> 2906</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02907"></a><span class="lineno"> 2907</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02908"></a><span class="lineno"> 2908</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, numTasks,conjFac) \</span></div>
<div class="line"><a name="l02909"></a><span class="lineno"> 2909</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp)</span></div>
<div class="line"><a name="l02910"></a><span class="lineno"> 2910</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>  {</div>
<div class="line"><a name="l02912"></a><span class="lineno"> 2912</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02913"></a><span class="lineno"> 2913</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02914"></a><span class="lineno"> 2914</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>  </div>
<div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>  </div>
<div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>  stateVecReal[indexUp] = conjFac * stateVecImag[indexLo];</div>
<div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>  stateVecImag[indexUp] = conjFac * -stateVecReal[indexLo];</div>
<div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>  stateVecReal[indexLo] = conjFac * -stateImagUp;</div>
<div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>  stateVecImag[indexLo] = conjFac * stateRealUp;</div>
<div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>  } </div>
<div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>  }</div>
<div class="line"><a name="l02929"></a><span class="lineno"> 2929</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01142">statevec_pauliY()</a>, and <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01167">statevec_pauliYConj()</a>.</p>
</div>
</div>
<a id="abe74a5a9db8340e37b80fbc77338894d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abe74a5a9db8340e37b80fbc77338894d">◆ </a></span>statevec_swapQubitAmpsDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_swapQubitAmpsDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>pairRank</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>qureg.pairStateVec contains the entire set of amplitudes of the paired node which includes the set of all amplitudes which need to be swapped between |..0..1..> and |..1..0..> </p>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03965">3965</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>  {</div>
<div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>  </div>
<div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>  <span class="comment">// can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *rePairVec = qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.real;</div>
<div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imPairVec = qureg.<a class="code" href="structQureg.html#aba97773694870ef35e378c036f486bb7">pairStateVec</a>.imag;</div>
<div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>  </div>
<div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numLocalAmps = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> globalStartInd = qureg.<a class="code" href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">chunkId</a> * numLocalAmps;</div>
<div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> pairGlobalStartInd = pairRank * numLocalAmps;</div>
<div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>  </div>
<div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> localInd, globalInd;</div>
<div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> pairLocalInd, pairGlobalInd;</div>
<div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>  </div>
<div class="line"><a name="l03980"></a><span class="lineno"> 3980</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03981"></a><span class="lineno"> 3981</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03982"></a><span class="lineno"> 3982</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03983"></a><span class="lineno"> 3983</span> <span class="preprocessor"> shared (reVec,imVec,rePairVec,imPairVec,numLocalAmps,globalStartInd,pairGlobalStartInd,qb1,qb2) \</span></div>
<div class="line"><a name="l03984"></a><span class="lineno"> 3984</span> <span class="preprocessor"> private (localInd,globalInd, pairLocalInd,pairGlobalInd) </span></div>
<div class="line"><a name="l03985"></a><span class="lineno"> 3985</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>  {</div>
<div class="line"><a name="l03987"></a><span class="lineno"> 3987</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03988"></a><span class="lineno"> 3988</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03989"></a><span class="lineno"> 3989</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>  <span class="keywordflow">for</span> (localInd=0; localInd < numLocalAmps; localInd++) { </div>
<div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>  </div>
<div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>  globalInd = globalStartInd + localInd;</div>
<div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>  <span class="keywordflow">if</span> (<a class="code" href="QuEST__cpu__internal_8h.html#a0e4eb651e7cb309bcd664b89ac9a2242">isOddParity</a>(globalInd, qb1, qb2)) {</div>
<div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>  </div>
<div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>  pairGlobalInd = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(<a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(globalInd, qb1), qb2);</div>
<div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>  pairLocalInd = pairGlobalInd - pairGlobalStartInd;</div>
<div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>  </div>
<div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>  reVec[localInd] = rePairVec[pairLocalInd];</div>
<div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>  imVec[localInd] = imPairVec[pairLocalInd];</div>
<div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>  }</div>
<div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>  }</div>
<div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>  }</div>
<div class="line"><a name="l04003"></a><span class="lineno"> 4003</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00336">Qureg::chunkId</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__cpu__internal_8h_source.html#l00038">isOddParity()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="QuEST_8h_source.html#l00343">Qureg::pairStateVec</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01431">statevec_swapQubitAmps()</a>.</p>
</div>
</div>
<a id="ab5b51a28caa8792a3f0c637409a694b0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab5b51a28caa8792a3f0c637409a694b0">◆ </a></span>statevec_swapQubitAmpsLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_swapQubitAmpsLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>qb2</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>It is ensured that all amplitudes needing to be swapped are on this node. </p>
<p>This means that amplitudes for |a 0..0..> to |a 1..1..> all exist on this node and each node has a different bit-string prefix "a". The prefix 'a' (and ergo, the chunkID) don't enter the calculations for the offset of |a 0..1..> and |a 1..0..> from |a 0..0..> and ergo are not featured below. </p>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l03922">3922</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>  {</div>
<div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>  </div>
<div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>  <span class="comment">// can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *reVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *imVec = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>  </div>
<div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks = qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a> >> 2; <span class="comment">// each iteration updates 2 amps and skips 2 amps</span></div>
<div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask;</div>
<div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> ind00, ind01, ind10;</div>
<div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> re01, re10;</div>
<div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> im01, im10;</div>
<div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>  </div>
<div class="line"><a name="l03934"></a><span class="lineno"> 3934</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03935"></a><span class="lineno"> 3935</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l03936"></a><span class="lineno"> 3936</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l03937"></a><span class="lineno"> 3937</span> <span class="preprocessor"> shared (reVec,imVec,numTasks,qb1,qb2) \</span></div>
<div class="line"><a name="l03938"></a><span class="lineno"> 3938</span> <span class="preprocessor"> private (thisTask, ind00,ind01,ind10, re01,re10, im01,im10) </span></div>
<div class="line"><a name="l03939"></a><span class="lineno"> 3939</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>  {</div>
<div class="line"><a name="l03941"></a><span class="lineno"> 3941</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l03942"></a><span class="lineno"> 3942</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l03943"></a><span class="lineno"> 3943</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) { </div>
<div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>  <span class="comment">// determine ind00 of |..0..0..>, |..0..1..> and |..1..0..></span></div>
<div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>  ind00 = <a class="code" href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a>(thisTask, qb1, qb2);</div>
<div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>  ind01 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, qb1);</div>
<div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>  ind10 = <a class="code" href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a>(ind00, qb2);</div>
<div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>  </div>
<div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>  <span class="comment">// extract statevec amplitudes </span></div>
<div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>  re01 = reVec[ind01]; im01 = imVec[ind01];</div>
<div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>  re10 = reVec[ind10]; im10 = imVec[ind10];</div>
<div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>  </div>
<div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>  <span class="comment">// swap 01 and 10 amps</span></div>
<div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>  reVec[ind01] = re10; reVec[ind10] = re01;</div>
<div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>  imVec[ind01] = im10; imVec[ind10] = im01;</div>
<div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>  }</div>
<div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>  }</div>
<div class="line"><a name="l03959"></a><span class="lineno"> 3959</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST__gpu_8cu_source.html#l00095">flipBit()</a>, <a class="el" href="QuEST__gpu_8cu_source.html#l00106">insertTwoZeroBits()</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l01431">statevec_swapQubitAmps()</a>.</p>
</div>
</div>
<a id="a0ce2c2fd54df25495e99dc5b95bed4b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0ce2c2fd54df25495e99dc5b95bed4b2">◆ </a></span>statevec_unitaryDistributed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_unitaryDistributed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplex.html">Complex</a> </td>
<td class="paramname"><em>rot2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecUp</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecLo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ComplexArray </td>
<td class="paramname"><em>stateVecOut</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Apply a unitary operation to a single qubit given a subset of the state vector with upper and lower block values stored seperately. </p>
<dl class="section remark"><dt>Remarks</dt><dd>Qubits are zero-based and the first qubit is the rightmost <br />
</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">qureg</td><td>object representing the set of qubits </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot1</td><td></td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">rot2</td><td></td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecUp</td><td>probability amplitudes in upper half of a block </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">stateVecLo</td><td>probability amplitudes in lower half of a block </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">stateVecOut</td><td>array section to update (will correspond to either the lower or upper half of a block) </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02151">2151</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span> {</div>
<div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>  </div>
<div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>;</div>
<div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>  </div>
<div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot1Real=rot1.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot1Imag=rot1.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> rot2Real=rot2.<a class="code" href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">real</a>, rot2Imag=rot2.<a class="code" href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">imag</a>;</div>
<div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealUp=stateVecUp.real, *stateVecImagUp=stateVecUp.imag;</div>
<div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealLo=stateVecLo.real, *stateVecImagLo=stateVecLo.imag;</div>
<div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecRealOut=stateVecOut.real, *stateVecImagOut=stateVecOut.imag;</div>
<div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>  </div>
<div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>  </div>
<div class="line"><a name="l02169"></a><span class="lineno"> 2169</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02170"></a><span class="lineno"> 2170</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02171"></a><span class="lineno"> 2171</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02172"></a><span class="lineno"> 2172</span> <span class="preprocessor"> shared (stateVecRealUp,stateVecImagUp,stateVecRealLo,stateVecImagLo,stateVecRealOut,stateVecImagOut, \</span></div>
<div class="line"><a name="l02173"></a><span class="lineno"> 2173</span> <span class="preprocessor"> rot1Real, rot1Imag, rot2Real, rot2Imag,numTasks) \</span></div>
<div class="line"><a name="l02174"></a><span class="lineno"> 2174</span> <span class="preprocessor"> private (thisTask,stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l02175"></a><span class="lineno"> 2175</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>  {</div>
<div class="line"><a name="l02177"></a><span class="lineno"> 2177</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02178"></a><span class="lineno"> 2178</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02179"></a><span class="lineno"> 2179</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>  stateRealUp = stateVecRealUp[thisTask];</div>
<div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>  stateImagUp = stateVecImagUp[thisTask];</div>
<div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>  </div>
<div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>  stateRealLo = stateVecRealLo[thisTask];</div>
<div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>  stateImagLo = stateVecImagLo[thisTask];</div>
<div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>  </div>
<div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>  stateVecRealOut[thisTask] = rot1Real*stateRealUp - rot1Imag*stateImagUp </div>
<div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>  + rot2Real*stateRealLo - rot2Imag*stateImagLo;</div>
<div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>  stateVecImagOut[thisTask] = rot1Real*stateImagUp + rot1Imag*stateRealUp </div>
<div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>  + rot2Real*stateImagLo + rot2Imag*stateRealLo;</div>
<div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>  }</div>
<div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>  }</div>
<div class="line"><a name="l02194"></a><span class="lineno"> 2194</span> }</div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00106">Complex::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, and <a class="el" href="QuEST_8h_source.html#l00105">Complex::real</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00895">statevec_unitary()</a>.</p>
</div>
</div>
<a id="aafc398f8f479fcc066a2dea700235635"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aafc398f8f479fcc066a2dea700235635">◆ </a></span>statevec_unitaryLocal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void statevec_unitaryLocal </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structQureg.html">Qureg</a> </td>
<td class="paramname"><em>qureg</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int </td>
<td class="paramname"><em>targetQubit</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structComplexMatrix2.html">ComplexMatrix2</a> </td>
<td class="paramname"><em>u</em> </td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="QuEST__cpu_8c_source.html#l02026">2026</a> of file <a class="el" href="QuEST__cpu_8c_source.html">QuEST_cpu.c</a>.</p>
<div class="fragment"><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span> {</div>
<div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> sizeBlock, sizeHalfBlock;</div>
<div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisBlock, <span class="comment">// current block</span></div>
<div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>  indexUp,indexLo; <span class="comment">// current index and corresponding index in lower half block</span></div>
<div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>  </div>
<div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> stateRealUp,stateRealLo,stateImagUp,stateImagLo;</div>
<div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> thisTask; </div>
<div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>  <span class="keywordtype">long</span> <span class="keywordtype">long</span> <span class="keywordtype">int</span> numTasks=qureg.<a class="code" href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">numAmpsPerChunk</a>>>1;</div>
<div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>  </div>
<div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>  <span class="comment">// set dimensions</span></div>
<div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>  sizeHalfBlock = 1LL << targetQubit; </div>
<div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>  sizeBlock = 2LL * sizeHalfBlock; </div>
<div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>  </div>
<div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>  <span class="comment">// Can't use qureg.stateVec as a private OMP var</span></div>
<div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecReal = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.real;</div>
<div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>  <a class="code" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a> *stateVecImag = qureg.<a class="code" href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">stateVec</a>.imag;</div>
<div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>  </div>
<div class="line"><a name="l02044"></a><span class="lineno"> 2044</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02045"></a><span class="lineno"> 2045</span> <span class="preprocessor"># pragma omp parallel \</span></div>
<div class="line"><a name="l02046"></a><span class="lineno"> 2046</span> <span class="preprocessor"> default (none) \</span></div>
<div class="line"><a name="l02047"></a><span class="lineno"> 2047</span> <span class="preprocessor"> shared (sizeBlock,sizeHalfBlock, stateVecReal,stateVecImag, u,numTasks) \</span></div>
<div class="line"><a name="l02048"></a><span class="lineno"> 2048</span> <span class="preprocessor"> private (thisTask,thisBlock ,indexUp,indexLo, stateRealUp,stateImagUp,stateRealLo,stateImagLo)</span></div>
<div class="line"><a name="l02049"></a><span class="lineno"> 2049</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>  {</div>
<div class="line"><a name="l02051"></a><span class="lineno"> 2051</span> <span class="preprocessor"># ifdef _OPENMP</span></div>
<div class="line"><a name="l02052"></a><span class="lineno"> 2052</span> <span class="preprocessor"># pragma omp for schedule (static)</span></div>
<div class="line"><a name="l02053"></a><span class="lineno"> 2053</span> <span class="preprocessor"># endif</span></div>
<div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>  <span class="keywordflow">for</span> (thisTask=0; thisTask<numTasks; thisTask++) {</div>
<div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>  </div>
<div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>  thisBlock = thisTask / sizeHalfBlock;</div>
<div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>  indexUp = thisBlock*sizeBlock + thisTask%sizeHalfBlock;</div>
<div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>  indexLo = indexUp + sizeHalfBlock;</div>
<div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>  </div>
<div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>  <span class="comment">// store current state vector values in temp variables</span></div>
<div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>  stateRealUp = stateVecReal[indexUp];</div>
<div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>  stateImagUp = stateVecImag[indexUp];</div>
<div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>  </div>
<div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>  stateRealLo = stateVecReal[indexLo];</div>
<div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>  stateImagLo = stateVecImag[indexLo];</div>
<div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>  </div>
<div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>  </div>
<div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>  <span class="comment">// state[indexUp] = u00 * state[indexUp] + u01 * state[indexLo]</span></div>
<div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>  stateVecReal[indexUp] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]*stateRealUp - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0]*stateImagUp </div>
<div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]*stateRealLo - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1]*stateImagLo;</div>
<div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>  stateVecImag[indexUp] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][0]*stateImagUp + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][0]*stateRealUp </div>
<div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[0][1]*stateImagLo + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[0][1]*stateRealLo;</div>
<div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>  </div>
<div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>  <span class="comment">// state[indexLo] = u10 * state[indexUp] + u11 * state[indexLo]</span></div>
<div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>  stateVecReal[indexLo] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]*stateRealUp - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0]*stateImagUp </div>
<div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]*stateRealLo - u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1]*stateImagLo;</div>
<div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>  stateVecImag[indexLo] = u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][0]*stateImagUp + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][0]*stateRealUp </div>
<div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>  + u.<a class="code" href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">real</a>[1][1]*stateImagLo + u.<a class="code" href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">imag</a>[1][1]*stateRealLo;</div>
<div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>  </div>
<div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>  } </div>
<div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>  }</div>
<div class="line"><a name="l02082"></a><span class="lineno"> 2082</span> } </div>
</div><!-- fragment -->
<p class="reference">References <a class="el" href="QuEST_8h_source.html#l00140">ComplexMatrix2::imag</a>, <a class="el" href="QuEST_8h_source.html#l00332">Qureg::numAmpsPerChunk</a>, <a class="el" href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a>, <a class="el" href="QuEST_8h_source.html#l00139">ComplexMatrix2::real</a>, and <a class="el" href="QuEST_8h_source.html#l00341">Qureg::stateVec</a>.</p>
<p class="reference">Referenced by <a class="el" href="QuEST__cpu__distributed_8c_source.html#l00895">statevec_unitary()</a>.</p>
</div>
</div>
</div><!-- contents -->
<div class="ttc" id="aQuEST__cpu_8c_html_afa4231f79fe9498e4fd87cc70cde5a9d"><div class="ttname"><a href="QuEST__cpu_8c.html#afa4231f79fe9498e4fd87cc70cde5a9d">qsortComp</a></div><div class="ttdeci">int qsortComp(const void *a, const void *b)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l01908">QuEST_cpu.c:1908</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html_aeadc9893e1b16cdd585dac523e73926c"><div class="ttname"><a href="structComplexMatrix4.html#aeadc9893e1b16cdd585dac523e73926c">ComplexMatrix4::real</a></div><div class="ttdeci">qreal real[4][4]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00177">QuEST.h:177</a></div></div>
<div class="ttc" id="astructQureg_html_aba97773694870ef35e378c036f486bb7"><div class="ttname"><a href="structQureg.html#aba97773694870ef35e378c036f486bb7">Qureg::pairStateVec</a></div><div class="ttdeci">ComplexArray pairStateVec</div><div class="ttdoc">Temporary storage for a chunk of the state vector received from another process in the MPI version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00343">QuEST.h:343</a></div></div>
<div class="ttc" id="aQuEST__cpu_8c_html_aa31f0ef43a921c3ac73545d1d3670fa1"><div class="ttname"><a href="QuEST__cpu_8c.html#aa31f0ef43a921c3ac73545d1d3670fa1">densmatr_mixDephasing</a></div><div class="ttdeci">void densmatr_mixDephasing(Qureg qureg, int targetQubit, qreal dephase)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l00085">QuEST_cpu.c:85</a></div></div>
<div class="ttc" id="agroup__type_html_ga7740e349b4f8bae6451547680f0ce2d6"><div class="ttname"><a href="group__type.html#ga7740e349b4f8bae6451547680f0ce2d6">qreal</a></div><div class="ttdeci">#define qreal</div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_ae1b7788cf504ec3d79de3855f97929c7"><div class="ttname"><a href="QuEST__gpu_8cu.html#ae1b7788cf504ec3d79de3855f97929c7">flipBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int flipBit(const long long int number, const int bitInd)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00095">QuEST_gpu.cu:95</a></div></div>
<div class="ttc" id="aQuEST__cpu__internal_8h_html_a100463f6ec212c76a5fad99579000505"><div class="ttname"><a href="QuEST__cpu__internal_8h.html#a100463f6ec212c76a5fad99579000505">extractBit</a></div><div class="ttdeci">static int extractBit(const int locationOfBitFromRight, const long long int theEncodedNumber)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__internal_8h_source.html#l00026">QuEST_cpu_internal.h:26</a></div></div>
<div class="ttc" id="astructQureg_html_ac2929e681d3d95591c18cf168dbbe4f0"><div class="ttname"><a href="structQureg.html#ac2929e681d3d95591c18cf168dbbe4f0">Qureg::chunkId</a></div><div class="ttdeci">int chunkId</div><div class="ttdoc">The position of the chunk of the state vector held by this process in the full state vector.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00336">QuEST.h:336</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html_a3a2b60a9e00ccef054a6de3b9307c1be"><div class="ttname"><a href="structComplexMatrix2.html#a3a2b60a9e00ccef054a6de3b9307c1be">ComplexMatrix2::imag</a></div><div class="ttdeci">qreal imag[2][2]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00140">QuEST.h:140</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a5c6f1b2c71f43e57de4a1f818ddfbfd0"><div class="ttname"><a href="QuEST__gpu_8cu.html#a5c6f1b2c71f43e57de4a1f818ddfbfd0">insertZeroBit</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertZeroBit(const long long int number, const int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00099">QuEST_gpu.cu:99</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a85c3f52533efe831bbe40b9a48602388"><div class="ttname"><a href="structDiagonalOp.html#a85c3f52533efe831bbe40b9a48602388">DiagonalOp::imag</a></div><div class="ttdeci">qreal * imag</div><div class="ttdoc">The imaginary values of the 2^numQubits complex elements.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00310">QuEST.h:310</a></div></div>
<div class="ttc" id="astructQureg_html_ab0ea0358482b62f43fdd781469607d97"><div class="ttname"><a href="structQureg.html#ab0ea0358482b62f43fdd781469607d97">Qureg::numAmpsPerChunk</a></div><div class="ttdeci">long long int numAmpsPerChunk</div><div class="ttdoc">Number of probability amplitudes held in stateVec by this process In the non-MPI version,...</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00332">QuEST.h:332</a></div></div>
<div class="ttc" id="aQuEST__cpu_8c_html_a717a0448066831cb5b392bcf2e1d0529"><div class="ttname"><a href="QuEST__cpu_8c.html#a717a0448066831cb5b392bcf2e1d0529">densmatr_oneQubitDegradeOffDiagonal</a></div><div class="ttdeci">void densmatr_oneQubitDegradeOffDiagonal(Qureg qureg, int targetQubit, qreal retain)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu_8c_source.html#l00054">QuEST_cpu.c:54</a></div></div>
<div class="ttc" id="astructComplexMatrix4_html_a1f6bb840b5a9e6252980cab7a14f1a35"><div class="ttname"><a href="structComplexMatrix4.html#a1f6bb840b5a9e6252980cab7a14f1a35">ComplexMatrix4::imag</a></div><div class="ttdeci">qreal imag[4][4]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00178">QuEST.h:178</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a5131eeb67aafb4c19ac98270c3266742"><div class="ttname"><a href="structDiagonalOp.html#a5131eeb67aafb4c19ac98270c3266742">DiagonalOp::numQubits</a></div><div class="ttdeci">int numQubits</div><div class="ttdoc">The number of qubits this operator can act on (informing its size)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00300">QuEST.h:300</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_a446e8a077597e4f76049d547df0c9738"><div class="ttname"><a href="structComplexMatrixN.html#a446e8a077597e4f76049d547df0c9738">ComplexMatrixN::real</a></div><div class="ttdeci">qreal ** real</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00189">QuEST.h:189</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_aec1852e1a8e70d3690919ce8ab551ba0"><div class="ttname"><a href="QuEST__gpu_8cu.html#aec1852e1a8e70d3690919ce8ab551ba0">extractBit</a></div><div class="ttdeci">__forceinline__ __device__ int extractBit(const int locationOfBitFromRight, const long long int theEncodedNumber)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00082">QuEST_gpu.cu:82</a></div></div>
<div class="ttc" id="aQuEST__cpu__internal_8h_html_aa183d46d750769c42ff07ae1aaedc105"><div class="ttname"><a href="QuEST__cpu__internal_8h.html#aa183d46d750769c42ff07ae1aaedc105">insertZeroBit</a></div><div class="ttdeci">static long long int insertZeroBit(const long long int number, const int index)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__internal_8h_source.html#l00042">QuEST_cpu_internal.h:42</a></div></div>
<div class="ttc" id="aQuEST__gpu_8cu_html_a4760109974e9b52c60e9d60ccded3138"><div class="ttname"><a href="QuEST__gpu_8cu.html#a4760109974e9b52c60e9d60ccded3138">insertTwoZeroBits</a></div><div class="ttdeci">__forceinline__ __device__ long long int insertTwoZeroBits(const long long int number, const int bit1, const int bit2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__gpu_8cu_source.html#l00106">QuEST_gpu.cu:106</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_afde13e469a3b4f179f45e53d1ec0a7cf"><div class="ttname"><a href="structComplexMatrixN.html#afde13e469a3b4f179f45e53d1ec0a7cf">ComplexMatrixN::imag</a></div><div class="ttdeci">qreal ** imag</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00190">QuEST.h:190</a></div></div>
<div class="ttc" id="astructQureg_html_a441e4cacef6bd17adb9813c7442d42fe"><div class="ttname"><a href="structQureg.html#a441e4cacef6bd17adb9813c7442d42fe">Qureg::stateVec</a></div><div class="ttdeci">ComplexArray stateVec</div><div class="ttdoc">Computational state amplitudes - a subset thereof in the MPI version.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00341">QuEST.h:341</a></div></div>
<div class="ttc" id="astructComplexMatrix2_html_a3ea98d545b67a190ee6abe936c72076f"><div class="ttname"><a href="structComplexMatrix2.html#a3ea98d545b67a190ee6abe936c72076f">ComplexMatrix2::real</a></div><div class="ttdeci">qreal real[2][2]</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00139">QuEST.h:139</a></div></div>
<div class="ttc" id="astructComplexMatrixN_html_a606f7afbc3f65a596bdca21cb43be6a8"><div class="ttname"><a href="structComplexMatrixN.html#a606f7afbc3f65a596bdca21cb43be6a8">ComplexMatrixN::numQubits</a></div><div class="ttdeci">int numQubits</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00188">QuEST.h:188</a></div></div>
<div class="ttc" id="aQuEST__cpu__internal_8h_html_a0e4eb651e7cb309bcd664b89ac9a2242"><div class="ttname"><a href="QuEST__cpu__internal_8h.html#a0e4eb651e7cb309bcd664b89ac9a2242">isOddParity</a></div><div class="ttdeci">static int isOddParity(const long long int number, const int qb1, const int qb2)</div><div class="ttdef"><b>Definition:</b> <a href="QuEST__cpu__internal_8h_source.html#l00038">QuEST_cpu_internal.h:38</a></div></div>
<div class="ttc" id="astructQureg_html_ad08dff5316b8937f4b2a1417591543dc"><div class="ttname"><a href="structQureg.html#ad08dff5316b8937f4b2a1417591543dc">Qureg::numQubitsRepresented</a></div><div class="ttdeci">int numQubitsRepresented</div><div class="ttdoc">The number of qubits represented in either the state-vector or density matrix.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00327">QuEST.h:327</a></div></div>
<div class="ttc" id="astructQureg_html_adef4935cac95763c29164cf99b144ed4"><div class="ttname"><a href="structQureg.html#adef4935cac95763c29164cf99b144ed4">Qureg::numAmpsTotal</a></div><div class="ttdeci">long long int numAmpsTotal</div><div class="ttdoc">Total number of amplitudes, which are possibly distributed among machines.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00334">QuEST.h:334</a></div></div>
<div class="ttc" id="astructDiagonalOp_html_a1d66088bed235d524cd452b107694d5c"><div class="ttname"><a href="structDiagonalOp.html#a1d66088bed235d524cd452b107694d5c">DiagonalOp::real</a></div><div class="ttdeci">qreal * real</div><div class="ttdoc">The real values of the 2^numQubits complex elements.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00308">QuEST.h:308</a></div></div>
<div class="ttc" id="astructComplex_html_ab5b2e2eca02131fc74b289a83636cbe3"><div class="ttname"><a href="structComplex.html#ab5b2e2eca02131fc74b289a83636cbe3">Complex::real</a></div><div class="ttdeci">qreal real</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00105">QuEST.h:105</a></div></div>
<div class="ttc" id="astructComplex_html_a84f5439aad0ef495efdd3b4c1c02d27e"><div class="ttname"><a href="structComplex.html#a84f5439aad0ef495efdd3b4c1c02d27e">Complex::imag</a></div><div class="ttdeci">qreal imag</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00106">QuEST.h:106</a></div></div>
<div class="ttc" id="astructComplex_html"><div class="ttname"><a href="structComplex.html">Complex</a></div><div class="ttdoc">Represents one complex number.</div><div class="ttdef"><b>Definition:</b> <a href="QuEST_8h_source.html#l00103">QuEST.h:103</a></div></div>
<!-- HTML footer for doxygen 1.8.8-->
<!-- start footer part -->
</div>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="boot.js"></script>
</html>