Files
@ d99b1ddf4d24
Branch filter:
Location: AENC/switchchain/triangle_canonical_mixingtime.m - annotation
d99b1ddf4d24
5.8 KiB
application/vnd.wolfram.mathematica.package
Add MaTeX plot label to triangle-exponent plot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | 5027d9d4aa05 5027d9d4aa05 2ba81931a724 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 530154e12814 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 5027d9d4aa05 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 5027d9d4aa05 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 2ba81931a724 2ba81931a724 2ba81931a724 2ba81931a724 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 530154e12814 5027d9d4aa05 530154e12814 530154e12814 530154e12814 5027d9d4aa05 530154e12814 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 530154e12814 a4477a81d96d 530154e12814 530154e12814 530154e12814 530154e12814 a4477a81d96d 530154e12814 530154e12814 a4477a81d96d 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 5027d9d4aa05 5027d9d4aa05 530154e12814 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 5027d9d4aa05 530154e12814 530154e12814 530154e12814 2ba81931a724 2ba81931a724 2ba81931a724 a4477a81d96d 530154e12814 530154e12814 530154e12814 530154e12814 2ba81931a724 530154e12814 2ba81931a724 2ba81931a724 2ba81931a724 2ba81931a724 530154e12814 530154e12814 5027d9d4aa05 5027d9d4aa05 530154e12814 530154e12814 5027d9d4aa05 5027d9d4aa05 530154e12814 530154e12814 530154e12814 a4477a81d96d 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 5027d9d4aa05 2ba81931a724 530154e12814 2ba81931a724 a4477a81d96d 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 530154e12814 | (* ::Package:: *)
gsraw=Import[NotebookDirectory[]<>"data/graphdata_canonical_mixingtime_histogram_merged.m"];
gdata=GatherBy[gsraw,{#[[1,2]]&}];
(* Data format: *)
(* gdata[[ tau index, n index, datatype index ]] *)
(* datatype index:
1: {n,tau}
2: { {time1, {samples1}}, {time2, {samples2}} , ... } samples can also be a HistogramList kind of list
3: {uniform samples}
*)
(*Histogram[histogramdata[[All,2]],Automatic,"Probability",ChartLegends\[Rule]histogramdata[[All,1]]]*)
makeHistogram[run_,plotrange_,choices_]:=Module[{gridsize,labels,wd,uni},
uni=WeightedData[run[[3,All,1]],run[[3,All,2]]];(* Only in case of histogram-type file input *)
gridsize=Max[1,Mean[uni]/100];
labels="t = "<>ToString[NumberForm[N[#/run[[1,1]]],{3,1}]]<>" n"&/@run[[2,choices,1]];
wd=run[[2,choices,2]];
wd=Map[WeightedData[#[[All,1]],#[[All,2]]]&,wd];(* Only in case of histogram-type file input *)
Show[
SmoothHistogram[wd,gridsize,
PlotRange->plotrange,
PlotLegends->Placed[labels,Scaled[{0.7,0.7}]],
Epilog->Text["n = "<>ToString[run[[1,1]]]<>", \[Tau] = "<>ToString[run[[1,2]]],Scaled[{0.15,0.95}]],
ImageSize->300,
Frame->True,
FrameLabel->{"triangles","probability"}
],
SmoothHistogram[uni,gridsize,PlotRange->plotrange,PlotLegends->Placed[{"uniform"},Scaled[{0.7,0.7}]],PlotStyle->{Thick,Black}]]]
normalize[h_]:=Transpose[{h[[All,1]],h[[All,2]]/Total[h[[All,2]]]}];
makeHistogram2[run_,plotrange_,choices_]:=Module[{gridsize,labels,uni,probs},
uni=WeightedData[run[[3,All,1]],run[[3,All,2]]];(* Only in case of histogram-type file input *)
labels="t = "<>ToString[NumberForm[N[#/run[[1,1]]],{3,1}]]<>" n"&/@run[[2,choices,1]];
probs=run[[2,choices,2]];
probs=Map[normalize,probs];
Show[
ListPlot[probs,Joined->True,
PlotRange->plotrange,
PlotLegends->Placed[labels,Scaled[{0.7,0.7}]],
Epilog->Text["n = "<>ToString[run[[1,1]]]<>", \[Tau] = "<>ToString[run[[1,2]]],Scaled[{0.15,0.95}]],
ImageSize->300,
Frame->True,
FrameLabel->{"triangles","probability"}
],
ListPlot[normalize[run[[3]]],Joined->True,PlotRange->plotrange,PlotLegends->Placed[{"uniform"},Scaled[{0.7,0.7}]],PlotStyle->{Thick,Black}]]]
plot1=makeHistogram[gdata[[1,5]],{{3500,7800},{0,0.005}},{10,50,100}]
plot2=makeHistogram2[gdata[[3,5]],{{50,300},{0,0.04}},{10,20,30}]
plot3=makeHistogram2[gdata[[5,5]],{{0,70},{0,0.18}},{5,10,20}]
plot4=makeHistogram[gdata[[1,-1]],Automatic,{50,100,150,200}]
Export[NotebookDirectory[]<>"plots/triangle_distributions_over_time.pdf",plot2]
(* ::Section:: *)
(*Total variation distance*)
(* Get some sort of total variation distance between to sets of samples *)
getTVDistance1[samples1_,samples2_]:=Module[{max,probs1,probs2,binsize},
max=Max[Max[samples1],Max[samples2]];
binsize=Max[1,Floor[Mean[samples2]/500]];
binsize=1;
probs1=BinCounts[samples1,{0,max+binsize,binsize}];
probs1=probs1/Total[probs1];
probs2=BinCounts[samples2,{0,max+binsize,binsize}];
probs2=probs2/Total[probs2];
Total[Abs[probs1-probs2]]/2
]
(* Get some sort of total variation distance between to HistogramList-like objects *)
getTVDistance2[hist1_,hist2_,filterradius_]:=Module[{m,M,probs,probs1,probs2},
m=Min[hist1[[1,1]],hist2[[1,1]]];
M=Max[hist1[[-1,1]],hist2[[-1,1]]];
probs=ConstantArray[0,M-m+1];
probs1=hist1[[All,2]];
If[filterradius>1,probs1=GaussianFilter[probs1,10]]; (* test *)
probs1=probs1/Total[probs1];
probs2=hist2[[All,2]];
If[filterradius>1,probs2=GaussianFilter[probs2,10]]; (* test *)
probs2=probs2/Total[probs2];
probs[[1+hist1[[1,1]]-m;;1+hist1[[-1,1]]-m]]+=probs1;
probs[[1+hist2[[1,1]]-m;;1+hist2[[-1,1]]-m]]-=probs2;
Total[Abs[probs]]/2
]
(* ::Subsection:: *)
(*Plots*)
(*getRatios[run_]:=Module[{avg,sd,scalefactor},
avg=Mean[run[[3]]];
sd=StandardDeviation[run[[3]]];
scalefactor=1/(run[[1,1]]*Log[2,run[[1,1]]]^(1*(4-run[[1,2]])));
{"n,tau = "<>ToString[run[[1]]],
Map[{#[[1]]*scalefactor,Mean[#[[2]]]/avg}&,run[[2]]],
Map[{#[[1]]*scalefactor,(Mean[#[[2]]]-avg)/sd}&,run[[2]]],
}
]
ratios=Map[getRatios,gdata,{2}];
(*Map[ListPlot[#[[All,2]],Joined->True,PlotMarkers->Automatic,PlotRange->(1+{-0.15,+0.15}),PlotLegends->#[[All,1]],ImageSize->300]&,ratios]*)
(*Map[ListPlot[#[[All,3]],Joined->True,PlotMarkers->Automatic,PlotRange->(0+{-1,+1}),PlotLegends->#[[All,1]],ImageSize->300]&,ratios]*)
*)
getTVDs[run_]:=Module[{scaling},
scaling[step_,n_,tau_]:=step/(n*Log[n]^(4-tau));
{"n = "<>ToString[run[[1,1]]],"\[Tau] = "<>ToString[run[[1,2]]],
Map[{scaling[#[[1]],run[[1,1]],run[[1,2]]],getTVDistance2[#[[2]],run[[3]],30]}&,run[[2]]]}
]
TVDs=Map[getTVDs,gdata,{2}];
Map[Show[ListPlot[#[[All,3]],
Joined->True,(*PlotMarkers->Automatic,*)
PlotLegends->Placed[#[[All,1]],Center],ImageSize->500,
PlotRange->{0,1},Frame->True,FrameLabel->{"steps / (n (\!\(\*SubscriptBox[\(log\), \(2\)]\)n\!\(\*SuperscriptBox[\()\), \(4 - \[Tau]\)]\))","TV distance"},
PlotLabel->#[[1,2]]
],
Plot[{0.1,0.05},{x,0,20},PlotStyle->Directive[Black,Dashed]]
]&,TVDs]
(* ::Subsection:: *)
(*Mixing time from TV distance*)
getMixingTime[run_]:=Module[{i=1,timestamp=0,prevtimestamp=0},
While[i<=Length[run[[2]]],
timestamp=run[[2,i,1]];
If[getTVDistance2[run[[2,i,2]],run[[3]],20]<=0.1,
Break[];
];
prevtimestamp=timestamp;
i++;
];
{run[[1,1]],run[[1,2]],prevtimestamp, timestamp} (* Range in which mixingtime lies *)
]
mixingtimes=Map[getMixingTime,gdata,{2}];
scaling[n_,tau_]:=n*Log[2,n]^(4-tau);
scaling[n_,tau_]:=n;
scaling[n_,tau_]:=n*Log[2,n]^1.5;
plotData=Map[{#[[1]],#[[4]]/scaling[#[[1]],#[[2]]]}&,mixingtimes,{2}]~Join~Map[{#[[1]],#[[3]]/scaling[#[[1]],#[[2]]]}&,mixingtimes,{2}];
fillings={1->{6},2->{7},3->{8},4->{9},5->{10}};
taulabels=Map["\[Tau] = "<>ToString[#[[1,2]]]&,mixingtimes];
ListPlot[plotData,
Joined->True,PlotMarkers->Automatic,ImageSize->500,
PlotRange->All,
PlotLegends->taulabels,
Filling->fillings,PlotStyle->{Automatic,Automatic,Automatic,Automatic,Automatic,None,None,None,None,None},
Frame->True,FrameLabel->{"n","ETMT / n"}]
|