aboutsummaryrefslogtreecommitdiffstats
path: root/extra/dot
diff options
context:
space:
mode:
authorMartin Czygan <martin.czygan@gmail.com>2021-04-21 17:49:12 +0200
committerMartin Czygan <martin.czygan@gmail.com>2021-04-21 17:49:12 +0200
commit3cb5513cb405af78a01750a29a93be28ac5d90e4 (patch)
tree46774566984606a113a17803da81f3b14ada742f /extra/dot
parentae9e380225be648ced23d814cd1d08d1621976bd (diff)
downloadrefcat-3cb5513cb405af78a01750a29a93be28ac5d90e4.tar.gz
refcat-3cb5513cb405af78a01750a29a93be28ac5d90e4.zip
wip: a few dot examples
Diffstat (limited to 'extra/dot')
-rw-r--r--extra/dot/example_inbound.dot195
-rw-r--r--extra/dot/example_inbound.pngbin0 -> 699674 bytes
-rw-r--r--extra/dot/levels_inbound.py73
3 files changed, 268 insertions, 0 deletions
diff --git a/extra/dot/example_inbound.dot b/extra/dot/example_inbound.dot
new file mode 100644
index 0000000..9beb263
--- /dev/null
+++ b/extra/dot/example_inbound.dot
@@ -0,0 +1,195 @@
+digraph G {
+ node [ style="solid" shape="box" fontname="Arial" fontsize="12" fontcolor="black" ];
+ "fzxizmxeybazhoswj5kvxl7fky" [label="Relating Data\nRefinement\nand Failures-Divergences\nRefinement\n(2018)"];
+ "idt3qiwgffh2rid46v4vh7qh4m" [label="Generality\nin design and\ncompositional\nverification\nusingTav (1995)"];
+ "5hxst5pboja3dntwcx5xmfb6vu" [label="Proving Opacity\nvia Linearizability:\nA Sound and\nComplete Method\n(2017)"];
+ "ki6z42ugjreqzmdfc7hv72ddny" [label="CPL: a core\nlanguage for\ncloud computing\n(2016)"];
+ "vztpo3kn6rgbvgvnyvkpa7r2cu" [label="Reward Testing\nEquivalences\nfor Processes\n(2019)"];
+ "dtdp4dlhmvf2fbw2rsmfdhg7jq" [label="Checking Consistency\nin UML Diagrams:\nClasses and\nState Machines\n(2003)"];
+ "iodn5pvvk5fg3d63nwbs3iqp3i" [label="BSP-Why: A\nTool for Deductive\nVerification\nof BSP Algorithms\nwith Subgroup\nSynchronisation\n(2015)"];
+ "z53wdeubi5egnns7h55wv2vpt4" [label="A proof technique\nfor communicating\nsequential\nprocesses (1981)"];
+ "uddghbfzbbfrtdc6sqirck7pqm" [label="Unified Modelling\nFunctional\nand Non-Functional\nAspects of\nWeb Services\nComposition\nUsing PTCCS\n(2011)"];
+ "kmhwb6yju5gwvoqlirfpzpipka" [label="A FRAMEWORK\nFOR THE EVALUATION\nOF REAL-TIME\nSPECIFICATION\nTECHNIQUES\n(2006)"];
+ "2rqolf6o6jgsdkishicri2wirm" [label="An improved\nfailures model\nfor communicating\nprocesses (1985)"];
+ "lb6746dmrbg75gnbcrv3qavere" [label="TESTOR: A Modular\nTool for On-the-Fly\nConformance\nTest Case Generation\n(2018)"];
+ "ixrau56runetxbqy7olqvods2y" [label="Graphics Related\nActivities\nat NCSDCT,\nBombay (1983)"];
+ "hdwrpnaabzeqvoh6yugn3ti6lm" [label="Vulnerability\nAnalysis of\nCSP Based on\nStochastic\nGame Theory\n(2016)"];
+ "cpq5tedh2jb7zbekcqgdpeigyi" [label="More Automated\nFormal Methods?!\nIf so, why,\nwhere & how?"];
+ "26axhnld75dp3k6ruj7qm6lvbi" [label="Asynchronous\nTesting of\nSynchronous\nComponents\nin GALS Systems\n(2019)"];
+ "erfn3kiztvcvhj2ksskgrzttyy" [label="Calculating\nParallel Programs\nin Coq Using\nList Homomorphisms\n(2016)"];
+ "wwxzdcpcvrcefmw7o25wvwgjau" [label="AXIOMATIC FRAMEWORKS\nFOR DEVELOPING\nBSP-STYLE PROGRAMS∗\n(2000)"];
+ "w6nyuz43fffktacvoq2vnkqwdq" [label="Encoding CSP\ninto CCS (2015)"];
+ "xmc5nch3wfgvjdgfhlu3gfr7ga" [label="Resource-Aware\nVirtually Timed\nAmbients (2018)"];
+ "nazgn3i735e5fabigbyugjm6lu" [label="Correct and\nEfficient Antichain\nAlgorithms\nfor Refinement\nChecking (2019)"];
+ "n2j6o5sjnnc3pgtw23f7pg4uym" [label="Refinement\nand Consistency\nin Component\nModels with\nMultiple Views\n(2006)"];
+ "nqniiaq2cjezfjxs5ezlqfajl4" [label="Taming Concurrency\nfor Verification\nUsing Multiparty\nSession Types\n(2019)"];
+ "atgnqdcm65b33c5uf77el6fvni" [label="A Correctness\nChecking Approach\nfor Collaborative\nBusiness Processes\nin the Cloud\n(2020)"];
+ "mxk2kan4kngqtj5s7zbmpokpua" [label="A Relational\nView of Refinement\n(2018)"];
+ "jqptucpeebfetm77ov32zjtjhy" [label="Reflections\non Bernhard\nSteffen's Physics\nof Software\nTools (2019)"];
+ "hhtadeldyfeudh7zv7li4zarbm" [label="Stronger Validity\nCriteria for\nEncoding Synchrony\n(2019)"];
+ "7w6cjfy7ljfx7i3v2z3hazii3a" [label="Reversibility\nin session-based\nconcurrency:\nA fresh look\n(2017)"];
+ "xup26exlhjbtjnlzs3ya6r5opi" [label="30 Years of\nModal Transition\nSystems: Survey\nof Extensions\nand Analysis\n(2017)"];
+ "2mhbxewq3rczdjjtbpqsl4if4q" [label="Characteristic\nbisimulation\nfor higher-order\nsession processes\n(2016)"];
+ "jq2l5dpeknbqlnyt5gbozszkzy" [label="Communicating\nsequential\nprocesses (1978)" style="filled" fillcolor="orange"];
+ "pgcis54ngfa53o5hawkdeqfria" [label="Hybrid CSP\n(2016)"];
+ "xysudaucabb3flreoy2iztxj6a" [label="FastLane Is\nOpaque – a\nCase Study\nin Mechanized\nProofs of Opacity\n(2018)"];
+ "tyjh5qifcje47pczionoa2dz6y" [label="A state-based\napproach to\ncommunicating\nprocesses (1988)"];
+ "ij7mnzknkjbbxkhy3k2cscxfqy" [label="Coupled similarity:\nthe first 32\nyears (2019)"];
+ "zy2tq4erqrfrborv5d24opidly" [label="Defining and\nVerifying Durable\nOpacity: Correctness\nfor Persistent\nSoftware Transactional\nMemory (2020)"];
+ "cyv5n3dl55hehpef2pizxuqwm4" [label="Validating\nHigh-Level\nSynthesis"];
+ "rbbqg7nhsfdfnaphwfuwqmujvy" [label="Deriving failures\nmodels for\nnonuniform\nconcurrency\nfrom structured\noperational\nsemantics (1996)"];
+ "ipohy4pmfjakfosou7hruin7x4" [label="JDAS: a software\ndevelopment\nframework for\nmultidatabases\n(2017)"];
+ "dm2kmtw5t5aldcbjgwbc6o3pmi" [label="Failure Trace\nSemantics for\na Process Algebra\nwith Time-outs\n(preliminary\nreport) (2020)"];
+ "yctmdvbdxrgglagwiehlhvac3e" [label="Relational\nConcurrent\nRefinement\n(2018)"];
+ "vrcagvkzrzdxnbslhvaignf6si" [label="Component-aware\nInput-Output\nConformance\n(2019)"];
+ "ee4enzkzhvbrha46bzlmerxcsq" [label="Parameterizing\nhigher-order\nprocesses on\nnames and processes\n(2020)"];
+ "7xtcdmozsjh6lppwflvell7qnm" [label="SDN Protocol\nAnalysis with\nProcess Algebra\nMethod (2017)"];
+ "xa33ovyyy5aolab4iuj5oneokq" [label="Specification-oriented\nsemantics for\nCommunicating\nProcesses (1986)"];
+ "yoyygplnt5bxphait6dzdlg534" [label="Checking Modal\nContracts for\nVirtually Timed\nAmbients (2018)"];
+ "gpw35r4invcfln46vulj65f7xm" [label="Modelling Divergence\nin Relational\nConcurrent\nRefinement\n(2009)"];
+ "pdegi4sig5fp5mavy4hqmcugre" [label="On the Expressiveness\nof Symmetric\nCommunication\n(2016)"];
+ "hjtusiibtbho7cxqf56zuuqtg4" [label="A Note on the\nExpressiveness\nof BIP (2016)"];
+ "42c3kolvbvhtdjznoqarjl4574" [label="A Branching\nTime Model\nof CSP (2016)"];
+ "hidk5ja4rfbddp6tgaodiqxcmi" [label="Adopting Formal\nMethods in\nan Industrial\nSetting: The\nRailways Case\n(2019)"];
+ "l2cvg6kg7jabtbtno6gecug6ky" [label="A Branching\nTime Model\nof CSP (2017)"];
+ "mjzpcsji65f2rlmlujanu3nila" [label="Hiding in stream\nsemantics of\nuniform concurrency\n(1990)"];
+ "mfz7bqc5pjgnrojlmsfepz37qe" [label="Musings on\nEncodings and\nExpressiveness\n(2012)"];
+ "2bbo7hkoe5cbblknsd3nwczapa" [label="Expressiveness\nof component-based\nframeworks:\na study of\nthe expressiveness\nof BIP (2019)"];
+ "l6qrrsnysrf2hfmyop4bqhtwma" [label="A Theory of\nEncodings and\nExpressiveness\n(Extended Abstract)\n(2018)"];
+ "e7p4e4juw5fs3fqxyfvwfkc2mq" [label="Step failures\nsemantics and\na complete\nproof system\n(1989)"];
+ "luxpiyqihjbdzevahl6i5lgfi4" [label="Towards safe\nmodular composition\nof network\nfunctions (2018)"];
+ "wf7hn3gqqfdx3epkvh3hzczisy" [label="Evidential\nand Continuous\nIntegration\nof Software\nVerification\nTools (2018)"];
+ "rcm72e4pyvgvnkaixi4t7kypvy" [label="Causally consistent\nreversible\nchoreographies\n(2017)"];
+ "u2tggttxbbbzfdyggh24vuusti" [label="An Approach\nBased on Hierarchical\nPetri Nets\nfor the Verification\nof Interconnected\nBPEL Processes\n(2018)"];
+ "mn2j7unnnfclfdc2w5ajnqxram" [label="Multi-ML: Programming\nMulti-BSP Algorithms\nin ML (2016)"];
+ "y6mx3k2dejdephkuwksc64n2ai" [label="The Challenge\nof Typed Expressiveness\nin Concurrency\n(2016)"];
+ "sydba4xpuff7hdkegjftx3ff5e" [label="Comparing Process\nCalculi Using\nEncodings (2019)"];
+ "k6h2vy5q2nf4tmzgkf2trkppf4" [label="A Calculus\nof Virtually\nTimed Ambients\n(2017)"];
+ "nprtqlxnhrbq3esjlysvismvhy" [label="Transaction\nProtocol Verification\nwith Labeled\nSynchronization\nLogic (2019)"];
+ "b6zqaz2xzvc55bao72xwawsg5u" [label="On Modal Refinement\nand Consistency"];
+ "6px4hrvt65h43n7enhvidbolza" [label="External and\ninternal choice\nwith event\ngroups in Event-B\n(2012)"];
+ "d3qimowb2vdaphditthyex3d3m" [label="Combining Model\nRefinement\nand Test Generation\nfor Conformance\nTesting of\nthe IEEE PHD\nProtocol Using\nAbstract State\nMachines (2019)"];
+ "24n7gsewsngrdkolvalzrs2nhe" [label="Modeling and\nverification\nof Web services\ncomposition\nbased on model\ntransformation\n(2016)"];
+ "qtqir242zva73h363kajbkvsyi" [label="Analysing and\nComparing Encodability\nCriteria (2015)"];
+ "jcx6brqljbcebkizk4cdjeatyu" [label="On the Relative\nExpressiveness\nof Higher-Order\nSession Processes\n(2016)"];
+ "v5htlznfpnex7d2js5zwy47eeu" [label="A Logical Interface\nDescription\nLanguage for\nComponents\n(2000)"];
+ "dpjpdyjd35dmbg774v2kgqb3ge" [label="Formal modeling\nand verification\nof cloud‐based\nweb service\ncomposition\n(2019)"];
+ "x7s3reyu25bixgdgx4y3kwf2ci" [label="Modelling and\nanalysing neural\nnetworks using\na hybrid process\nalgebra (2016)"];
+ "4677h7puyjc2picqlgwdelmybi" [label="On the Expressiveness\nof Joining\n(2015)"];
+ "f6d5clvuifgxhg7fpwrngctccq" [label="Strategy Synthesis\nfor Autonomous\nDriving in\na Moving Block\nRailway System\nwith Uppaal\nStratego (2020)"];
+ "bumvudnas5cqtjs3in7pb4bnua" [label="Computing Coupled\nSimilarity\n(2019)"];
+ "lpqosqmr6bhcbazkvnbythddwy" [label="On Characterising\nDistributability\n(2013)"];
+ "vsmvxmfujndmfbuoz27ygabzf4" [label="Total correctness\nof CSP programs\n(1986)"];
+ "5ouybxooxvf55ibckfuyflm55y" [label="Turing und\ndie Verifikation\n(2012)"];
+ "vzxfucuz45fozhicmxzkxdpdjm" [label="Fifty years\nof Hoare's\nlogic (2019)"];
+ "ir4f556pvvddpbchro7vhffjtq" [label="Applications\nof compactness\nin the Smyth\npowerdomain\nof streams\n(1987)"];
+ "yjywveqbw5g3nhzqrx7ryvmjty" [label="Inductive Proof\nOutlines for\nMonitors in\nJava (2003)"];
+ "tvxk2b6z2jamzn6rsnkq6mjwb4" [label="Simulating\nTruly Concurrent\nCSP (2011)"];
+ "nfgui7zbfbe3tdbso2zmffbwpy" [label="Higher-order\nProcesses with\nParameterization\nover Names\nand Processes\n(2016)"];
+ "hwu7b64kh5brrlm7spzyucxibe" [label="Some recent\nadvances in\nautomated analysis\n(2015)"];
+ "x5amfr7c2zes3cspw32m5my4de" [label="Reversible\nSession-Based\nConcurrency\nin Haskell\n(2019)"];
+ "wxqp6cbl3rbz5jycbasfnski5u" [label="Alan Turing\n– Aus Leben\nund Werk eines\naußergewöhnlichen\nMenschen (2013)"];
+ "ca7g736vorcobkam2244hj2yry" [label="On the Meaning\nof Transition\nSystem Specifications\n(2019)"];
+ "lb4gnwjzqra4tc6on6tz5qsgjy" [label="SAMENVATTING\nIN HET NEDERLANDS"];
+ "lpqosqmr6bhcbazkvnbythddwy" -> "e7p4e4juw5fs3fqxyfvwfkc2mq";
+ "vzxfucuz45fozhicmxzkxdpdjm" -> "5ouybxooxvf55ibckfuyflm55y";
+ "mfz7bqc5pjgnrojlmsfepz37qe" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "pgcis54ngfa53o5hawkdeqfria" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "fzxizmxeybazhoswj5kvxl7fky" -> "tyjh5qifcje47pczionoa2dz6y";
+ "l2cvg6kg7jabtbtno6gecug6ky" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "atgnqdcm65b33c5uf77el6fvni" -> "24n7gsewsngrdkolvalzrs2nhe";
+ "x7s3reyu25bixgdgx4y3kwf2ci" -> "2rqolf6o6jgsdkishicri2wirm";
+ "cyv5n3dl55hehpef2pizxuqwm4" -> "tyjh5qifcje47pczionoa2dz6y";
+ "b6zqaz2xzvc55bao72xwawsg5u" -> "idt3qiwgffh2rid46v4vh7qh4m";
+ "vrcagvkzrzdxnbslhvaignf6si" -> "lb6746dmrbg75gnbcrv3qavere";
+ "zy2tq4erqrfrborv5d24opidly" -> "5hxst5pboja3dntwcx5xmfb6vu";
+ "wxqp6cbl3rbz5jycbasfnski5u" -> "5ouybxooxvf55ibckfuyflm55y";
+ "x5amfr7c2zes3cspw32m5my4de" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "uddghbfzbbfrtdc6sqirck7pqm" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "jcx6brqljbcebkizk4cdjeatyu" -> "qtqir242zva73h363kajbkvsyi";
+ "iodn5pvvk5fg3d63nwbs3iqp3i" -> "wwxzdcpcvrcefmw7o25wvwgjau";
+ "42c3kolvbvhtdjznoqarjl4574" -> "2rqolf6o6jgsdkishicri2wirm";
+ "2bbo7hkoe5cbblknsd3nwczapa" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "d3qimowb2vdaphditthyex3d3m" -> "lb6746dmrbg75gnbcrv3qavere";
+ "rcm72e4pyvgvnkaixi4t7kypvy" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "luxpiyqihjbdzevahl6i5lgfi4" -> "ki6z42ugjreqzmdfc7hv72ddny";
+ "hhtadeldyfeudh7zv7li4zarbm" -> "qtqir242zva73h363kajbkvsyi";
+ "k6h2vy5q2nf4tmzgkf2trkppf4" -> "ki6z42ugjreqzmdfc7hv72ddny";
+ "hwu7b64kh5brrlm7spzyucxibe" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "mxk2kan4kngqtj5s7zbmpokpua" -> "tyjh5qifcje47pczionoa2dz6y";
+ "wwxzdcpcvrcefmw7o25wvwgjau" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "v5htlznfpnex7d2js5zwy47eeu" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "nprtqlxnhrbq3esjlysvismvhy" -> "5hxst5pboja3dntwcx5xmfb6vu";
+ "pdegi4sig5fp5mavy4hqmcugre" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "nazgn3i735e5fabigbyugjm6lu" -> "42c3kolvbvhtdjznoqarjl4574";
+ "e7p4e4juw5fs3fqxyfvwfkc2mq" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "ipohy4pmfjakfosou7hruin7x4" -> "24n7gsewsngrdkolvalzrs2nhe";
+ "yjywveqbw5g3nhzqrx7ryvmjty" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "ij7mnzknkjbbxkhy3k2cscxfqy" -> "qtqir242zva73h363kajbkvsyi";
+ "vzxfucuz45fozhicmxzkxdpdjm" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "24n7gsewsngrdkolvalzrs2nhe" -> "uddghbfzbbfrtdc6sqirck7pqm";
+ "bumvudnas5cqtjs3in7pb4bnua" -> "42c3kolvbvhtdjznoqarjl4574";
+ "xmc5nch3wfgvjdgfhlu3gfr7ga" -> "k6h2vy5q2nf4tmzgkf2trkppf4";
+ "z53wdeubi5egnns7h55wv2vpt4" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "y6mx3k2dejdephkuwksc64n2ai" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "yctmdvbdxrgglagwiehlhvac3e" -> "tyjh5qifcje47pczionoa2dz6y";
+ "hhtadeldyfeudh7zv7li4zarbm" -> "l6qrrsnysrf2hfmyop4bqhtwma";
+ "42c3kolvbvhtdjznoqarjl4574" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "sydba4xpuff7hdkegjftx3ff5e" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "mjzpcsji65f2rlmlujanu3nila" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "ixrau56runetxbqy7olqvods2y" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "hjtusiibtbho7cxqf56zuuqtg4" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "lb4gnwjzqra4tc6on6tz5qsgjy" -> "e7p4e4juw5fs3fqxyfvwfkc2mq";
+ "qtqir242zva73h363kajbkvsyi" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "lb6746dmrbg75gnbcrv3qavere" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "2rqolf6o6jgsdkishicri2wirm" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "hdwrpnaabzeqvoh6yugn3ti6lm" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "cpq5tedh2jb7zbekcqgdpeigyi" -> "hwu7b64kh5brrlm7spzyucxibe";
+ "mn2j7unnnfclfdc2w5ajnqxram" -> "iodn5pvvk5fg3d63nwbs3iqp3i";
+ "f6d5clvuifgxhg7fpwrngctccq" -> "hidk5ja4rfbddp6tgaodiqxcmi";
+ "gpw35r4invcfln46vulj65f7xm" -> "tyjh5qifcje47pczionoa2dz6y";
+ "tvxk2b6z2jamzn6rsnkq6mjwb4" -> "e7p4e4juw5fs3fqxyfvwfkc2mq";
+ "jqptucpeebfetm77ov32zjtjhy" -> "lb6746dmrbg75gnbcrv3qavere";
+ "dtdp4dlhmvf2fbw2rsmfdhg7jq" -> "tyjh5qifcje47pczionoa2dz6y";
+ "5hxst5pboja3dntwcx5xmfb6vu" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "mfz7bqc5pjgnrojlmsfepz37qe" -> "2rqolf6o6jgsdkishicri2wirm";
+ "6px4hrvt65h43n7enhvidbolza" -> "tyjh5qifcje47pczionoa2dz6y";
+ "wf7hn3gqqfdx3epkvh3hzczisy" -> "hwu7b64kh5brrlm7spzyucxibe";
+ "dm2kmtw5t5aldcbjgwbc6o3pmi" -> "l6qrrsnysrf2hfmyop4bqhtwma";
+ "yoyygplnt5bxphait6dzdlg534" -> "k6h2vy5q2nf4tmzgkf2trkppf4";
+ "tyjh5qifcje47pczionoa2dz6y" -> "2rqolf6o6jgsdkishicri2wirm";
+ "ir4f556pvvddpbchro7vhffjtq" -> "mjzpcsji65f2rlmlujanu3nila";
+ "hidk5ja4rfbddp6tgaodiqxcmi" -> "jqptucpeebfetm77ov32zjtjhy";
+ "vsmvxmfujndmfbuoz27ygabzf4" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "kmhwb6yju5gwvoqlirfpzpipka" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "n2j6o5sjnnc3pgtw23f7pg4uym" -> "tyjh5qifcje47pczionoa2dz6y";
+ "4677h7puyjc2picqlgwdelmybi" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "jcx6brqljbcebkizk4cdjeatyu" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "dpjpdyjd35dmbg774v2kgqb3ge" -> "24n7gsewsngrdkolvalzrs2nhe";
+ "w6nyuz43fffktacvoq2vnkqwdq" -> "qtqir242zva73h363kajbkvsyi";
+ "ij7mnzknkjbbxkhy3k2cscxfqy" -> "42c3kolvbvhtdjznoqarjl4574";
+ "nqniiaq2cjezfjxs5ezlqfajl4" -> "qtqir242zva73h363kajbkvsyi";
+ "hhtadeldyfeudh7zv7li4zarbm" -> "mfz7bqc5pjgnrojlmsfepz37qe";
+ "7w6cjfy7ljfx7i3v2z3hazii3a" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "ee4enzkzhvbrha46bzlmerxcsq" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "ca7g736vorcobkam2244hj2yry" -> "l6qrrsnysrf2hfmyop4bqhtwma";
+ "bumvudnas5cqtjs3in7pb4bnua" -> "qtqir242zva73h363kajbkvsyi";
+ "xup26exlhjbtjnlzs3ya6r5opi" -> "idt3qiwgffh2rid46v4vh7qh4m";
+ "sydba4xpuff7hdkegjftx3ff5e" -> "qtqir242zva73h363kajbkvsyi";
+ "rbbqg7nhsfdfnaphwfuwqmujvy" -> "2rqolf6o6jgsdkishicri2wirm";
+ "5ouybxooxvf55ibckfuyflm55y" -> "z53wdeubi5egnns7h55wv2vpt4";
+ "26axhnld75dp3k6ruj7qm6lvbi" -> "lb6746dmrbg75gnbcrv3qavere";
+ "nazgn3i735e5fabigbyugjm6lu" -> "2rqolf6o6jgsdkishicri2wirm";
+ "ki6z42ugjreqzmdfc7hv72ddny" -> "jq2l5dpeknbqlnyt5gbozszkzy";
+ "xysudaucabb3flreoy2iztxj6a" -> "5hxst5pboja3dntwcx5xmfb6vu";
+ "l6qrrsnysrf2hfmyop4bqhtwma" -> "qtqir242zva73h363kajbkvsyi";
+ "nfgui7zbfbe3tdbso2zmffbwpy" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "2mhbxewq3rczdjjtbpqsl4if4q" -> "jcx6brqljbcebkizk4cdjeatyu";
+ "erfn3kiztvcvhj2ksskgrzttyy" -> "iodn5pvvk5fg3d63nwbs3iqp3i";
+ "xa33ovyyy5aolab4iuj5oneokq" -> "2rqolf6o6jgsdkishicri2wirm";
+ "7xtcdmozsjh6lppwflvell7qnm" -> "x7s3reyu25bixgdgx4y3kwf2ci";
+ "vztpo3kn6rgbvgvnyvkpa7r2cu" -> "xa33ovyyy5aolab4iuj5oneokq";
+ "u2tggttxbbbzfdyggh24vuusti" -> "24n7gsewsngrdkolvalzrs2nhe";
+ "sydba4xpuff7hdkegjftx3ff5e" -> "l6qrrsnysrf2hfmyop4bqhtwma";
+ "idt3qiwgffh2rid46v4vh7qh4m" -> "2rqolf6o6jgsdkishicri2wirm";
+}
diff --git a/extra/dot/example_inbound.png b/extra/dot/example_inbound.png
new file mode 100644
index 0000000..98a848d
--- /dev/null
+++ b/extra/dot/example_inbound.png
Binary files differ
diff --git a/extra/dot/levels_inbound.py b/extra/dot/levels_inbound.py
new file mode 100644
index 0000000..290ab6f
--- /dev/null
+++ b/extra/dot/levels_inbound.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+
+"""
+Take a document fatcat id and emit the citation structure up to X levels as graphviz dot file.
+"""
+
+from elasticsearch import Elasticsearch
+from elasticsearch_dsl import Search
+import sys
+import requests
+
+seed = sys.argv[1] if len(sys.argv) > 1 else "rgzyfbx7t5d53m5amvbllewzqi"
+max_nodes = 50
+
+client = Elasticsearch("http://localhost:9200")
+S = Search(using=client, index="fatcat_ref_v01")
+
+def pretty_label(s, k=10):
+ parts = s.split()
+ cur, result =[], []
+ for p in parts:
+ if len(" ".join(cur)) < k:
+ cur.append(p)
+ else:
+ result.append(" ".join(cur))
+ cur = []
+ result.append(" ".join(cur))
+ return "\\n".join(result)
+
+def get_dot_label(ident):
+ title = requests.get("https://api.fatcat.wiki/v0/release/{}".format(ident)).json().get("title")
+ return pretty_label(title, k=10)
+
+
+def unique_sources(ident):
+ """
+ Unique inbound references.
+ """
+ s = S.query("match", target_release_ident=ident)
+ unique_source_idents = set()
+ for hit in s.scan():
+ unique_source_idents.add(hit["source_release_ident"])
+ return list(unique_source_idents)
+
+queue = set([seed])
+i = 0
+edges = set()
+while queue:
+ node = queue.pop()
+ i += 1
+ if i == max_nodes:
+ break
+ for n in unique_sources(node)[:5]:
+ if n == node:
+ print("skipping self ref: {}".format(n), file=sys.stderr)
+ continue
+ edges.add((node, n))
+ queue.add(n)
+
+nodes = set()
+for a, b in edges:
+ nodes.add(a)
+ nodes.add(b)
+
+print("digraph G {")
+# add sensible labels
+for n in nodes:
+ print(""" "{}" [label="{}"]; """.format(n, get_dot_label(n)))
+
+for a, b in edges:
+ print(""" "{}" -> "{}"; """.format(a, b))
+print("}")
+