Example #1
0
    def checkBasis(self, cmb):
        #Op with Jamio map on gate in std and gm bases
        Jmx1 = pygsti.jamiolkowski_iso(self.testGate, gateMxBasis='std',
                                       choiMxBasis=cmb, dimOrStateSpaceDims=self.stateSpaceDims)
        Jmx2 = pygsti.jamiolkowski_iso(self.testGateGM_mx, gateMxBasis='gm',
                                       choiMxBasis=cmb, dimOrStateSpaceDims=self.stateSpaceDims)

        #Make sure these yield the same trace == 1 matrix
        self.assertArraysAlmostEqual(Jmx1,Jmx2)
        self.assertAlmostEqual(np.trace(Jmx1), 1.0)

        #Op on expanded gate in std and gm bases
        JmxExp1 = pygsti.jamiolkowski_iso(self.expTestGate_mx,gateMxBasis='std',choiMxBasis=cmb)
        JmxExp2 = pygsti.jamiolkowski_iso(self.expTestGateGM_mx,gateMxBasis='gm',choiMxBasis=cmb)

        #Make sure these are the same as operating on the contracted basis
        self.assertArraysAlmostEqual(Jmx1,JmxExp1)
        self.assertArraysAlmostEqual(Jmx1,JmxExp2)

        #Reverse transform should yield back the gate matrix
        revTestGate_mx = pygsti.jamiolkowski_iso_inv(Jmx1,choiMxBasis=cmb,
                                                                   dimOrStateSpaceDims=self.stateSpaceDims,
                                                                   gateMxBasis='gm')
        self.assertArraysAlmostEqual(revTestGate_mx, self.testGateGM_mx)

        #Reverse transform without specifying stateSpaceDims, then contraction, should yield same result
        revExpTestGate_mx = pygsti.jamiolkowski_iso_inv(Jmx1,choiMxBasis=cmb,
                                                                      gateMxBasis='std')
        self.assertArraysAlmostEqual( pygsti.contract_to_std_direct_sum_mx(revExpTestGate_mx,self.stateSpaceDims),
                                      self.testGate)
Example #2
0
    def checkBasis(self, cmb):
        #Op with Jamio map on gate in std and gm bases
        Jmx1 = pygsti.jamiolkowski_iso(self.testGate,
                                       gateMxBasis='std',
                                       choiMxBasis=cmb,
                                       dimOrStateSpaceDims=self.stateSpaceDims)
        Jmx2 = pygsti.jamiolkowski_iso(self.testGateGM_mx,
                                       gateMxBasis='gm',
                                       choiMxBasis=cmb,
                                       dimOrStateSpaceDims=self.stateSpaceDims)

        #Make sure these yield the same trace == 1 matrix
        self.assertArraysAlmostEqual(Jmx1, Jmx2)
        self.assertAlmostEqual(np.trace(Jmx1), 1.0)

        #Op on expanded gate in std and gm bases
        JmxExp1 = pygsti.jamiolkowski_iso(self.expTestGate_mx,
                                          gateMxBasis='std',
                                          choiMxBasis=cmb)
        JmxExp2 = pygsti.jamiolkowski_iso(self.expTestGateGM_mx,
                                          gateMxBasis='gm',
                                          choiMxBasis=cmb)

        #Make sure these are the same as operating on the contracted basis
        self.assertArraysAlmostEqual(Jmx1, JmxExp1)
        self.assertArraysAlmostEqual(Jmx1, JmxExp2)

        #Reverse transform should yield back the gate matrix
        revTestGate_mx = pygsti.jamiolkowski_iso_inv(
            Jmx1,
            choiMxBasis=cmb,
            dimOrStateSpaceDims=self.stateSpaceDims,
            gateMxBasis='gm')
        self.assertArraysAlmostEqual(revTestGate_mx, self.testGateGM_mx)

        #Reverse transform without specifying stateSpaceDims, then contraction, should yield same result
        revExpTestGate_mx = pygsti.jamiolkowski_iso_inv(Jmx1,
                                                        choiMxBasis=cmb,
                                                        gateMxBasis='std')
        self.assertArraysAlmostEqual(
            pygsti.contract_to_std_direct_sum_mx(revExpTestGate_mx,
                                                 self.stateSpaceDims),
            self.testGate)
Example #3
0
    def checkBasis(self, cmb):
        #Op with Jamio map on gate in std and gm bases
        Jmx1 = pygsti.jamiolkowski_iso(self.testGate,
                                       opMxBasis=self.stdSmall,
                                       choiMxBasis=cmb)
        Jmx2 = pygsti.jamiolkowski_iso(self.testGateGM_mx,
                                       opMxBasis=self.gmSmall,
                                       choiMxBasis=cmb)
        print("Jmx1.shape = ", Jmx1.shape)

        #Make sure these yield the same trace == 1 matrix
        self.assertArraysAlmostEqual(Jmx1, Jmx2)
        self.assertAlmostEqual(np.trace(Jmx1), 1.0)

        #Op on expanded gate in std and gm bases
        JmxExp1 = pygsti.jamiolkowski_iso(self.expTestGate_mx,
                                          opMxBasis=self.std,
                                          choiMxBasis=cmb)
        JmxExp2 = pygsti.jamiolkowski_iso(self.expTestGateGM_mx,
                                          opMxBasis=self.gm,
                                          choiMxBasis=cmb)
        print("JmxExp1.shape = ", JmxExp1.shape)

        #Make sure these are the same as operating on the contracted basis
        self.assertArraysAlmostEqual(Jmx1, JmxExp1)
        self.assertArraysAlmostEqual(Jmx1, JmxExp2)

        #Reverse transform should yield back the operation matrix
        revTestGate_mx = pygsti.jamiolkowski_iso_inv(Jmx1,
                                                     choiMxBasis=cmb,
                                                     opMxBasis=self.gmSmall)
        self.assertArraysAlmostEqual(revTestGate_mx, self.testGateGM_mx)

        #Reverse transform without specifying stateSpaceDims, then contraction, should yield same result
        revExpTestGate_mx = pygsti.jamiolkowski_iso_inv(Jmx1,
                                                        choiMxBasis=cmb,
                                                        opMxBasis=self.std)
        self.assertArraysAlmostEqual(
            bt.resize_std_mx(revExpTestGate_mx, 'contract', self.std,
                             self.stdSmall), self.testGate)
Example #4
0
    def test_jamiolkowski_ops(self):
        mxGM  = np.array([[1, 0, 0, 0],
                          [0, 0, 1, 0],
                          [0,-1, 0, 0],
                          [0, 0, 0, 1]], 'complex')

        mxStd = pygsti.gm_to_std(mxGM)
        mxPP  = pygsti.gm_to_pp(mxGM)

        choiStd = pygsti.jamiolkowski_iso(mxStd, "std","std")
        choiStd2 = pygsti.jamiolkowski_iso(mxGM, "gm","std")
        choiStd3 = pygsti.jamiolkowski_iso(mxPP, "pp","std")

        choiGM = pygsti.jamiolkowski_iso(mxStd, "std","gm")
        choiGM2 = pygsti.jamiolkowski_iso(mxGM, "gm","gm")
        choiGM3 = pygsti.jamiolkowski_iso(mxPP, "pp","gm")

        choiPP = pygsti.jamiolkowski_iso(mxStd, "std","pp")
        choiPP2 = pygsti.jamiolkowski_iso(mxGM, "gm","pp")
        choiPP3 = pygsti.jamiolkowski_iso(mxPP, "pp","pp")

        self.assertArraysAlmostEqual( choiStd, choiStd2)
        self.assertArraysAlmostEqual( choiStd, choiStd3)
        self.assertArraysAlmostEqual( choiGM, choiGM2)
        self.assertArraysAlmostEqual( choiGM, choiGM3)
        self.assertArraysAlmostEqual( choiPP, choiPP2)
        self.assertArraysAlmostEqual( choiPP, choiPP3)

        gateStd = pygsti.jamiolkowski_iso_inv(choiStd, "std","std")
        gateStd2 = pygsti.jamiolkowski_iso_inv(choiGM, "gm","std")
        gateStd3 = pygsti.jamiolkowski_iso_inv(choiPP, "pp","std")

        gateGM = pygsti.jamiolkowski_iso_inv(choiStd, "std","gm")
        gateGM2 = pygsti.jamiolkowski_iso_inv(choiGM, "gm","gm")
        gateGM3 = pygsti.jamiolkowski_iso_inv(choiPP, "pp","gm")

        gatePP = pygsti.jamiolkowski_iso_inv(choiStd, "std","pp")
        gatePP2 = pygsti.jamiolkowski_iso_inv(choiGM, "gm","pp")
        gatePP3 = pygsti.jamiolkowski_iso_inv(choiPP, "pp","pp")

        self.assertArraysAlmostEqual( gateStd, mxStd)
        self.assertArraysAlmostEqual( gateStd2, mxStd)
        self.assertArraysAlmostEqual( gateStd3, mxStd)

        self.assertArraysAlmostEqual( gateGM,  mxGM)
        self.assertArraysAlmostEqual( gateGM2, mxGM)
        self.assertArraysAlmostEqual( gateGM3, mxGM)

        self.assertArraysAlmostEqual( gatePP,  mxPP)
        self.assertArraysAlmostEqual( gatePP2, mxPP)
        self.assertArraysAlmostEqual( gatePP3, mxPP)


        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso(mxStd, "foobar","gm") #invalid gate basis
        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso(mxStd, "std","foobar") #invalid choi basis
        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso_inv(choiStd, "foobar","gm") #invalid choi basis
        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso_inv(choiStd, "std","foobar") #invalid gate basis


        sumOfNeg  = pygsti.sum_of_negative_choi_evals(std.gs_target)
        sumsOfNeg = pygsti.sums_of_negative_choi_evals(std.gs_target)
        magsOfNeg = pygsti.mags_of_negative_choi_evals(std.gs_target)
        self.assertAlmostEqual(sumOfNeg, 0.0)
        self.assertArraysAlmostEqual(sumsOfNeg, np.zeros(3,'d')) # 3 gates in std.gs_target
        self.assertArraysAlmostEqual(magsOfNeg, np.zeros(12,'d')) # 3 gates * 4 evals each = 12
Example #5
0
    def test_jamiolkowski_ops(self):
        gm = Basis('gm', 2)
        pp = Basis('pp', 2)
        std = Basis('std', 2)
        mxGM = np.array(
            [[1, 0, 0, 0], [0, 0, 1, 0], [0, -1, 0, 0], [0, 0, 0, 1]],
            'complex')

        mxStd = bt.change_basis(mxGM, gm, std)
        mxPP = bt.change_basis(mxGM, gm, pp)

        choiStd = pygsti.jamiolkowski_iso(mxStd, std, std)
        choiStd2 = pygsti.jamiolkowski_iso(mxGM, gm, std)
        choiStd3 = pygsti.jamiolkowski_iso(mxPP, pp, std)
        fastChoiStd = pygsti.fast_jamiolkowski_iso_std(mxStd, std)
        fastChoiStd2 = pygsti.fast_jamiolkowski_iso_std(mxGM, gm)
        fastChoiStd3 = pygsti.fast_jamiolkowski_iso_std(mxPP, pp)

        choiGM = pygsti.jamiolkowski_iso(mxStd, std, gm)
        choiGM2 = pygsti.jamiolkowski_iso(mxGM, gm, gm)
        choiGM3 = pygsti.jamiolkowski_iso(mxPP, pp, gm)

        choiPP = pygsti.jamiolkowski_iso(mxStd, std, pp)
        choiPP2 = pygsti.jamiolkowski_iso(mxGM, gm, pp)
        choiPP3 = pygsti.jamiolkowski_iso(mxPP, pp, pp)

        self.assertArraysAlmostEqual(choiStd, choiStd2)
        self.assertArraysAlmostEqual(choiStd, choiStd3)
        self.assertArraysAlmostEqual(choiStd, fastChoiStd)
        self.assertArraysAlmostEqual(choiStd, fastChoiStd2)
        self.assertArraysAlmostEqual(choiStd, fastChoiStd3)
        self.assertArraysAlmostEqual(choiGM, choiGM2)
        self.assertArraysAlmostEqual(choiGM, choiGM3)
        self.assertArraysAlmostEqual(choiPP, choiPP2)
        self.assertArraysAlmostEqual(choiPP, choiPP3)

        gateStd = pygsti.jamiolkowski_iso_inv(choiStd, std, std)
        gateStd2 = pygsti.jamiolkowski_iso_inv(choiGM, gm, std)
        gateStd3 = pygsti.jamiolkowski_iso_inv(choiPP, pp, std)

        gateGM = pygsti.jamiolkowski_iso_inv(choiStd, std, gm)
        gateGM2 = pygsti.jamiolkowski_iso_inv(choiGM, gm, gm)
        gateGM3 = pygsti.jamiolkowski_iso_inv(choiPP, pp, gm)

        gatePP = pygsti.jamiolkowski_iso_inv(choiStd, std, pp)
        gatePP2 = pygsti.jamiolkowski_iso_inv(choiGM, gm, pp)
        gatePP3 = pygsti.jamiolkowski_iso_inv(choiPP, pp, pp)

        fastGateStd = pygsti.fast_jamiolkowski_iso_std_inv(choiStd, std)
        fastGateGM = pygsti.fast_jamiolkowski_iso_std_inv(choiStd, gm)
        fastGatePP = pygsti.fast_jamiolkowski_iso_std_inv(choiStd, pp)

        self.assertArraysAlmostEqual(gateStd, mxStd)
        self.assertArraysAlmostEqual(gateStd2, mxStd)
        self.assertArraysAlmostEqual(gateStd3, mxStd)
        self.assertArraysAlmostEqual(fastGateStd, mxStd)

        self.assertArraysAlmostEqual(gateGM, mxGM)
        self.assertArraysAlmostEqual(gateGM2, mxGM)
        self.assertArraysAlmostEqual(gateGM3, mxGM)
        self.assertArraysAlmostEqual(fastGateGM, mxGM)

        self.assertArraysAlmostEqual(gatePP, mxPP)
        self.assertArraysAlmostEqual(gatePP2, mxPP)
        self.assertArraysAlmostEqual(gatePP3, mxPP)
        self.assertArraysAlmostEqual(fastGatePP, mxPP)
        '''
        with self.assertRaises(NotImplementedError):
            pygsti.jamiolkowski_iso(mxStd, "foobar", gm) #invalid gate basis
        with self.assertRaises(NotImplementedError):
            pygsti.jamiolkowski_iso(mxStd, std, "foobar") #invalid choi basis
        with self.assertRaises(NotImplementedError):
            pygsti.jamiolkowski_iso_inv(choiStd, "foobar", gm) #invalid choi basis
        with self.assertRaises(NotImplementedError):
            pygsti.jamiolkowski_iso_inv(choiStd, std, "foobar") #invalid gate basis
        '''

        sumOfNeg = pygsti.sum_of_negative_choi_evals(std1Q.gs_target)
        sumOfNegWt = pygsti.sum_of_negative_choi_evals(std1Q.gs_target, {
            'Gx': 1.0,
            'Gy': 0.5
        })
        sumsOfNeg = pygsti.sums_of_negative_choi_evals(std1Q.gs_target)
        magsOfNeg = pygsti.mags_of_negative_choi_evals(std1Q.gs_target)
        self.assertAlmostEqual(sumOfNeg, 0.0)
        self.assertArraysAlmostEqual(sumsOfNeg,
                                     np.zeros(3,
                                              'd'))  # 3 gates in std.gs_target
        self.assertArraysAlmostEqual(magsOfNeg, np.zeros(
            12, 'd'))  # 3 gates * 4 evals each = 12
Example #6
0
    def test_jamiolkowski_ops(self):
        mxGM  = np.array([[1, 0, 0, 0],
                          [0, 0, 1, 0],
                          [0,-1, 0, 0],
                          [0, 0, 0, 1]], 'complex')

        mxStd = pygsti.gm_to_std(mxGM)
        mxPP  = pygsti.gm_to_pp(mxGM)

        choiStd = pygsti.jamiolkowski_iso(mxStd, "std","std")
        choiStd2 = pygsti.jamiolkowski_iso(mxGM, "gm","std")
        choiStd3 = pygsti.jamiolkowski_iso(mxPP, "pp","std")

        choiGM = pygsti.jamiolkowski_iso(mxStd, "std","gm")
        choiGM2 = pygsti.jamiolkowski_iso(mxGM, "gm","gm")
        choiGM3 = pygsti.jamiolkowski_iso(mxPP, "pp","gm")

        choiPP = pygsti.jamiolkowski_iso(mxStd, "std","pp")
        choiPP2 = pygsti.jamiolkowski_iso(mxGM, "gm","pp")
        choiPP3 = pygsti.jamiolkowski_iso(mxPP, "pp","pp")

        self.assertArraysAlmostEqual( choiStd, choiStd2)
        self.assertArraysAlmostEqual( choiStd, choiStd3)
        self.assertArraysAlmostEqual( choiGM, choiGM2)
        self.assertArraysAlmostEqual( choiGM, choiGM3)
        self.assertArraysAlmostEqual( choiPP, choiPP2)
        self.assertArraysAlmostEqual( choiPP, choiPP3)

        gateStd = pygsti.jamiolkowski_iso_inv(choiStd, "std","std")
        gateStd2 = pygsti.jamiolkowski_iso_inv(choiGM, "gm","std")
        gateStd3 = pygsti.jamiolkowski_iso_inv(choiPP, "pp","std")

        gateGM = pygsti.jamiolkowski_iso_inv(choiStd, "std","gm")
        gateGM2 = pygsti.jamiolkowski_iso_inv(choiGM, "gm","gm")
        gateGM3 = pygsti.jamiolkowski_iso_inv(choiPP, "pp","gm")

        gatePP = pygsti.jamiolkowski_iso_inv(choiStd, "std","pp")
        gatePP2 = pygsti.jamiolkowski_iso_inv(choiGM, "gm","pp")
        gatePP3 = pygsti.jamiolkowski_iso_inv(choiPP, "pp","pp")

        self.assertArraysAlmostEqual( gateStd, mxStd)
        self.assertArraysAlmostEqual( gateStd2, mxStd)
        self.assertArraysAlmostEqual( gateStd3, mxStd)

        self.assertArraysAlmostEqual( gateGM,  mxGM)
        self.assertArraysAlmostEqual( gateGM2, mxGM)
        self.assertArraysAlmostEqual( gateGM3, mxGM)

        self.assertArraysAlmostEqual( gatePP,  mxPP)
        self.assertArraysAlmostEqual( gatePP2, mxPP)
        self.assertArraysAlmostEqual( gatePP3, mxPP)


        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso(mxStd, "foobar","gm") #invalid gate basis
        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso(mxStd, "std","foobar") #invalid choi basis
        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso_inv(choiStd, "foobar","gm") #invalid choi basis
        with self.assertRaises(ValueError):
            pygsti.jamiolkowski_iso_inv(choiStd, "std","foobar") #invalid gate basis
        

        sumOfNeg  = pygsti.sum_of_negative_choi_evals(std.gs_target)
        sumsOfNeg = pygsti.sums_of_negative_choi_evals(std.gs_target)
        magsOfNeg = pygsti.mags_of_negative_choi_evals(std.gs_target)
        self.assertAlmostEqual(sumOfNeg, 0.0)
        self.assertArraysAlmostEqual(sumsOfNeg, np.zeros(3,'d')) # 3 gates in std.gs_target
        self.assertArraysAlmostEqual(magsOfNeg, np.zeros(12,'d')) # 3 gates * 4 evals each = 12