Home Reference Source

src/setups/decompositions/ry2rz.js

import {Control} from '../../meta/control'
import {Compute, Uncompute} from '../../meta/compute';
import {Rx, Ry, Rz} from '../../ops/gates';
import DecompositionRule from '../../cengines/replacer/decompositionrule';

/**
 * @ignore
 * @param {Command} cmd
 * @private
 */
export const _decompose_ry = (cmd) => {
  const qubit = cmd.qubits[0]
  const eng = cmd.engine
  const angle = cmd.gate.angle

  Control(eng, cmd.controlQubits, () => {
    Compute(eng, () => {
      new Rx(Math.PI / 2.0).or(qubit)
    })
    new Rz(angle).or(qubit)
    Uncompute(eng)
  })
}

/**
 * @ignore
 * @param {Command} cmd
 * @return {boolean}
 * @private
 */
export const _recognize_RyNoCtrl = cmd => cmd.controlCount === 0

export default [
  new DecompositionRule(Ry, _decompose_ry, _recognize_RyNoCtrl)
]