From e65372736dde05a2f65b5fb54180891cc5d94338 2017-06-02 11:50:31 From: Tom Bannink Date: 2017-06-02 11:50:31 Subject: [PATCH] Merge branch 'master' of https://scm.cwi.nl/AC/switchchain --- diff --git a/cpp/Makefile b/cpp/Makefile index d49fb6b44ca29f1ad72ac1483b4bf9f98d7c3431..1b149ffc3945e40ab8790fdecdf0f12de52ca651 100644 --- a/cpp/Makefile +++ b/cpp/Makefile @@ -1,7 +1,8 @@ +#CXX=clang++ INCLUDES += -I. -CXXFLAGS += -std=c++14 -O3 -Wall -Wextra -Wfatal-errors -Wno-deprecated-declarations $(INCLUDES) +CXXFLAGS += -std=c++14 -O3 -Wall -Wextra -Wfatal-errors -Werror -pedantic -Wno-deprecated-declarations $(INCLUDES) all: switchchain switchchain_exponent switchchain_initialtris diff --git a/cpp/switchchain.cpp b/cpp/switchchain.cpp index 188620c860f59c1cbc8690d1eed0e77dd8bf3262..46c0ec8fee28118b9e38a9a7f3e5bba08d96ba1b 100644 --- a/cpp/switchchain.cpp +++ b/cpp/switchchain.cpp @@ -73,8 +73,8 @@ void getTriangleDegrees(const Graph& g) { for (unsigned int j = i + 1; j < v.size(); ++j) { if (g.hasEdge({v[i], v[j]})) { ++triangles; - std::array ds = {v.size(), adj[v[i]].size(), - adj[v[j]].size()}; + std::array ds = {{v.size(), adj[v[i]].size(), + adj[v[j]].size()}}; std::sort(ds.begin(), ds.end()); trids.push_back(ds); } @@ -90,7 +90,8 @@ void getTriangleDegrees(const Graph& g) { // // method2 = true -> take highest degree and finish its pairing completely // method2 = false -> take new highest degree after every pairing -bool greedyConfigurationModel(DegreeSequence& ds, Graph& g, auto& rng, bool method2) { +template +bool greedyConfigurationModel(DegreeSequence& ds, Graph& g, RNG& rng, bool method2) { // Similar to Havel-Hakimi but instead of pairing up with the highest ones // that remain, simply pair up with random ones unsigned int n = ds.size(); @@ -194,7 +195,7 @@ bool greedyConfigurationModel(DegreeSequence& ds, Graph& g, auto& rng, bool meth return true; } -int main() { +int main(int argc, char* argv[]) { // Generate a random degree sequence std::mt19937 rng(std::random_device{}()); @@ -209,11 +210,22 @@ int main() { Graph g1; Graph g2; - std::ofstream outfile("graphdata.m"); + std::ofstream outfile; + + if (argc >= 2) + outfile.open(argv[1]); + else + outfile.open("graphdata.m"); + + if (!outfile.is_open()) { + std::cout << "ERROR: Could not open output file.\n"; + return 1; + } + outfile << '{'; bool outputComma = false; - for (int numVertices = 200; numVertices <= 2000; numVertices += 400) { + for (int numVertices = 500; numVertices <= 500; numVertices += 1000) { for (float tau : tauValues) { DegreeSequence ds(numVertices); @@ -223,7 +235,7 @@ int main() { // For a single n,tau take samples over several instances of // the degree distribution. // 500 samples seems to give reasonable results - for (int degreeSample = 0; degreeSample < 1; ++degreeSample) { + for (int degreeSample = 0; degreeSample < 5; ++degreeSample) { // Generate a graph // might require multiple tries for (int i = 1; ; ++i) { @@ -247,6 +259,7 @@ int main() { } } +#if 0 // // Test the GCM1 and GCM2 success rate // @@ -269,6 +282,9 @@ int main() { g2 = gtemp; } } +#endif + + for (int i = 1; i < 5; ++i) { SwitchChain chain; if (!chain.initialize(g)) { @@ -276,17 +292,6 @@ int main() { return 1; } - SwitchChain chain1, chain2; - bool do1 = true, do2 = true; - if (!chain1.initialize(g1)) { - std::cerr << "Could not initialize Markov chain.\n"; - do1 = false; - } - if (!chain2.initialize(g2)) { - std::cerr << "Could not initialize Markov chain.\n"; - do2 = false; - } - std::cout << "Running n = " << numVertices << ", tau = " << tau << ". \t" << std::flush; @@ -299,28 +304,41 @@ int main() { constexpr int measureSkip = 1; - - int movesDone = 0; + int movesTotal = 0; + int movesSuccess = 0; int triangles[measurements]; for (int i = 0; i < mixingTime; ++i) { - if (chain.doMove()) - ++movesDone; + ++movesTotal; + if (chain.doMove()) { + ++movesSuccess; + } } + + std::vector successRates; + successRates.reserve(measurements * measureSkip); + int successrate = 0; for (int i = 0; i < measurements; ++i) { - for (int j = 0; j < measureSkip; ++j) - if (chain.doMove()) - ++movesDone; + for (int j = 0; j < measureSkip; ++j) { + ++movesTotal; + if (chain.doMove()) { + ++movesSuccess; + ++successrate; + } + } triangles[i] = chain.g.countTriangles(); + + if ((i+1) % 100 == 0) { + successRates.push_back(successrate); + successrate = 0; + } } - std::cout << movesDone << '/' << mixingTime + measurements * measureSkip - << " moves succeeded (" - << 100.0f * float(movesDone) / - float(mixingTime + measurements * measureSkip) - << "%)."; - //std::cout << std::endl; + std::cout << '(' + << 100.0f * float(movesSuccess) / float(movesTotal) + << "% successrate). " << std::flush; + // std::cout << std::endl; if (outputComma) outfile << ',' << '\n'; @@ -330,10 +348,12 @@ int main() { outfile << '{' << '{' << numVertices << ',' << tau << '}'; outfile << ',' << triangles; outfile << ',' << ds; +#if 0 outfile << ',' << greedyTriangles1; outfile << ',' << greedyTriangles2; - if (do1) { + SwitchChain chain1, chain2; + if (chain1.initialize(g1)) { movesDone = 0; SwitchChain& c = chain1; for (int i = 0; i < mixingTime; ++i) { @@ -355,7 +375,7 @@ int main() { outfile << ',' << triangles; } - if (do2) { + if (chain2.initialize(g2)) { movesDone = 0; SwitchChain& c = chain2; for (int i = 0; i < mixingTime; ++i) { @@ -377,10 +397,14 @@ int main() { outfile << ',' << triangles; } +#endif + + outfile << ',' << successRates; outfile << '}' << std::flush; std::cout << std::endl; + } } } } diff --git a/cpp/switchchain_initialtris.cpp b/cpp/switchchain_initialtris.cpp index b241f78ebf55a849557d146004dfa8091269087e..6daff04207b0bce9e7e21cd1abef76cfb3a38b37 100644 --- a/cpp/switchchain_initialtris.cpp +++ b/cpp/switchchain_initialtris.cpp @@ -68,7 +68,8 @@ class SwitchChain { // // method2 = true -> take highest degree and finish its pairing completely // method2 = false -> take new highest degree after every pairing -bool greedyConfigurationModel(DegreeSequence& ds, Graph& g, auto& rng, bool method2) { +template +bool greedyConfigurationModel(DegreeSequence& ds, Graph& g, RNG& rng, bool method2) { // Similar to Havel-Hakimi but instead of pairing up with the highest ones // that remain, simply pair up with random ones unsigned int n = ds.size(); diff --git a/plots/avgtris_n.pdf b/plots/avgtris_n.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2f90a2bcfff8391e6466a1d2cd043a6becfb2f99 GIT binary patch literal 25897 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

UJ}9!5x* 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 o#$WRP`+M|-n++<6{M82K+R53_(fL=VLGy7k!%"data/graphdata_partial.m"]; +gsraw=Import[NotebookDirectory[]<>"data/graphdata_temp2.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. *) *) @@ -146,19 +146,47 @@ Show[ListPlot[avgAndProp,AxesOrigin->{0,0},AxesLabel->{"degree-sequence-property (*Plot triangle count over "time" in Markov chain instances*) -numPlots=20; -selectedData=gdata[[4,-1]][[-numPlots;;-1]]; +numPlots=10; +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]]; -skipPts=Max[1,Round[maxTime/200]]; (* Plotting every point is slow. Plot only once per `skipPts` timesteps *) -coarseData=Map[#[[2,1;;-1;;skipPts]]&,selectedData]; +maxTime=30000; +skipPts=Max[1,Round[maxTime/400]]; (* 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->{minCount,maxCount},DataRange->{0,measureSkip*maxTime},PlotLegends->labels] +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] *) +(* ::Subsection:: *) +(*Plot success rate over "time"*) + + +numPlots=10; +selectedData=gdata[[1,-1]][[-numPlots;;-1]]; +measureSkip=100; +maxTime=Max[Map[Length[#[[4]]]&,selectedData]]; +maxTime=10000; +coarseData=Map[#[[4,1;;maxTime/measureSkip]]&,selectedData]; +labels=Map["{n,tau} = "<>ToString[#[[1]]]&,selectedData]; +ListPlot[coarseData,Joined->True,PlotRange->{0,100},DataRange->{0,maxTime},PlotLegends->labels] +(* Map[ListPlot[#,Joined->True,PlotRange\[Rule]{minCount,maxCount},DataRange\[Rule]{0,maxTime}]&,coarseData] *) + + +(* ::Subsection:: *) +(*Correlation of avgsuccess rate vs other things*) + + +compare1=Map[{Mean[#[[4]]],Mean[#[[2]]]}&,gdata,{3}]; +(* { GCM1 rate, GCM2 rate, mixing time from ErdosGallai } *) + + +scatterPlots=Map[ListPlot[#,PlotRange->{{0,100},All},PlotStyle->PointSize[Large]]&,compare1,{2}]; +TableForm[scatterPlots,TableHeadings->{taulabels,nlabels}] + + (* ::Subsection:: *) (*Compute 'mixing time'*) diff --git a/triangle_exponent_plots.m b/triangle_exponent_plots.m index af61d1223c4fb6a47a3c62c48e505bd2fd7567fe..b88398c79d7059660338a64c3be02f5d1493305d 100644 --- a/triangle_exponent_plots.m +++ b/triangle_exponent_plots.m @@ -16,7 +16,7 @@ Needs["ErrorBarPlots`"] (* When importing from exponent-only-data file *) -gsraw=Import[NotebookDirectory[]<>"data/graphdata_exponent.m"]; +gsraw=Import[NotebookDirectory[]<>"data/graphdata_exponent_mix32.m"]; gsraw=SortBy[gsraw,#[[1,1]]&]; (* Sort by n *) averagesGrouped=GatherBy[gsraw,{#[[1,2]]&,#[[1,1]]&}]; @@ -51,7 +51,10 @@ fitsExtra[[1]]["ParameterErrors"] fitsExtra[[1]]["ParameterConfidenceIntervals"] -Show[ListLogLogPlot[averagesErrorBars[[All,All,1]],Joined->True,PlotMarkers->Automatic,AxesLabel->{"n","\[LeftAngleBracket]triangles\[RightAngleBracket]"},PlotLegends->taulabels],Plot[fits,{logn,1,2000}]] +plot1=Show[ListLogLogPlot[averagesErrorBars[[All,All,1]],Joined->False,PlotMarkers->Automatic,AxesLabel->{"n","\[LeftAngleBracket]triangles\[RightAngleBracket]"},PlotLegends->taulabels],Plot[fits,{logn,1,2000}]] + + +Export[NotebookDirectory[]<>"plots/avgtris_n.pdf",plot1] (* ::Subsection:: *) @@ -60,7 +63,7 @@ Show[ListLogLogPlot[averagesErrorBars[[All,All,1]],Joined->True,PlotMarkers->Aut tauValues=averagesGrouped[[All,1,1,1,2]]; exponents=Transpose[{tauValues,fits[[All,2,1]]}]; -Show[ListPlot[exponents,Joined->True,PlotMarkers->Automatic,AxesLabel->{"tau","T(\[Tau])"},PlotRange->{{2,3},{0,1.6}}],Plot[3/2(3-tau),{tau,2,3}]] +Show[ListPlot[exponents,Joined->True,PlotMarkers->Automatic,AxesLabel->{"tau","exponent"},PlotRange->{{2,3},{0,1.6}}],Plot[3/2(3-tau),{tau,2,3}]] (* ::Subsection:: *) @@ -70,4 +73,7 @@ Show[ListPlot[exponents,Joined->True,PlotMarkers->Automatic,AxesLabel->{"tau","T tauValues=averagesGrouped[[All,1,1,1,2]]; exponentsErrorBars=Map[{{#[[1]],#[[2]]["BestFitParameters"][[2]]},ErrorBar[#[[2]]["ParameterConfidenceIntervals"][[2]]-#[[2]]["BestFitParameters"][[2]]]}&, Transpose[{tauValues,fitsExtra}]]; -Show[ErrorListPlot[exponentsErrorBars,Joined->True,PlotMarkers->Automatic,AxesLabel->{"tau","T(\[Tau])"},PlotRange->{{2,3},{0,1.6}}],Plot[3/2(3-tau),{tau,2,3}]] +plot2=Show[ErrorListPlot[exponentsErrorBars,Joined->True,PlotMarkers->Automatic,Frame->True,FrameLabel->{"tau","triangle exponent"},PlotRange->{{2,3},{0,1.6}},ImageSize->300],Plot[3/2(3-tau),{tau,2,3},PlotStyle->{Dashed}]] + + +Export[NotebookDirectory[]<>"plots/triangle_exponent.pdf",plot2]