Spin-up/spin-down measurement probabilities on rotated qubit

In[]:=
Pu[θ_]:=
2
Cos
θ
2

;Pd[θ_]:=1-Pu[θ]
In[]:=
FullSimplify[Pu[θ]+Pd[θ]]
Out[]=
1

Discretize rotation angles

In[]:=
theta=Tableθ,θ,
π
20
,π,
π
20

Out[]=

π
20
,
π
10
,
3π
20
,
π
5
,
π
4
,
3π
10
,
7π
20
,
2π
5
,
9π
20
,
π
2
,
11π
20
,
3π
5
,
13π
20
,
7π
10
,
3π
4
,
4π
5
,
17π
20
,
9π
10
,
19π
20
,π

Form One-hot vectors from grid theta values

In[]:=
numBins=Length[theta];​​binToOneHot[bins_List,totalBins_Integer]:=Table[If[i==#,1,0],{i,1,totalBins}]&/@bins​​bins=Range[numBins];​​oneHotEncoded=binToOneHot[bins,Length[theta]]

Evaluate measurement probabilities for each grid theta value

In[]:=
pr=TableList[N[FullSimplify[Re[Pu[θ]]]],N[FullSimplify[Re[Pd[θ]]]]],θ,
π
20
,π,
π
20


Generate measurement outcomes for each
θ
j
(with random number generator)

Number of measurements for each
θ
j
:
In[]:=
m=10;
In[]:=
meas=Table[{},{Length[pr]}];​​Table[Do[b=ConstantArray[0,1];Clear[r];​​updateTally[]:=Block[{r},r=RandomReal[];​​If[r<pr[[j]][[1]],b[[1]]+=1,If[pr[[j]][[1]]<=r<pr[[j]][[1]]+pr[[j]][[2]],b[[1]]+=0]]];​​Do[updateTally[],{1}];AppendTo[meas[[j]],b],{i,1,m}],{j,Length[pr]}];
In[]:=
meas=Partition[Flatten[meas],10]
In[]:=
trainingData=Rule@@@Transpose[{meas,oneHotEncoded}]

Neural network architecture

In[]:=
net=NetChain[{LinearLayer[4],ElementwiseLayer["ReLU"],LinearLayer[20],SoftmaxLayer[]}];

Training the network

In[]:=
trainedNet=NetTrain[net,trainingData,MaxTrainingRounds->1]
NetTrain
:Batch #1 will be skipped, because one or or more inputs provided to port Output was invalid: input is not an integer between 1 and 20. This batch will be ignored in subsequent training rounds. More information can be obtained via the SkippedTrainingData property.
Out[]=
NetChain
Inputport:
vector(size: 10)
Outputport:
vector(size: 20)


Generate a set of test measurements (with random number generator)

In[]:=
(*trainedNet/@meas*)