Skip to content

Commit ddf351d

Browse files
committed
Cummulative update:
* Rewrote moduleParser to give clear error messages and support multiple validation functions when adding a parameter. All examples updated to use this. * Fixed a bug with Coherent.beamSplitter where it was missing a negative sign. * New experimental global optimization routine, directSearchOptimization. * Added passive threshold click detectors to the Coherent channel tools. * Cleaned up various documentation blocks. * Added new validation functions for compatible array sizes for elementwise operations.
1 parent 7cde84a commit ddf351d

File tree

24 files changed

+908
-314
lines changed

24 files changed

+908
-314
lines changed

BasicProtocols/BasicBB84Alice2D/BasicBB84Alice2DChannelFunc.m

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,19 @@
5555
modParser = moduleParser(mfilename);
5656
modParser.addRequiredParam("observablesJoint",@(x) allCells(x,@ishermitian));
5757

58-
modParser.addRequiredParam("dimA",@(x) x==2); %Sanity checks
59-
modParser.addRequiredParam("dimB", @(x) x ==2);
60-
61-
modParser.addOptionalParam("depolarization",0,@(x) mustBeInRange(x,0,1));
62-
modParser.addOptionalParam("misalignmentAngle",0,@(x) mustBeReal(x));
58+
modParser.addRequiredParam("dimA",...
59+
@isscalar,...
60+
@(x) x==2); %Sanity checks
61+
modParser.addRequiredParam("dimB", ...
62+
@isscalar,...
63+
@(x) x ==2); %Sanity checks
64+
65+
modParser.addOptionalParam("depolarization",0, ...
66+
@isscalar, ...
67+
@(x) mustBeInRange(x,0,1));
68+
modParser.addOptionalParam("misalignmentAngle",0, ...
69+
@isscalar, ...
70+
@mustBeReal);
6371

6472
modParser.addAdditionalConstraint(@observablesAndDimensionsMustBeTheSame,["observablesJoint","dimA","dimB"]);
6573

BasicProtocols/BasicBB84Alice2D/BasicBB84Alice2DDescriptionFunc.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@
5353

5454
%% module parser
5555
modParser = moduleParser(mfilename);
56-
modParser.addRequiredParam("pz",@(x) mustBeInRange(x,0,1));
56+
modParser.addRequiredParam("pz",...
57+
@isscalar,...
58+
@(x) mustBeInRange(x,0,1));
5759
modParser.parse(params)
5860
params = modParser.Results;
5961

BasicProtocols/BasicBB84Alice2DFinite/BasicBB84Alice2DFiniteKeyRateFunc.m

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,33 +68,56 @@
6868
modParser.addRequiredParam("keyProj", @(x) mustBeAKeyProj(x));
6969

7070

71-
modParser.addRequiredParam("dimA",@mustBeInteger);
72-
modParser.addRequiredParam("dimB", @mustBeInteger);
73-
modParser.addAdditionalConstraint(@mustBePositive,"dimA")
74-
modParser.addAdditionalConstraint(@mustBePositive,"dimB")
71+
modParser.addRequiredParam("dimA",...
72+
@isscalar,...
73+
@mustBeInteger,...
74+
@mustBePositive);
75+
modParser.addRequiredParam("dimB",...
76+
@isscalar,...
77+
@mustBeInteger,...
78+
@mustBePositive);
7579
modParser.addAdditionalConstraint(@observablesAndDimensionsMustBeTheSame,["observablesJoint","dimA","dimB"])
7680

7781
modParser.addRequiredParam("announcementsA")
7882
modParser.addRequiredParam("announcementsB")
7983
modParser.addRequiredParam("keyMap",@(x)mustBeA(x,"KeyMapElement"))
8084

81-
modParser.addRequiredParam("fEC", @(x) mustBeGreaterThanOrEqual(x,1));
85+
modParser.addRequiredParam("fEC", ...
86+
@isscalar, ...
87+
@(x) mustBeGreaterThanOrEqual(x,1));
8288
modParser.addOptionalParam("rhoA", nan, @(x) isequaln(x,nan) || isDensityOperator(x));
83-
modParser.addRequiredParam("alphabetSize", @(x) mustBeInteger(x));
89+
modParser.addRequiredParam("alphabetSize", ...
90+
@isscalar, ...
91+
@mustBePositive, ...
92+
@mustBeInteger);
8493

8594

8695

8796
%% finite key analysis parameters
88-
modParser.addRequiredParam("numSignals", @(x) mustBeGreaterThan(x, 0));
89-
modParser.addRequiredParam("pTest", @(x) mustBeInRange(x, 0, 1));
90-
91-
modParser.addRequiredParam("epsilonBar", @(x) mustBeGreaterThan(x,0));
92-
modParser.addRequiredParam("epsilonPE", @(x) mustBeGreaterThan(x,0));
93-
modParser.addRequiredParam("epsilonEC", @(x) mustBeGreaterThan(x,0));
94-
modParser.addRequiredParam("epsilonPA", @(x) mustBeGreaterThan(x,0));
95-
96-
97-
modParser.addRequiredParam("tExp", @(x) mustBeLessThanOrEqual(x, 0) );
97+
modParser.addRequiredParam("numSignals", ...
98+
@isscalar, ...
99+
@mustBePositive);
100+
modParser.addRequiredParam("pTest", ...
101+
@isscalar, ...
102+
@(x) mustBeInRange(x, 0, 1));
103+
104+
modParser.addRequiredParam("epsilonBar", ...
105+
@isscalar, ...
106+
@mustBePositive);
107+
modParser.addRequiredParam("epsilonPE", ...
108+
@isscalar, ...
109+
@mustBePositive);
110+
modParser.addRequiredParam("epsilonEC", ...
111+
@isscalar, ...
112+
@mustBePositive);
113+
modParser.addRequiredParam("epsilonPA", ...
114+
@isscalar, ...
115+
@mustBePositive);
116+
117+
118+
modParser.addRequiredParam("tExp", ...
119+
@isscalar, ...
120+
@mustBeNonpositive);
98121

99122

100123
modParser.addOptionalParam("blockDimsA", nan);

BasicProtocols/BasicBB84Alice4D/BasicBB84Alice4DChannelFunc.m

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,23 @@
5151

5252
modParser = moduleParser(mfilename);
5353
modParser.addRequiredParam("observablesJoint",@(x) allCells(x,@ishermitian));
54-
modParser.addRequiredParam("pz", @(x) mustBeInRange(x,0,1));
55-
56-
modParser.addRequiredParam("dimA",@(x) x==4); %Sanity checks
57-
modParser.addRequiredParam("dimB", @(x) x ==2);
58-
59-
modParser.addOptionalParam("depolarization",0,@(x) mustBeInRange(x,0,1));
60-
modParser.addOptionalParam("misalignmentAngle",0,@(x) mustBeReal(x));
54+
modParser.addRequiredParam("pz", ...
55+
@isscalar, ...
56+
@(x) mustBeInRange(x,0,1));
57+
58+
modParser.addRequiredParam("dimA", ...
59+
@isscalar, ...
60+
@(x) x==4); %Sanity checks
61+
modParser.addRequiredParam("dimB", ...
62+
@isscalar, ...
63+
@(x) x ==2); %Sanity checks
64+
65+
modParser.addOptionalParam("depolarization",0, ...
66+
@isscalar, ...
67+
@(x) mustBeInRange(x,0,1));
68+
modParser.addOptionalParam("misalignmentAngle",0, ...
69+
@isscalar, ...
70+
@mustBeReal);
6171

6272
modParser.addAdditionalConstraint(@observablesAndDimensionsMustBeTheSame,["observablesJoint","dimA","dimB"]);
6373

BasicProtocols/BasicBB84Alice4D/BasicBB84Alice4DDescriptionFunc.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@
5151

5252
%% module parser
5353
modParser = moduleParser(mfilename);
54-
modParser.addRequiredParam("pz",@(x) mustBeInRange(x,0,1));
54+
modParser.addRequiredParam("pz", ...
55+
@isscalar, ...
56+
@(x) mustBeInRange(x,0,1));
5557
modParser.parse(params)
5658
params = modParser.Results;
5759

BasicProtocols/BasicBB84Lossy/BasicBB84LossyChannelFunc.m

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,22 @@
5050
%% module parser
5151
modParser = moduleParser(mfilename);
5252
modParser.addRequiredParam("observablesJoint",@(x) allCells(x,@ishermitian))
53-
modParser.addRequiredParam("dimA",@(x) x==2);
54-
modParser.addRequiredParam("dimB", @(x) x ==3);
55-
56-
modParser.addOptionalParam("transmittance", 1, @(x) mustBeInRange(x, 0, 1));
57-
modParser.addOptionalParam("depolarization",0,@(x) mustBeInRange(x,0,1));
58-
modParser.addOptionalParam("misalignmentAngle",0,@(x) mustBeReal(x));
53+
modParser.addRequiredParam("dimA", ...
54+
@isscalar, ...
55+
@(x) x==2);
56+
modParser.addRequiredParam("dimB", ...
57+
@isscalar, ...
58+
@(x) x ==3);
59+
60+
modParser.addOptionalParam("transmittance", 1, ...
61+
@isscalar, ...
62+
@(x) mustBeInRange(x, 0, 1));
63+
modParser.addOptionalParam("depolarization",0, ...
64+
@isscalar, ...
65+
@(x) mustBeInRange(x,0,1));
66+
modParser.addOptionalParam("misalignmentAngle",0, ...
67+
@isscalar, ...
68+
@mustBeReal);
5969

6070
modParser.addAdditionalConstraint(@observablesAndDimensionsMustBeTheSame,["observablesJoint","dimA","dimB"]);
6171

BasicProtocols/BasicBB84Lossy/BasicBB84LossyDescriptionFunc.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@
5454
%% module parser
5555
%Parsing parameters for the module
5656
modParser = moduleParser(mfilename);
57-
modParser.addRequiredParam("pz",@(x) mustBeInRange(x,0,1));
57+
modParser.addRequiredParam("pz", ...
58+
@isscalar, ...
59+
@(x) mustBeInRange(x,0,1));
5860
modParser.parse(params)
5961
params = modParser.Results;
6062

BasicProtocols/BasicBB84WCPDecoy/BasicBB84WCPDecoyChannelFunc.m

Lines changed: 38 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -56,29 +56,30 @@
5656
modParser = moduleParser(mfilename);
5757

5858
%Decoy intensities
59-
modParser.addRequiredParam("decoys", @(x) mustBeCellOf(x, 'numeric'));
60-
modParser.addAdditionalConstraint(@(x) allCells(x,@isscalar),"decoys");
61-
modParser.addAdditionalConstraint(@(x) allCells(x,@(y) y>=0),"decoys");
62-
59+
modParser.addRequiredParam("decoys", ...
60+
@(x) mustBeCellOf(x, 'numeric'), ...
61+
@(x) allCells(x,@isscalar), ...
62+
@(x) allCells(x,@(y) y>=0));
6363
%Z-basis choice
64-
modParser.addRequiredParam("pz", @(x) mustBeInRange(x, 0, 1));
65-
modParser.addAdditionalConstraint(@isscalar,"pz");
66-
64+
modParser.addRequiredParam("pz", ...
65+
@isscalar, ...
66+
@(x) mustBeInRange(x, 0, 1));
6767
%Channel loss
68-
modParser.addOptionalParam("transmittance", 1, @(x) mustBeInRange(x, 0, 1));
69-
modParser.addAdditionalConstraint(@isscalar,"transmittance");
70-
68+
modParser.addOptionalParam("transmittance", 1, ...
69+
@isscalar, ...
70+
@(x) mustBeInRange(x, 0, 1));
7171
%Detector efficiency
72-
modParser.addOptionalParam("detectorEfficiency", 1, @(x) mustBeInRange(x, 0, 1));
73-
modParser.addAdditionalConstraint(@isscalar,"detectorEfficiency");
74-
72+
modParser.addOptionalParam("detectorEfficiency", 1, ...
73+
@isscalar, ...
74+
@(x) mustBeInRange(x, 0, 1));
7575
%Misalingment angle
76-
modParser.addOptionalParam("misalignmentAngle",0,@mustBeReal);
77-
modParser.addAdditionalConstraint(@isscalar,"misalignmentAngle");
78-
76+
modParser.addOptionalParam("misalignmentAngle",0, ...
77+
@isscalar, ...
78+
@mustBeReal);
7979
%Darkcount rate
80-
modParser.addOptionalParam("darkCountRate", 0, @(x) mustBeInRange(x, 0, 1));
81-
modParser.addAdditionalConstraint(@isscalar,"darkCountRate");
80+
modParser.addOptionalParam("darkCountRate", 0, ...
81+
@iscolumn, ...
82+
@(x) mustBeInRange(x, 0, 1));
8283

8384
modParser.parse(params);
8485

@@ -89,27 +90,33 @@
8990

9091
% we will use an intensity of 1 for now as we can scale that up after the
9192
% fact.
92-
signals = {Coherent.pauliCoherentState(1,1,1);... %H
93-
Coherent.pauliCoherentState(1,1,2);... %V
94-
Coherent.pauliCoherentState(1,2,1);... %D
95-
Coherent.pauliCoherentState(1,2,2)}; %A
93+
signals = [Coherent.pauliCoherentState(1,1,1),... %H
94+
Coherent.pauliCoherentState(1,1,2),... %V
95+
Coherent.pauliCoherentState(1,2,1),... %D
96+
Coherent.pauliCoherentState(1,2,2)]; %A
9697

9798
% build the (sub) isometry transition matrix that represents the channel
9899
% and Bob's measurement except for the dark counts which must be handled
99100
% later.
100-
transMat = simpleBB84LinearOpticsSetup(params.transmittance,params.misalignmentAngle,params.detectorEfficiency,params.pz);
101+
transMat = simpleBB84LinearOpticsSetup(params.transmittance,...
102+
params.misalignmentAngle,params.detectorEfficiency,params.pz);
101103
debugInfo.storeInfo("transMat",transMat);
102104

105+
% transform signals by the passive optics network.
106+
signals = transMat*signals;
107+
108+
% each signal can also be sent with different intensities
109+
signals = signals.*reshape(sqrt(cell2mat(params.decoys)),1,1,[]);
110+
111+
probEachDetectorClickCon = Coherent.thresholdClickProbabilities(signals,params.darkCountRate);
112+
expectationsCon = Coherent.passiveThresholdClickPatternProbabilities(probEachDetectorClickCon);
113+
114+
% we prefer to order the dimensions [signal polarization,
115+
% detectorProb/pattern prob, signal intensity]
116+
probEachDetectorClickCon = pagetranspose(probEachDetectorClickCon);
117+
expectationsCon = pagetranspose(expectationsCon);
103118

104-
%Calculate the conditional probabilities for the click patterns
105-
probEachDetectorClickCon = zeros(numel(signals),size(transMat,1),numel(params.decoys));
106-
expectationsCon = zeros(numel(signals),2^size(transMat,1),numel(params.decoys));
107119

108-
for index = 1:numel(params.decoys)
109-
%scale the signal states for the intensity
110-
signalsDecoy = cellfun(@(x) sqrt(params.decoys{index})*x,signals,"UniformOutput",false);
111-
[expectationsCon(:,:,index), probEachDetectorClickCon(:,:,index)] = simulateChannel(signalsDecoy,transMat,params.darkCountRate);
112-
end
113120
debugInfo.storeInfo("probEachDetectorClickCon",probEachDetectorClickCon);
114121

115122
newParams.expectationsConditional = expectationsCon;
@@ -144,50 +151,4 @@
144151
% each detector, so no changes here.
145152

146153
transMat = detectorMat*channelMat;
147-
end
148-
149-
function probDetectorClickCon = applyDarkCounts(probDetectorClickCon,darkCountRate)
150-
probDetectorClickCon = 1-(1-probDetectorClickCon)*(1-darkCountRate);
151-
end
152-
153-
function [probDetectorClickPatternCon, probEachDetectorClicksCon] = simulateChannel(signals,transMat,darkCountRate)
154-
%Construct the independent detector click probabilities for each signal
155-
probEachDetectorClicksCon = detectorClickProbabilities(signals,transMat);
156-
%simulate the effects of dark counts
157-
probEachDetectorClicksCon = applyDarkCounts(probEachDetectorClicksCon,darkCountRate);
158-
%Construct all combinations of detector firing patterns from the
159-
%independent detectors.
160-
probDetectorClickPatternCon = detectorClickPatterns(probEachDetectorClicksCon);
161-
end
162-
163-
164-
165-
function probDetectorClickCon = detectorClickProbabilities(signals,transMat)
166-
167-
probDetectorClickCon = zeros(numel(signals),size(transMat,1));
168-
169-
for index = 1:numel(signals)
170-
bobsSignal = transMat*signals{index};
171-
probDetectorClickCon(index,:) = 1-Coherent.fockCoherentProb(zeros(size(transMat,1),1),bobsSignal,"combineModes",false);
172-
end
173-
end
174-
175-
176-
function probDetectorClickPatternCon = detectorClickPatterns(probClickCon)
177-
%Because we have coherent states, each detector acts independently. This
178-
%function takes the independent results from each detector and computes the
179-
%probabilities of each click pattern outcome.
180-
numSignals = size(probClickCon,1);
181-
numDetectors = size(probClickCon,2);
182-
183-
probDetectorClickPatternCon = zeros(numSignals,2^numDetectors);
184-
185-
sizeDetectorPatterns = 2*ones(1,numDetectors);
186-
clickProbSwitch = @(click, clickProb) (click==0).*(1-clickProb) + (click~=0).*clickProb;
187-
for signalIndex = 1:numSignals
188-
for indexPat = 1:2^numDetectors
189-
patternVec = ind2subPlus(sizeDetectorPatterns,indexPat)-1;
190-
probDetectorClickPatternCon(signalIndex,indexPat) = prod(clickProbSwitch(patternVec,probClickCon(signalIndex,:)));
191-
end
192-
end
193154
end

BasicProtocols/BasicBB84WCPDecoy/BasicBB84WCPDecoyKeyRateFunc.m

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,18 @@
6363

6464
%% options parser
6565
optionsParser = makeGlobalOptionsParser(mfilename);
66-
optionsParser.addOptionalParam("decoyTolerance",1e-14,@(x) x>=0);
67-
optionsParser.addOptionalParam("decoySolver","SDPT3");
68-
optionsParser.addOptionalParam("decoyPrecision","high");
69-
optionsParser.addOptionalParam("decoyForceSep",false, @islogical);
70-
optionsParser.addOptionalParam("decoyPhotonCutOff",10,@(x)mustBeInteger(x));
71-
optionsParser.addAdditionalConstraint(@(x) x>0,"decoyPhotonCutOff");
66+
optionsParser.addOptionalParam("decoyTolerance",1e-14,...
67+
@isscalar,...
68+
@mustBeNonnegative);
69+
optionsParser.addOptionalParam("decoySolver","SDPT3", @isStringScalar);
70+
optionsParser.addOptionalParam("decoyPrecision","high", @isStringScalar);
71+
optionsParser.addOptionalParam("decoyForceSep",false,...
72+
@isscalar,...
73+
@islogical);
74+
optionsParser.addOptionalParam("decoyPhotonCutOff",10, ...
75+
@isscalar, ...
76+
@(x)mustBeInteger(x), ...
77+
@mustBePositive);
7278
optionsParser.parse(options);
7379
options = optionsParser.Results;
7480

@@ -86,17 +92,23 @@
8692
modParser.addRequiredParam("krausOps", @isCPTNIKrausOps);
8793
modParser.addRequiredParam("keyProj", @(x) mustBeAKeyProj(x));
8894

89-
modParser.addRequiredParam("dimA",@mustBeInteger);
90-
modParser.addRequiredParam("dimB", @mustBeInteger);
91-
modParser.addAdditionalConstraint(@mustBePositive,"dimA")
92-
modParser.addAdditionalConstraint(@mustBePositive,"dimB")
95+
modParser.addRequiredParam("dimA",...
96+
@isscalar,...
97+
@mustBeInteger,...
98+
@mustBePositive);
99+
modParser.addRequiredParam("dimB",...
100+
@isscalar,...
101+
@mustBeInteger,...
102+
@mustBePositive);
93103
modParser.addAdditionalConstraint(@observablesAndDimensionsMustBeTheSame,["observablesJoint","dimA","dimB"])
94104

95105
modParser.addRequiredParam("announcementsA")
96106
modParser.addRequiredParam("announcementsB")
97107
modParser.addRequiredParam("keyMap",@(x)mustBeA(x,"KeyMapElement"))
98108

99-
modParser.addRequiredParam("fEC", @(x) mustBeGreaterThanOrEqual(x,1));
109+
modParser.addRequiredParam("fEC",...
110+
@isscalar,...
111+
@(x) mustBeGreaterThanOrEqual(x,1));
100112

101113
modParser.addOptionalParam("rhoA", nan, @(x) isequaln(x,nan) || isDensityOperator(x));
102114

0 commit comments

Comments
 (0)