File data_analysis/@entanglement_evaluation/trace_out.m changed (mode: 100644) (index 962573b..b457615) |
... |
... |
function ev_traced = trace_out(ev, modes_to_trace, varargin) |
4 |
4 |
% have been traced out. That is for which the interesting quantities |
% have been traced out. That is for which the interesting quantities |
5 |
5 |
% logneg, physicality, covariance matrices have been recalculated appropriately |
% logneg, physicality, covariance matrices have been recalculated appropriately |
6 |
6 |
specify_light_modes = false; |
specify_light_modes = false; |
7 |
|
% if false (default): modes_to_trace are taken to refer to mechanical modes |
|
8 |
|
% ---> light modes to be traced are infered from them |
|
9 |
|
% if false: modes_to_trace are taken to refer directly to the light modes |
|
|
7 |
|
% false (default): modes_to_trace are taken to refer to mechanical modes |
|
8 |
|
% (as specified in ev.mech_frequencies) |
|
9 |
|
% ---> light modes to be traced are infered from modes_to_trace |
|
10 |
|
% true: modes_to_trace are taken to refer directly to the light modes |
|
11 |
|
two_sidebands = false; |
|
12 |
|
% false (default): only trace out the modes specified directly |
|
13 |
|
% true: infer the corresponding modes for the "unintended" sidebands |
|
14 |
|
% (same frequency by inverted sign) |
|
15 |
|
% from the specified modes and trace them out as well |
10 |
16 |
|
|
11 |
|
remaining_args = {varargin{:}}; |
|
|
17 |
|
remaining_args = {}; % feed all unused varargin-arguments to get_shotnoise_ind |
|
18 |
|
rem_args_count = 1; |
12 |
19 |
for k=1:2:length(varargin) |
for k=1:2:length(varargin) |
13 |
20 |
switch lower(varargin{k}) |
switch lower(varargin{k}) |
14 |
21 |
case {'light_modes', 'specify_light_modes'} |
case {'light_modes', 'specify_light_modes'} |
15 |
22 |
specify_light_modes = varargin{k+1}; |
specify_light_modes = varargin{k+1}; |
16 |
|
remaining_args{k} = []; |
|
17 |
|
remaining_args{k+1} = []; |
|
|
23 |
|
case {'two_sidebands'} |
|
24 |
|
two_sidebands = varargin{k+1}; |
18 |
25 |
otherwise |
otherwise |
19 |
|
disp(varargin{k}) |
|
|
26 |
|
remaining_args{rem_args_count} = varargin{k}; |
|
27 |
|
remaining_args{rem_args_count+1} = varargin{k+1}; |
|
28 |
|
rem_args_count = rem_args_count + 2; |
20 |
29 |
end |
end |
21 |
30 |
end |
end |
22 |
|
remaining_args = remaining_args(~cellfun('isempty',remaining_args)); |
|
|
31 |
|
|
|
32 |
|
assert(~(specify_light_modes && two_sidebands),... |
|
33 |
|
'Options "specify_light_modes" and "two_sidebands" cannot be used at the same time.') |
23 |
34 |
|
|
24 |
35 |
ev_traced = ev.copy(); |
ev_traced = ev.copy(); |
25 |
36 |
|
|
|
... |
... |
function ev_traced = trace_out(ev, modes_to_trace, varargin) |
49 |
60 |
'entanglement_evaluation:trace_out:modes_illegit',... |
'entanglement_evaluation:trace_out:modes_illegit',... |
50 |
61 |
'The modes you specified for tracing out do not seem to be legit.'); |
'The modes you specified for tracing out do not seem to be legit.'); |
51 |
62 |
|
|
|
63 |
|
if two_sidebands |
|
64 |
|
freqs_to_trace = ev.mech_frequencies(modes_to_trace); |
|
65 |
|
corresponding_modes = arrayfun(... |
|
66 |
|
@(ind)find(ev.mech_frequencies==-freqs_to_trace(ind)),... |
|
67 |
|
1:length(freqs_to_trace)); |
|
68 |
|
modes_to_trace = [modes_to_trace, corresponding_modes]; |
|
69 |
|
end |
|
70 |
|
|
52 |
71 |
mode_indices_new = setdiff(mode_indices_old, modes_to_trace); |
mode_indices_new = setdiff(mode_indices_old, modes_to_trace); |
|
72 |
|
assert(~isempty(mode_indices_new),... |
|
73 |
|
'entanglement_evaluation:trace_out:no_modes_remaining',... |
|
74 |
|
'You asked me to trace out everything. This will do no good.') |
53 |
75 |
mech_frequencies_new = mech_frequencies_old(mode_indices_new); |
mech_frequencies_new = mech_frequencies_old(mode_indices_new); |
54 |
76 |
|
|
55 |
77 |
ev_traced.mech_frequencies = mech_frequencies_new; |
ev_traced.mech_frequencies = mech_frequencies_new; |
File data_analysis/unittests/entanglement_evaluation_test.m changed (mode: 100644) (index 7d69cc0..a44c3f2) |
... |
... |
function traceout_test(shared) |
811 |
811 |
|
|
812 |
812 |
% ev_traced = ev.trace_out([1]); |
% ev_traced = ev.trace_out([1]); |
813 |
813 |
|
|
|
814 |
|
%% test with two-sideband evaluations |
|
815 |
|
ev = load('.ev.mat'); ev = ev.ev; |
|
816 |
|
% ev.mech_frequencies |
|
817 |
|
% 1.0e+06 * [0.9200 1.0446 -0.9200 -1.0446] |
|
818 |
|
ev_traced = ev.trace_out(1, 'two_sidebands', true); |
|
819 |
|
assertEqual(ev_traced.mech_frequencies, ev.mech_frequencies([2,4])) |
|
820 |
|
ev_traced = ev.trace_out(2, 'two_sidebands', true); |
|
821 |
|
assertEqual(ev_traced.mech_frequencies, ev.mech_frequencies([1,3])) |
|
822 |
|
test_call = @()ev.trace_out([1,2], 'two_sidebands', true); |
|
823 |
|
assertExceptionThrown(test_call,... |
|
824 |
|
'entanglement_evaluation:trace_out:no_modes_remaining') |
|
825 |
|
|
|
826 |
|
|
814 |
827 |
function purity_test(shared) |
function purity_test(shared) |
815 |
828 |
ev = load('.ev.mat'); ev = ev.ev; |
ev = load('.ev.mat'); ev = ev.ev; |
816 |
829 |
ev.calculate_purity; |
ev.calculate_purity; |