# Training parameters in two quantum circuits

**URL:** <https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582>\
**Category:** PennyLane Help\
**Created:** [December 27, 2021, 5:30am UTC](https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582 "2021-12-27T05:30:23Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Pei-Kun](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/pei-kun/32/867_2.png) [@Pei-Kun](https://discuss.pennylane.ai/u/Pei-Kun)\
**Post date:** [December 27, 2021, 5:30am UTC](https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582/1 "2021-12-27T05:30:23Z")

</div>

Two quantum circuits containing parametric gates. The probabilities of the states in circuit 1 were measured. After some operations (due to I need nonlinear effects for machine learning ), the data was sent to circuit 2. Define the cost function, the results shown that only the parameters in circuit 2 were adjusted. The parameters in circuit 1 were belong to Autograd, however, the values were unchanged. I believe that the parameters in circuit 1 are differentiable. Is it possible to adjust the parameters in circuits and 1 and 2 simultaneously?

The following was simplified example:  
import pennylane as qml  
from pennylane import numpy as np

dev1=qml.device(“default.qubit”,wires=1)  
dev2=qml.device(“default.qubit”,wires=1)

phi1=1.0  
phi2=1.0  
params=np.array([phi1,phi2],requires\_grad=True)

@qml.qnode(dev1)  
def circ1(params):  
qml.RY(params[0],wires=0)  
pro=qml.probs(wires=[0])  
return pro

@qml.qnode(dev2)  
def circ2(inp,params):  
state=Pro\_State\_Con(inp)  
qml.QubitStateVector(state,wires=range(1))  
qml.RY(params[1],wires=0)  
pro=qml.probs(wires=[0])  
return pro

def Pro\_State\_Con(pro):  
state=  
for i in range (len(pro)):  
state.append(qml.math.toarray(np.sqrt(pro[i])))  
return state

def cost(params):  
global pro,pro2  
pro=circ1(params)  
pro2=circ2(pro,params)  
print(pro2[0])  
return pro2[0]

opt=qml.GradientDescentOptimizer(stepsize=0.3)  
for i in range(10):  
print(params)  
params=opt.step(cost,params)  
print(params)

---

<div class="post-metadata">

**Author:** ![Pei-Kun](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/pei-kun/32/867_2.png) [@Pei-Kun](https://discuss.pennylane.ai/u/Pei-Kun)\
**Post date:** [December 30, 2021, 1:51am UTC](https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582/2 "2021-12-30T01:51:08Z")

</div>

I tested the following script, and appeared the error message “State preparation operation QubitStateVector must occur prior to any quantum operations.”

Mean that the input of circuit 2 can not be from the output of circuit 1 or any quantum operations in Pennylane.

Is there any solution?

import pennylane as qml  
from pennylane import numpy as np

dev=qml.device(“default.qubit”,wires=1)

@qml.qnode(dev)  
def circ():  
qml.RY(0,wires=0)  
qml.QubitStateVector([0,1],wires=0)  
qml.RY(0,wires=0)  
pro=qml.probs(wires=[0])  
return pro

print(circ())

---

<div class="post-metadata">

**Author:** ![Pei-Kun](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/pei-kun/32/867_2.png) [@Pei-Kun](https://discuss.pennylane.ai/u/Pei-Kun)\
**Post date:** [December 30, 2021, 9:02am UTC](https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582/3 "2021-12-30T09:02:51Z")

</div>

The parameters in circuits 1 and 2 can be trained simultaneously in following script. However, what I want is to minimize the output of circuit 2, not the output of circuit 1 plus circuit 2.

import pennylane as qml  
from pennylane import numpy as np

dev1=qml.device(“default.qubit”,wires=1)  
dev2=qml.device(“default.qubit”,wires=1)

phi1=1.0  
phi2=1.0  
params=np.array([phi1,phi2],requires\_grad=True)

@qml.qnode(dev1)  
def circ1(params):  
qml.RY(params[0],wires=0)  
pro=qml.probs(wires=[0])  
return pro

@qml.qnode(dev2)  
def circ2(params):  
qml.templates.MottonenStatePreparation(state,wires=[0])  
qml.RY(params[1],wires=0)  
pro=qml.probs(wires=[0])  
return pro

def Pro\_State\_Con(pro):  
state=  
for i in range (len(pro)):  
state.append(qml.math.toarray(np.sqrt(pro[i])))  
return state

def cost(params):  
global state  
pro=circ1(params)  
state=Pro\_State\_Con(pro)  
pro2=circ2(params)  
print(pro[0],pro2[0],pro[0]+pro2[0])  
return pro[1]+pro2[0]

opt=qml.GradientDescentOptimizer(stepsize=0.3)  
for i in range(10):  
params=opt.step(cost,params)  
print(params)

---

<div class="post-metadata">

**Author:** ![Pei-Kun](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/pei-kun/32/867_2.png) [@Pei-Kun](https://discuss.pennylane.ai/u/Pei-Kun)\
**Post date:** [December 30, 2021, 4:25pm UTC](https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582/4 "2021-12-30T16:25:25Z")

</div>

I think that the problem is solved. Measure the probability of circuit 1, do some calculations, and input to the circuit 2. The parameters in circuits 1 and 2 can be trained simultaneously using Pennylane (see the appendix). The key point is “Autograd ArrayBox”.

[1\_qubit.py](https://discuss.pennylane.ai/uploads/short-url/s4kiMNCLUMOIn3H9g58y6h7LNAg.py) (887 Bytes)

---

<div class="post-metadata">

**Author:** ![CatalinaAlbornoz](https://yyz2.discourse-cdn.com/flex012/user_avatar/discuss.pennylane.ai/catalinaalbornoz/32/1196_2.png) [@CatalinaAlbornoz](https://discuss.pennylane.ai/u/CatalinaAlbornoz)\
**Post date:** [January 6, 2022, 6:06pm UTC](https://discuss.pennylane.ai/t/training-parameters-in-two-quantum-circuits/1582/5 "2022-01-06T18:06:40Z")

</div>

Hi @Pei-Kun, welcome to the forum!

I’m sorry we took long to answer, we were out on holidays.

I’m glad you could solve your problem.

The reason why you were getting the error “State preparation operation QubitStateVector must occur prior to any quantum operations” is because in your “circ” circuit you were first performing a Y rotation `qml.RY(0,wires=0)` and then you were preparing a state using `qml.QubitStateVector([0,1],wires=0)`. If you want to prepare a state using `QubitStateVector` it needs to be the first thing you do in your circuit.

Please let me know if you still have any unresolved questions!
