Changeset - 30d182b86860
[Not reviewed]
0 4 1
Tom Bannink - 8 years ago 2017-08-21 17:49:26
tom.bannink@cwi.nl
Add better construction successrate measurement
5 files changed with 186 insertions and 8 deletions:
0 comments (0 inline, 0 general)
cpp/Makefile
Show inline comments
 
#CXX=clang++
 

	
 
INCLUDES += -I. \
 
			-I/usr/include/eigen3
 

	
 
CXXFLAGS += -std=c++14 -O3
 
CXXFLAGS += -Wall -Wextra -Wfatal-errors -Werror -pedantic -Wno-deprecated-declarations
 
CXXFLAGS += $(INCLUDES)
 
# Disable Eigen's debug info and disable a warning generated by Eigen
 
CXXFLAGS += -DNDEBUG
 
CXXFLAGS += -Wno-int-in-bool-context
 

	
 
TARGETS += switchchain
 
TARGETS += switchchain_canonical_properties
 
TARGETS += switchchain_ccm_constructionrate
 
TARGETS += switchchain_ccm_cputime
 
TARGETS += switchchain_ccm_initialtris
 
TARGETS += switchchain_ccm_timeevol
 
TARGETS += switchchain_properties
 
TARGETS += switchchain_exponent
 
TARGETS += switchchain_mixingtime
 
TARGETS += switchchain_spectrum
 
TARGETS += switchchain_successrates
 
TARGETS += switchchain_timeevol
 
TARGETS += bruteforce_triangles
 

	
 
all: $(TARGETS)
 

	
 
clean:
 
	rm -f $(TARGETS)
 

	
 
# target : dep1 dep2 dep3
 
# 	$@ = target
 
# 	$< = dep1
 
# 	$^ = dep1 dep2 dep3
cpp/switchchain_ccm_constructionrate.cpp
Show inline comments
 
new file 100644
 
#include "exports.hpp"
 
#include "graph.hpp"
 
#include "graph_ccm.hpp"
 
#include "graph_powerlaw.hpp"
 
#include "switchchain.hpp"
 
#include <algorithm>
 
#include <fstream>
 
#include <iostream>
 
#include <numeric>
 
#include <random>
 
#include <vector>
 

	
 
int main(int argc, char* argv[]) {
 
    // Simulation parameters
 
    const int numVerticesMin = 1000;
 
    const int numVerticesMax = 1000;
 
    const int numVerticesStep = 500;
 

	
 
    //float tauValues[] = {2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};
 
    float tauValues[] = {2.1f, 2.5f, 2.9f};
 

	
 
    const int totalDegreeSamples = 5000;
 
    const int ccmConstructionAttemps = 200;
 

	
 
    // Output file
 
    std::ofstream outfile;
 
    if (argc >= 2)
 
        outfile.open(argv[1]);
 
    else
 
        outfile.open("graphdata_ccm_constructionrate.m");
 
    if (!outfile.is_open()) {
 
        std::cout << "ERROR: Could not open output file.\n";
 
        return 1;
 
    }
 

	
 
    // Output Mathematica-style comment to indicate file contents
 
    outfile << "(*\n";
 
    outfile << "n from " << numVerticesMin << " to " << numVerticesMax
 
            << " step " << numVerticesStep << std::endl;
 
    outfile << "tauValues: " << tauValues << std::endl;
 
    outfile << "degreeSamples: " << totalDegreeSamples << std::endl;
 
    outfile << "mixingTime: -\n";
 
    outfile << "measurements: -\n";
 
    outfile << "measureSkip: -\n";
 
    outfile << "ccm construction attemps: " << ccmConstructionAttemps << std::endl;
 
    outfile << "data:\n";
 
    outfile << "1: {n,tau}\n";
 
    outfile << "3: CCMdu construction rate \n";
 
    outfile << "4: CCMd construction rate \n";
 
    outfile << "*)" << std::endl;
 
 
 
    // Mathematica does not accept normal scientific notation
 
    outfile << std::fixed;
 
    outfile << '{';
 
    bool outputComma = false;
 

	
 
    std::mt19937 rng(std::random_device{}());
 
    Graph g;
 
    for (int numVertices = numVerticesMin; numVertices <= numVerticesMax;
 
         numVertices += numVerticesStep) {
 
        for (float tau : tauValues) {
 
            // For a single n,tau take samples over several instances of
 
            // the degree distribution.
 
            for (int degreeSample = 0; degreeSample < totalDegreeSamples;
 
                 ++degreeSample) {
 
                DegreeSequence ds;
 
                generatePowerlawGraph(numVertices, tau, g, ds, rng);
 

	
 
                std::cout << "Running (n,tau) = (" << numVertices << ',' << tau
 
                          << "). " << std::flush;
 

	
 
                //
 
                // Test the GCM1 and GCM2 success rate
 
                //
 
                int successrate1 = 0;
 
                int successrate2 = 0;
 
                for (int i = 0; i < ccmConstructionAttemps; ++i) {
 
                    Graph gtemp;
 
                    // Take new highest degree every time
 
                    if (constrainedConfigurationModel(ds, gtemp, rng, false)) {
 
                        ++successrate1;
 
                    }
 
                    // Finish all pairings of highest degree first
 
                    if (constrainedConfigurationModel(ds, gtemp, rng, true)) {
 
                        ++successrate2;
 
                    }
 
                }
 

	
 
                std::cout << "Done." << std::flush;
 

	
 
                if (outputComma)
 
                    outfile << ',' << '\n';
 
                outputComma = true;
 

	
 
                outfile << '{';
 
                outfile << '{' << numVertices << ',' << tau << '}';
 
                outfile << ',' << float(successrate1)/float(ccmConstructionAttemps);
 
                outfile << ',' << float(successrate2)/float(ccmConstructionAttemps);
 
                outfile << '}' << std::flush;
 

	
 
                std::cout << std::endl;
 
            }
 
        }
 
    }
 
    outfile << '}';
 
    return 0;
 
}
cpp/switchchain_ccm_initialtris.cpp
Show inline comments
 
#include "exports.hpp"
 
#include "graph.hpp"
 
#include "graph_ccm.hpp"
 
#include "graph_powerlaw.hpp"
 
#include "switchchain.hpp"
 
#include <algorithm>
 
#include <fstream>
 
#include <iostream>
 
#include <numeric>
 
#include <random>
 
#include <vector>
 

	
 
int main(int argc, char* argv[]) {
 
    // Simulation parameters
 
    const int numVerticesMin = 1000;
 
    const int numVerticesMax = 1000;
 
    const int numVerticesStep = 500;
 

	
 
    float tauValues[] = {2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};
 
    //float tauValues[] = {2.1f, 2.3f, 2.5f, 2.7f, 2.9f};
 
    //float tauValues[] = {2.1f, 2.2f, 2.3f, 2.4f, 2.5f, 2.6f, 2.7f, 2.8f, 2.9f};
 
    float tauValues[] = {2.1f, 2.5f, 2.9f};
 

	
 
    const int totalDegreeSamples = 200;
 

	
 
    auto getMixingTime = [](int n, float tau) {
 
        return int(50.0f * (50.0f - 30.0f * (tau - 2.0f)) * n);
 
    };
 
    auto getMeasurements = [](int n, float tau) {
 
        (void)n;
 
        (void)tau;
 
        return 100;
 
    };
 
    auto getMeasureSkip = [](int n, float tau) {
 
        (void)tau;
 
        return 10 * n; // Take a sample every ... steps
 
    };
 

	
 
    // Output file
 
    std::ofstream outfile;
 
    if (argc >= 2)
 
        outfile.open(argv[1]);
 
    else
 
        outfile.open("graphdata_ccm_initialtris.m");
 
    if (!outfile.is_open()) {
 
        std::cout << "ERROR: Could not open output file.\n";
 
        return 1;
 
    }
 

	
 
    // Output Mathematica-style comment to indicate file contents
 
    outfile << "(*\n";
 
    outfile << "n from " << numVerticesMin << " to " << numVerticesMax
 
            << " step " << numVerticesStep << std::endl;
 
    outfile << "tauValues: " << tauValues << std::endl;
 
    outfile << "degreeSamples: " << totalDegreeSamples << std::endl;
 
    outfile << "mixingTime: 50 * (50 - 30 (tau - 2)) n\n";
 
    outfile << "measurements: 100\n";
 
    outfile << "measureSkip: 10 n\n";
 
    outfile << "data:\n";
 
    outfile << "1: {n,tau}\n";
 
    outfile << "2: avgTriangles\n";
 
    outfile << "3: {ccmTris1, ccmsrate1} \n";
 
    outfile << "4: {ccmTris2, ccmsrate2} \n";
 
    outfile << "*)" << std::endl;
 
 
 
    // Mathematica does not accept normal scientific notation
 
    outfile << std::fixed;
 
    outfile << '{';
 
    bool outputComma = false;
 

	
triangle_creation_frequency_plots.m
Show inline comments
 
@@ -32,48 +32,73 @@ gdata2=GatherBy[gsraw,{#[[1,2]]&,#[[1,1]]&,#[[3]]&}];
 
(*Triangle creation frequencies*)
 

	
 

	
 
(* ::Subsection:: *)
 
(*Plot triangle count over "time" in Markov chain instances*)
 

	
 

	
 
numPlots=20;
 
selectedData=gdata[[1,1]][[-numPlots;;-1]];
 
measureSkip=1;
 
minCount=Min[Map[Min[#[[2]]]&,selectedData]];
 
maxCount=Max[Map[Max[#[[2]]]&,selectedData]];
 
maxTime=Max[Map[Length[#[[2]]]&,selectedData]];
 
(* maxTime=30000; *)
 
skipPts=Max[1,Round[maxTime/500]]; (* Plotting every point is slow. Plot only once per `skipPts` timesteps *)
 
coarseData=Map[#[[2,1;;maxTime;;skipPts]]&,selectedData];
 
labels=Map["{n,tau} = "<>ToString[#[[1]]]&,selectedData];
 
ListPlot[coarseData,Joined->True,PlotRange->{0*minCount,maxCount},DataRange->{0,measureSkip*maxTime},PlotLegends->labels]
 
(* Map[ListPlot[#,Joined->True,PlotRange\[Rule]{minCount,maxCount},DataRange\[Rule]{0,maxTime}]&,coarseData] *)
 

	
 

	
 
differences=Map[Differences[#[[2,25000;;-1]]]&,gdata2,{4}];
 
differences=Map[Flatten,differences,{3}];
 

	
 

	
 
(* For each (n,tau) take 2 degree sequences *)
 
histograms1=Map[Histogram[#[[{2,1}]],{-25.5,25.5,1},{"Log","Probability"},ImageSize->280]&,differences,{2}];
 

	
 

	
 
(* For each (n,tau) take the average over all degree sequences *)
 
histograms2=Map[Histogram[Flatten[#],{-3.5,3.5,1},"Probability",PlotRange->{0,1},LabelingFunction->(Placed[NumberForm[#,{2,3}],Above]&),ImageSize->280]&,differences,{2}];
 

	
 

	
 
TableForm[histograms2,TableHeadings->{taulabels,nlabels}]
 

	
 

	
 
{h1,h2,h3}={
 
Show[histograms1[[2]],PlotLabel->"n=1000, \[Tau]=2.2"],
 
Show[histograms1[[5]],PlotLabel->"n=1000, \[Tau]=2.5"],
 
Show[histograms1[[8]],PlotLabel->"n=1000, \[Tau]=2.8"]};
 
{h1zoomed,h2zoomed,h3zoomed}={
 
Show[histograms2[[2]],PlotLabel->"n=1000, \[Tau]=2.2"],
 
Show[histograms2[[5]],PlotLabel->"n=1000, \[Tau]=2.5"],
 
Show[histograms2[[8]],PlotLabel->"n=1000, \[Tau]=2.8"]};
 
hcol=GraphicsGrid[Transpose[{{h1,h2,h3},{h1zoomed,h2zoomed,h3zoomed}}]]
 

	
 

	
 
Export[NotebookDirectory[]<>"plots/triangle_creation_frequencies_log.pdf",hcol]
 

	
 

	
 
(* ::Subsection:: *)
 
(*Test with 'Callout' labels*)
 

	
 

	
 
createCalloutPlot[data_]:=Module[{h,hl,bcdata,llp},
 
h=Histogram[data,{-20.5,20.5,1},{"Log","Probability"},PlotRange->All,ImageSize->280];
 
hl=HistogramList[data,{-20.5,20.5,1},"Probability"];
 
bcdata=Map[If[#>=0.01,Callout[#,NumberForm[#,{2,3}]],Clip[#,{10^-5,2}]]&,hl[[2]]];
 
llp=ListLogPlot[bcdata,PlotStyle->None,DataRange->{-20,20}];
 
Show[h,llp]
 
]
 
histograms3=Map[createCalloutPlot[Flatten[#]]&,differences,{2}];
 

	
 

	
 
(* TODO: Somehow the values of these histograms do not match the ones above!!! ????? *)
 

	
 

	
 
Show[histograms3[[2]],PlotLabel->"n=1000, \[Tau]=2.2"]
 
Show[histograms3[[5]],PlotLabel->"n=1000, \[Tau]=2.5"]
 
Show[histograms3[[8]],PlotLabel->"n=1000, \[Tau]=2.8"]
 

	
 

	
 

	
triangle_gcm_initial_analysis.m
Show inline comments
 
(* ::Package:: *)
 

	
 
Needs["ErrorBarPlots`"]
 

	
 

	
 
(* ::Section:: *)
 
(*Data import*)
 

	
 

	
 
gsraw=Import[NotebookDirectory[]<>"data/graphdata_ccm_initialtris.m"];
 
(* gsraw=SortBy[gsraw,{#[[1,1]]&,#[[1,2]]&}]; (* Sort by n and then by tau. The {} forces a *stable* sort because otherwise Mathematica sorts also on triangle count and other things. *) *)
 

	
 

	
 
gdata=GatherBy[gsraw,{#[[1,2]]&,#[[1,1]]&}];
 
(* Data format: *)
 
(* gdata[[ tau index, n index, run index , datatype index ]] *)
 
(* datatype index:
 
1: {n,tau}
 
2: avgtriangles when mixed
 
3: {GCM1 starting triangles average, GCM1 number of successes} <-- CCMu: get new highest degree vertex every time
 
4: {GCM2 starting triangles average, GCM2 number of successes} <-- CCMb: finish vertex completely
 
*)
 
nlabels=Map["n = "<>ToString[#]&,gdata[[1,All,1,1,1]]];
 
taulabels=Map["\[Tau] = "<>ToString[#]&,gdata[[All,1,1,1,2]]];
 

	
 

	
 
(* ::Subsection:: *)
 
(*New data format import*)
 

	
 

	
 
gsraw=Import[NotebookDirectory[]<>"data/graphdata_ccm_constructionrate.m"];
 
(* gsraw=SortBy[gsraw,{#[[1,1]]&,#[[1,2]]&}]; (* Sort by n and then by tau. The {} forces a *stable* sort because otherwise Mathematica sorts also on triangle count and other things. *) *)
 

	
 

	
 
gdata2=GatherBy[gsraw,{#[[1,2]]&,#[[1,1]]&}];
 
(* Data format: *)
 
(* gdata[[ tau index, n index, run index , datatype index ]] *)
 
(* datatype index:
 
1: {n,tau}
 
3: CCMdu construction rate <-- CCMdu: get new highest degree vertex every time
 
4: CCMd  construction rate <-- CCMd: finish vertex completely
 
*)
 

	
 

	
 
(* ::Section:: *)
 
(*Greedy configuration model*)
 

	
 

	
 
(* ::Subsection:: *)
 
(*Distribution of initial #triangles for GCM1,GCM2,EG compared to average #triangles.*)
 

	
 

	
 
 (* Consider all runs *)
 
getIt[x_,avg_]:=If[x[[2]]>=5, x[[1]]/avg,0]
 
getAverage[run_]:=Module[{avg},
 
    avg=run[[2]];
 
    If[avg>0,
 
    { getIt[run[[3]],avg], getIt[run[[4]],avg] }
 
    , {3,3}]
 
]
 
getTotalStats[runs_]:=Transpose[Map[getAverage,runs]];
 
totalStats=Map[getTotalStats,gdata,{2}];
 

	
 

	
 
(* Yellow: CCMu (take new highest everytime *)
 
(* Blue: CCMb (finish highest first, more similar to EG) *)
 
histogramsTotal=Map[Histogram[#,{0.05},PlotRange->{{-0.5,2},Automatic},ImageSize->300,AxesOrigin->{0,0}]&,totalStats,{2}];
 

	
 

	
 
TableForm[histogramsTotal,TableHeadings->{taulabels,nlabels}]
 

	
 

	
 
(* ::Subsubsection:: *)
 
(*Exporting plots*)
 

	
 

	
 
makeHistogram[datasets_,n_,tau_]:=Histogram[datasets,{0.05},"Probability",
 
PlotRange->{{0,1.3},{0,0.5}},
 
ImageSize->300,AxesOrigin->{0,0},
 
AspectRatio->3/5,
 
Frame->True,
 
FrameLabel->{"fraction of average #triangles at CCM start","frequency"},
 
ChartLegends->Placed[{"CCMu   avg = "<>ToString[NumberForm[N[Mean[datasets[[1]]]],2]],"CCMb   avg = "<>ToString[NumberForm[N[Mean[datasets[[2]]]],2]]},Center],
 
(*LabelingFunction->(Placed[NumberForm[#,{2,3}],Above]&),*)
 
(*LabelingFunction\[Rule](Placed[If[#2[[2]]\[Equal]1,NumberForm[#1,{2,3}],""],Above]&),*)
 
PlotLabel->n<>", "<>tau];
 
histogramsTotal=MapIndexed[makeHistogram[#1,nlabels[[#2[[2]]]],taulabels[[#2[[1]]]]]&,totalStats,{2}];
 

	
 

	
 
tauIndices={1,5,9};
 
nIndices={1};
 
(* TableForm[histogramsTotal[[tauIndices,nIndices]],TableHeadings->{taulabels[[tauIndices]],nlabels[[nIndices]]}]*)
 
@@ -80,74 +98,101 @@ Export[NotebookDirectory[]<>"plots/ccm_initialtris.pdf",plotgrid1]
 

	
 
(* ::Subsection:: *)
 
(*GCM1 vs GCM2 success rates*)
 

	
 

	
 
successrates=Map[{#[[3,2]]/100,#[[4,2]]/100}&,gdata,{3}];
 
successrates=Map[Transpose,successrates,{2}];
 
successratesDelta=Map[#[[3,2]]-#[[4,2]]&,gdata,{3}];
 
successratesAvg=Map[{Mean[#[[1]]],Mean[#[[2]]]}&,successrates,{2}];
 

	
 
rateHistograms=Map[Histogram[#,{0.1},"Probability",PlotRange->{{0,1},Automatic}]&,successrates,{2}];
 
rateDeltaHistograms=Map[Histogram[#,{10},"Probability",PlotRange->{{-100,100},Automatic}]&,successratesDelta,{2}];
 

	
 

	
 
TableForm[rateHistograms,TableHeadings->{taulabels,nlabels}]
 
TableForm[rateDeltaHistograms,TableHeadings->{taulabels,nlabels}]
 
(*TableForm[Transpose[rateHistograms],TableHeadings->{nlabels,taulabels}]*)
 

	
 

	
 
(* For export *)
 
makeHistogram2[datasets_,label_]:=Histogram[datasets,{0.1},"Probability",
 
PlotRange->{{0,1},{0,1}},
 
ImageSize->300,AxesOrigin->{0,0},
 
Frame->True,
 
FrameLabel->{"successrate of CCM construction","frequency"},
 
ChartLegends->Placed[{"CCMu   avg = "<>ToString[NumberForm[N[Mean[datasets[[1]]]],2]],"CCMb   avg = "<>ToString[NumberForm[N[Mean[datasets[[2]]]],2]]},Center],(*LabelingFunction->(Placed[NumberForm[#,{2,3}],Above]&),*)
 
(*LabelingFunction\[Rule](Placed[If[#2[[2]]\[Equal]1,NumberForm[#1,{2,3}],""],Above]&),*)
 
PlotLabel->label];
 

	
 
plot1=makeHistogram2[successrates[[1,1]],"n = 1000, \[Tau] = 2.1"]
 
plot2=makeHistogram2[successrates[[5,1]],"n = 1000, \[Tau] = 2.5"]
 
plot3=makeHistogram2[successrates[[9,1]],"n = 1000, \[Tau] = 2.9"]
 
(* columnplot1=GraphicsColumn[{plot1,plot2,plot3}] *)
 

	
 

	
 
Export[NotebookDirectory[]<>"plots/ccm_construction_successrate.pdf",columnplot1]
 

	
 

	
 
Export[NotebookDirectory[]<>"plots/ccm_construction_successrate1.pdf",plot1]
 
Export[NotebookDirectory[]<>"plots/ccm_construction_successrate5.pdf",plot2]
 
Export[NotebookDirectory[]<>"plots/ccm_construction_successrate9.pdf",plot3]
 

	
 

	
 
(* ::Section:: *)
 
(*CCMu rates only*)
 

	
 

	
 
successrates=Map[#[[3,2]]/100&,gdata,{3}];
 
successrates[[1,1]]=gdata2[[1,1,All,2]]; (* New datafile test *)
 
successrates=Map[Clip[#,{0,0.99999}]&,successrates,{3}];
 
legends=Map["\[Tau] = "<>ToString[#[[1,1,2]]]<>" ; avg = "<>ToString[NumberForm[N[Mean[#[[All,3,2]]/100]],3]]&,gdata,{2}];
 

	
 
datasets={successrates[[1,1]], successrates[[5,1]], successrates[[9,1]]};
 
selectedLegends={legends[[1,1]],legends[[5,1]],legends[[9,1]]};
 

	
 
SmoothHistogram[datasets,{0.06,"Gaussian"},"PDF",
 
plot1=Histogram[datasets,{-0.025,1.025,0.05},"Probability",
 
PlotRange->{{0,1},{0,1}},
 
ChartStyle->Directive[FaceForm[Opacity[0.8]],EdgeForm[Thickness[0.001]]],
 
ImageSize->300,AxesOrigin->{0,0},
 
Frame->True,
 
FrameLabel->{"successrate of CCMdu construction\n(distribution over sampled degree sequences)","Probability"},
 
ChartLegends->Placed[selectedLegends,Center],
 
PlotLabel->"n = 1000"]
 

	
 
histogramlist = Map[Last[HistogramList[#,{-0.05,1.05,0.1},"Probability"]]&,datasets];
 
histogramlist = Transpose[histogramlist];
 
(* labels=ConstantArray["",Ceiling[1/0.05]];
 
labels[[2;;-1;;2]]=Map[ToString,Range[0.1,1,0.1]]; *)
 
labels=Map[ToString,Range[0,1,0.1]];
 
plot2=BarChart[histogramlist,
 
PlotRange->{All,{0,1}},
 
BarSpacing->{None,Medium},
 
ChartLabels->{labels,None},
 
ImageSize->300,AxesOrigin->{0,0},
 
Frame->True,
 
FrameLabel->{"successrate of CCMdu construction\n(distribution over sampled degree sequences)","Probability"},
 
ChartLegends->Placed[selectedLegends,Center],
 
PlotLabel->"n = 1000"]
 

	
 
plot3=SmoothHistogram[datasets,{0.01,"Gaussian"},"PDF",
 
PlotRange->{{0,1},All},
 
(*ChartStyle\[Rule]Directive[FaceForm[Opacity[0.5]],EdgeForm[Thickness[0.007]]],*)
 
ImageSize->300,AxesOrigin->{0,0},
 
Frame->True,
 
FrameLabel->{"successrate of CCMdu construction\n over sampled degree sequences","PDF"},
 
FrameLabel->{"successrate of CCMdu construction\n(distribution over sampled degree sequences)","PDF"},
 
PlotLegends->Placed[selectedLegends,Center],
 
PlotLabel->"n = 1000"]
 

	
 
(*
 
Table[
 
SmoothHistogram[datasets,{0.06,weightKernel},"PDF",
 
SmoothHistogram[datasets,{0.01,weightKernel},"PDF",
 
PlotRange->{{0,1},All},
 
(*ChartStyle\[Rule]Directive[FaceForm[Opacity[0.5]],EdgeForm[Thickness[0.007]]],*)
 
ImageSize->300,AxesOrigin->{0,0},
 
Frame->True,
 
FrameLabel->{"successrate of CCMdu construction\n over sampled degree sequences","PDF"},
 
FrameLabel->{"successrate of CCMdu construction\n over sampled degree sequences","CDF"},
 
PlotLegends->Placed[selectedLegends,Center],
 
PlotLabel->"n = 1000"],{weightKernel,{"Biweight","Gaussian","Rectangular","Cosine","SemiCircle"}}]
 
*)
 

	
 

	
 

	
 
Export[NotebookDirectory[]<>"plots/ccm_construction_successrates.pdf",plot2]
0 comments (0 inline, 0 general)