{"id":15168544,"url":"https://github.com/antononcube/raku-graph","last_synced_at":"2025-10-13T13:08:08.401Z","repository":{"id":245505325,"uuid":"818442738","full_name":"antononcube/Raku-Graph","owner":"antononcube","description":"Raku package providing graph theory algorithms and parameterized- and random graphs.","archived":false,"fork":false,"pushed_at":"2025-08-16T00:46:09.000Z","size":1243,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-13T13:07:34.046Z","etag":null,"topics":["graph","graph-algorithms","graph-theory","minimal-spanning-tree","raku","rakulang","random-graph-generation","random-graphs","shortest-path-algorithm","shortest-paths"],"latest_commit_sha":null,"homepage":"https://raku.land/zef:antononcube/Graph","language":"Raku","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"artistic-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/antononcube.png","metadata":{"files":{"readme":"README-work.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-06-21T21:43:20.000Z","updated_at":"2025-08-16T00:46:12.000Z","dependencies_parsed_at":"2024-06-22T13:24:42.871Z","dependency_job_id":"eafb1ad3-5db8-4f57-8e3e-c60d081d248c","html_url":"https://github.com/antononcube/Raku-Graph","commit_stats":{"total_commits":230,"total_committers":1,"mean_commits":230.0,"dds":0.0,"last_synced_commit":"141746e512102089cc4b4f7f33be4cc2caa2d33f"},"previous_names":["antononcube/raku-graph"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/antononcube/Raku-Graph","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antononcube%2FRaku-Graph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antononcube%2FRaku-Graph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antononcube%2FRaku-Graph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antononcube%2FRaku-Graph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/antononcube","download_url":"https://codeload.github.com/antononcube/Raku-Graph/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antononcube%2FRaku-Graph/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279015279,"owners_count":26085683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["graph","graph-algorithms","graph-theory","minimal-spanning-tree","raku","rakulang","random-graph-generation","random-graphs","shortest-path-algorithm","shortest-paths"],"created_at":"2024-09-27T06:22:16.341Z","updated_at":"2025-10-13T13:08:08.393Z","avatar_url":"https://github.com/antononcube.png","language":"Raku","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Graph\n\n[![Actions Status](https://github.com/antononcube/Raku-Graph/actions/workflows/linux.yml/badge.svg)](https://github.com/antononcube/Raku-Graph/actions)\n[![Actions Status](https://github.com/antononcube/Raku-Graph/actions/workflows/macos.yml/badge.svg)](https://github.com/antononcube/Raku-Graph/actions)\n[![Actions Status](https://github.com/antononcube/Raku-Graph/actions/workflows/windows.yml/badge.svg)](https://github.com/antononcube/Raku-Graph/actions)\n\n[![](https://raku.land/zef:antononcube/Graph/badges/version)](https://raku.land/zef:antononcube/Graph)\n[![License: Artistic-2.0](https://img.shields.io/badge/License-Artistic%202.0-0298c3.svg)](https://opensource.org/licenses/Artistic-2.0)\n\nRaku package for (discrete mathematics) graph data structures and algorithms.\n\nFor a quick introduction see the video [\"Graph demo in Raku (teaser)\"](https://www.youtube.com/watch?v=0uJl9q7jIf8), [AAv1], (5 min.)\n\n**Remark:** This package is *not* for drawing and rendering images. \nIt is for the abstract data structure [***graph***](https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)). \n\n------\n\n## Installation\n\nFrom Zef ecosystem:\n\n```\nzef install Graph\n```\n\nFrom GitHub:\n\n```\nzef install https://github.com/antononcube/Raku-Graph.git\n```\n\n-------\n\n## Design and implementation details\n\n### Motivation\n\n- Needless to say, Graph theory is huge.\n  - But certain algorithms like path and cycle finding are relatively easy to implement\n    and are fundamental both mathematics-wise and computer-science-wise.\n- Having fast shortest path finding algorithms in graphs should be quite a booster for geography related projects.\n\n### Design\n\n- The central entity is the `Graph` class.\n- `Graph` is as generic as possible.\n  - Meaning it is for directed graphs.\n  - Undirected graphs are represented as directed graphs.\n    - I.e. with twice as many edges than necessary.\n  - The current graph representation is with hash-of-hashes, (`adjacency-list`), that keeps from-to-weight relationships.\n    - For example, `$g.adjacency-list\u003c1\u003e\u003c2\u003e` gives the weight of the edge connecting vertex \"1\" to vertex \"2\".\n  - The vertexes are only strings.\n    - Not a \"hard\" design decision.\n    - More general vertexes can be imitated (in the future) with vertex tags.\n      - This is related to having (in Raku) sparse matrices with named rows and columns. \n- Since I know Mathematica / Wolfram Language (WL) very well, many of the method names and signatures are\n  strongly influenced by the corresponding functions in WL.\n  - I do not follow them too strictly, though.\n  - One reason is that with Raku it is much easier to have and use named arguments than with WL.\n\n\n### Implementation\n\n- I was considering re-programming Perl5’s \"Graph\", [JHp1], into Raku, but it turned out it was easier to write the algorithms directly in Raku.\n  - (To me at least...)\n- The classes creating special graphs, like, grid-graph, star-graph, etc., are sub-classes of `Graph` \n   with files in the sub-directory \"Graph\".\n  - See usage of such classes [here](./examples/Named-graphs.raku).\n\n### Visualization\n\n- Visualizing the graphs (the objects of the class `Graph`) is very important.\n  - Has to be done from the very beginning of the development.\n    - (Again, for me at least...)\n- The class `Graph` has the methods `dot`, `graphml`, `mermaid`, and `wl` for representing the graphs for \n  GraphViz, GraphML, Mermaid-JS, and Wolfram Language (WL) respectively.\n- Mermaid's graph nodes and edges arrangement algorithm can produce \"unexpected\" images for the standard, parameterized graphs.\n  - Like, \"grid graph\", \"cycle graph\", etc.\n\n### Performance\n\n- So far, I have tested the path finding algorithms on \"Graph\" on small graphs and moderate size graphs.\n  - The largest random graph I used had 1000 vertexes and 1000 edges.\n  - Mathematica (aka Wolfram Language) can be 500 ÷ 10,000 faster.\n  - I hope good heuristic functions for the \"A* search\" method would make `find-shortest-path` fast enough,\n    for say country / continent route systems.\n    - With the larger, 1,000-vertex random graphs finding paths with the method \"a-star\" is ≈50 faster than with the method \"dijkstra\". \n      - See [here](./examples/Performance.raku).\n- Setting up comprehensive performance profiling and correctness testing is somewhat involved.\n  - One main impediment is that in Raku one cannot expect and specify same random numbers between different sessions. \n\n------\n\n## Usage examples\n\nHere we create a dataset of edges:\n\n```perl6\nmy @edges =\n        { from =\u003e '1', to =\u003e '5', weight =\u003e 1 },\n        { from =\u003e '1', to =\u003e '7', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '3', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '4', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '6', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '7', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '8', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '10', weight =\u003e 1 },\n        { from =\u003e '2', to =\u003e '12', weight =\u003e 1 },\n        { from =\u003e '3', to =\u003e '4', weight =\u003e 1 },\n        { from =\u003e '3', to =\u003e '8', weight =\u003e 1 },\n        { from =\u003e '4', to =\u003e '9', weight =\u003e 1 },\n        { from =\u003e '5', to =\u003e '12', weight =\u003e 1 },\n        { from =\u003e '6', to =\u003e '7', weight =\u003e 1 },\n        { from =\u003e '9', to =\u003e '10', weight =\u003e 1 },\n        { from =\u003e '11', to =\u003e '12', weight =\u003e 1 };\n\n@edges.elems;\n```\n\n**Remark:** If there is no `weight` key in the edge records the weight of the edge is taken to be 1.\n\nHere we create a graph object with the edges dataset:\n\n```perl6\nuse Graph;\n\nmy $graph = Graph.new;\n$graph.add-edges(@edges);\n```\n\nHere are basic properties of the graph:\n\n```perl6\nsay 'edge count   : ', $graph.edge-count;\nsay 'vertex count : ', $graph.vertex-count;\nsay 'vertex list  : ', $graph.vertex-list;\n```\n\nHere we display the graph using [Mermaid-JS](https://mermaid.js.org), (see also, [AAp1]):\n\n```perl6, output.lang=mermaid, output.prompt=NONE\n$graph.mermaid(d=\u003e'TD')\n```\n\nHere we find the shortest path between nodes \"1\" and \"4\":\n\n```perl6\nsay 'find-shortest-path : ', $graph.find-shortest-path('1', '4');\n```\n\nHere we find all paths between \"1\" and \"4\", (and sort them by length and vertex names):\n\n```perl6\nsay 'find-path : ' , $graph.find-path('1', '4', count =\u003e Inf).sort({ $_.elems ~ ' ' ~ $_.join(' ') });\n```\n\nHere we find a [Hamiltonian path](https://en.wikipedia.org/wiki/Hamiltonian_path) in the graph:\n\n```perl6\nsay 'find-hamiltonian-path : ' , $graph.find-hamiltonian-path();\n```\n\nHere we find a cycle:\n\n```perl6\nsay 'find-cycle : ' , $graph.find-cycle().sort({ $_.elems ~ ' ' ~ $_.join(' ') });\n```\n\nHere we find all cycles in the graph:\n\n```perl6\nsay 'find-cycle (all): ' , $graph.find-cycle(count =\u003e Inf).sort({ $_.elems ~ ' ' ~ $_.join(' ') });\n```\n\n-------\n\n## Graph plotting\n\n### Graph formats\n\nThe class `Graph` has the following methods of graph visualization:\n\n- `wl` for making [Wolfram Language graphs](https://reference.wolfram.com/language/ref/Graph.html)\n- `dot` for visualizing via [Graphviz](https://graphviz.org) using the [DOT language](https://graphviz.org/doc/info/lang.html)\n- `graphml` for [GraphML](http://graphml.graphdrawing.org) visualizations\n- `mermaid` for [Mermaid-JS](https://mermaid.js.org) visualizations\n\n### Visualizing via DOT format\n\nIn Jupyter notebooks with a Raku kernel graph visualization can be done with the method `dot` and its adverb \":svg\".\n\nFirst, [install Graphviz](https://graphviz.org/download/).\n\nOn macOS the installation can be done with:\n\n```\nbrew install graphviz\n```\n\nHere a wheel graph is made and its DOT format is converted into SVG format (rendered automatically in Jupyter notebooks):\n\n```perl6, eval=FALSE\nuse Graph::Wheel;\nGraph::Wheel.new(12).dot(:svg)\n```\n\nFor more details see notebook [\"DOT-visualizations.ipynb\"](./docs/DOT-visualizations.ipynb).\n\n### Visualizing via D3.js\n\nIn Jupyter notebooks with a Raku kernel graph visualization can be done with the function `js-d3-graph-plot` \nof the package [\"JavaScript::D3\"](https://github.com/antononcube/Raku-JavaScript-D3).\n\nThe visualizations with \"JavaScript::D3\" are very capricious. Currently they:\n\n- Do not work with [JupyterLab](https://jupyter.org), but only with the \"classical\" Jupyter notebook.\n- Work nicely with the Jupyter notebook plugin(s) of Visual Studio Code, but often require re-loading of the notebooks.\n\nThe points above were the main reasons to develop the DOT format visualization. \nMost of the documentation notebooks show the graphs using both \"JavaScript::D3\" and DOT-SVG. \n\n-------\n\n## TODO\n\n### Main, core features\n\n- [ ] TODO Object methods\n  - [X] DONE Str and gist methods\n  - [X] DONE Deep copy\n  - [X] DONE Creation from another graph.\n  - [ ] TODO Ingest vertexes and edges of another `Graph` object\n  - [ ] TODO Comparison: `eqv` and `ne`.\n- [X] DONE Disjoint graphs\n  - The graphs can be disjoint as long as the components have edges.\n  - Related, the class `Graph` does supports \"lone vertices.\"\n    - They have empty adjacency values.\n- [ ] TODO Vertexes\n  - [X] DONE Vertex list\n  - [X] DONE Vertex count\n  - [X] DONE Vertex degree\n  - [X] DONE in-degree, edges-at\n  - [X] DONE out-degree, edges-from\n  - [X] DONE Delete vertex(es)\n  - [X] DONE Add vertex\n  - [X] DONE Has vertex\n  - [ ] TODO Vertex tags support\n- [ ] TODO Edges\n  - [X] DONE Edge list\n  - [X] DONE Edge dataset\n  - [X] DONE Edge count\n  - [X] DONE Add edge\n  - [X] DONE Delete edge(s)\n  - [X] DONE Has edge\n  - [ ] TODO Edge tags support\n- [ ] TODO Matrix representation\n  - Sparse matrices are needed before \"seriously\" considering this.\n  - Sparse matrices should be easy to create using the (already implemented) edge dataset.\n  - [X] DONE Adjacency matrix (dense)\n  - [ ] TODO Adjacency matrix (sparse)\n  - [X] DONE Incidence matrix (dense)\n  - [ ] TODO Incidence matrix (sparse)\n\n### Graph programming\n\n- [ ] TODO Depth first scan / traversal\n  - Scan a graph in a depth-first order.\n  - This is already implemented, it has to be properly refactored.\n    - See Depth-First Search (DFS) named (private) methods.\n- [ ] TODO Breadth first scan / traversal  \n  - Scan a graph in a breadth-first order.\n\n### Paths, cycles, flows\n\n- [X] DONE Shortest paths\n  - [X] DONE Find shortest path\n  - [X] DONE Find Hamiltonian paths\n    - For both the whole graph or for a given pair of vertexes.\n    - Algorithms:\n      - [X] Backtracking, `method =\u003e 'backtracking'`)\n      - [X] Application Warnsdorf's rule for backtracking, `:warnsdorf-rule`\n      - [X] Angluin-Valiant (probabilistic), `method =\u003e 'random'`\n- [ ] TODO Flows\n  - [ ] TODO Find maximum flow\n  - [ ] TODO Find minimum cost flow\n- [ ] TODO Distances\n  - [X] DONE Graph distance\n    - See shortest path.\n  - [ ] TODO Graph distance matrix\n    - Again, requires choosing a matrix Raku class or package. \n- [X] DONE Longest shortest paths\n  - [X] DONE Vertex eccentricity\n  - [X] DONE Graph radius\n  - [X] DONE Graph diameter\n  - [X] DONE Graph center\n  - [X] DONE Graph periphery\n- [X] DONE Weakly connected component  \n- [X] DONE Strongly connected component\n  - [X] DONE [Tarjan's algorithm](https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm)\n  - [ ] TODO [Kosaraju's algorithm](https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm) \n- [X] DONE Topological sort\n  - Using Tarjan's algorithm\n- [ ] TODO Cycles and tours\n  - [X] DONE Find cycle\n    - [X] Just one cycle\n    - [X] All cycles\n  - [ ] TODO Find shortest tour\n  - [ ] TODO Find postman tour\n    - [X] DONE Eulerian and semi-Eulerian graphs\n    - [ ] TODO General graphs\n  - [ ] TODO Find Eulerian cycle\n  - [ ] TODO Find Hamiltonian cycle\n  - [ ] TODO Find cycle matrix\n- [ ] TODO Independent paths\n  - [X] DONE Find paths\n  - [ ] TODO Find edge independent paths\n  - [ ] TODO Find edge vertex paths\n\n### Matching, coloring\n\n- [X] DONE Check is a graph bipartite\n- [X] DONE [Hungarian algorithm for bipartite graphs](https://en.wikipedia.org/wiki/Hungarian_algorithm)\n  - At [tum.de](https://algorithms.discrete.ma.tum.de/graph-algorithms/matchings-hungarian-method/index_en.html)\n- [ ] TODO Perfect match for bipartite graphs\n- [ ] TODO Matching edges\n\n### Operations\n\n- [ ] TODO Unary graph operations\n  - [X] DONE Reversed graph\n  - [X] DONE Complement graph\n  - [X] DONE Subgraph\n    - For given vertices and/or edges.\n  - [X] DONE Neighborhood graph\n    - For given vertices and/or edges.\n  - [X] DONE Make undirected\n    - Can be implemented as `Graph.new($g, :!directed)`.\n    - But maybe it is more efficient to directly manipulate `adjacency-list`.\n  - [X] DONE Make directed\n    - It is not just a flag change of `$!directed`.\n    - Implement the methods: `Whatever`, \"Acyclic\", \"Random\".\n  - [ ] TODO Edge contraction\n  - [ ] TODO Vertex contraction\n  - [ ] TODO Line graph\n  - [ ] TODO Dual graph\n- [ ] TODO Binary graph operations\n  - [X] DONE Union of graphs\n  - [X] DONE Intersection of graphs\n  - [X] DONE Difference of graphs\n  - [X] DONE Disjoint union of graphs\n  - [ ] TODO Product of graphs (AKA \"box product\")\n    - [ ] TODO Cartesian\n    - [ ] TODO Co-normal\n    - [ ] TODO Lexicographic\n    - [ ] TODO Normal\n    - [ ] TODO Rooted\n    - [ ] TODO Strong\n    - [ ] TODO Tensor\n\n### Construction\n\n- [X] DONE Construction of parameterized graphs\n  - [X] DONE [Complete graphs](https://en.wikipedia.org/wiki/Complete_graph)\n  - [X] DONE [Cycle graphs](https://en.wikipedia.org/wiki/Cycle_graph)\n  - [X] DONE [Hypercube graphs](https://en.wikipedia.org/wiki/Hypercube_graph)\n  - [X] DONE [Grid graphs](https://en.wikipedia.org/wiki/Lattice_graph)\n  - [X] DONE [Knight tour graphs](https://en.wikipedia.org/wiki/Knight%27s_graph)\n  - [X] DONE [Star graphs](https://en.wikipedia.org/wiki/Star_graph)\n  - [X] DONE Path graphs\n  - [X] DONE [Wheel graphs](https://en.wikipedia.org/wiki/Wheel_graph)\n  - [X] DONE Indexed graphs\n  - [X] DONE [Hexagonal grid graphs](https://mathworld.wolfram.com/HexagonalGridGraph.html) \n- [X] DONE Construction of random graphs\n  - Since different kinds of vertex-edge distributions exists, separate distributions objects are used.\n    - See `Graph::Distribution`.\n  - [X] DONE [Barabasi-Albert distribution](https://en.wikipedia.org/wiki/Barabási–Albert_model) \n  - [X] DONE Bernoulli distribution \n  - [X] DONE [de Solla Price's model distribution](https://en.wikipedia.org/wiki/Price%27s_model) \n  - [X] DONE \"Simple\" random `(m, n)` graphs with m-vertexes and n-edges between them\n    - This was the first version of `Graph::Random`.\n    - Refactored to be done via the uniform graph distribution.\n  - [X] DONE [Watts–Strogatz model distribution](https://en.wikipedia.org/wiki/Watts–Strogatz_model) \n  - [X] DONE Uniform distribution\n- [ ] TODO Construction of *individual* graphs\n  - [ ] TODO Bull graph\n  - [ ] TODO Butterfly graph\n  - [ ] TODO Chavatal graph\n  - [ ] TODO Diamond graph\n  - [ ] TODO Durer graph\n  - [ ] TODO Franklin graph\n  - [X] DONE [Petersen graph](https://en.wikipedia.org/wiki/Petersen_graph)\n  - [ ] TODO Wagner graph\n- Creation from \n  - [ ] Adjacency matrix (dense)\n  - [ ] Adjacency matrix (sparse)\n  - [ ] Incidence matrix (dense)\n  - [ ] Incidence matrix (sparse)\n  \n### Tests\n\n- [ ] TODO Unit tests\n  - [X] DONE Sanity\n  - [X] DONE Undirected graphs\n  - [X] DONE Vertex removal\n  - [X] DONE Edge removal\n  - [X] DONE Bipartite graph check\n  - [ ] TODO Directed graphs cycles\n- [ ] TODO Cross-verification with Mathematica\n  - [X] DONE General workflow programming/setup\n  - [ ] TODO Path finding\n  - [ ] TODO Cycle finding\n\n### Documentation\n\n- [X] DONE Basic usage over undirected graphs\n- [ ] TODO Basic usage over directed graphs\n- [X] DONE Regular graphs creation (Grid, Wheel, etc.)\n  - [Notebook with a gallery of graphs](./docs/Named-graphs-gallery.ipynb)\n- [X] DONE Random graphs creation\n- [X] DONE DOT language visualizations\n\n-------\n\n## References\n\n### Articles\n\n[Wk1] Wikipedia entry, [\"Graph (discrete mathematics)\"](https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)).\n\n[Wk2] Wikipedia entry, [\"Graph theory\"](https://en.wikipedia.org/wiki/Graph_theory).\n\n[Wk3] Wikipedia entry, [\"Glossary of graph theory\"](https://en.wikipedia.org/wiki/Glossary_of_graph_theory).\n\n[Wk4] Wikipedia entry, [\"List of graphs\"](https://en.wikipedia.org/wiki/List_of_graphs) (aka \"Gallery of named graphs.\")\n\n[Wk5] Wikipedia entry, [\"Hamiltonian path\"](https://en.wikipedia.org/wiki/Hamiltonian_path).\n\n[AA1] Anton Antonov,\n[\"Graph Neat Examples in Raku – Set 1\"](https://rakuforprediction.wordpress.com/2024/12/01/graph-neat-examples-in-raku-set-1/),\n(2024),\n[RakuForPrediction at WordPress](https://rakuforprediction.wordpress.com).\n\n[AA2] Anton Antonov,\n[\"Graph Neat Examples in Raku – Set 2\"](https://rakuforprediction.wordpress.com/2024/12/06/graph-neat-examples-in-raku-set-2/),\n(2024),\n[RakuForPrediction at WordPress](https://rakuforprediction.wordpress.com).\n\n[AA3] Anton Antonov,\n[\"Graph Neat Examples in Raku – Set 3\"](https://rakuforprediction.wordpress.com/2024/12/10/graph-neat-examples-in-raku-set-3/),\n(2024),\n[RakuForPrediction at WordPress](https://rakuforprediction.wordpress.com).\n\n[AA4] Anton Antonov,\n[\"Day 12 – Graphs in Raku\"](https://raku-advent.blog/2024/12/12/day-12-graphs-in-raku/),\n(2024),\n[Raku Advent Calendar 2024](https://raku-advent.blog/2024/12/26/the-2024-raku-advent-posts/).\n\n\n### Packages\n\n[AAp1] Anton Antonov,\n[WWW::MermaidInk Raku package](https://github.com/antononcube/Raku-WWW-MermaidInk),\n(2023),\n[GitHub/antononcube](https://github.com/antononcube).\n\n[AAp2] Anton Antonov,\n[Proc::ZMQed Raku package](https://github.com/antononcube/Raku-Proc-ZMQed),\n(2022),\n[GitHub/antononcube](https://github.com/antononcube).\n\n[AAp3] Anton Antonov,\n[JavaScript:3 Raku package](https://github.com/antononcube/Raku-JavaScript-D3),\n(2022-2024),\n[GitHub/antononcube](https://github.com/antononcube).\n\n[JHp1] Jarkko Hietaniemi,\n[Graph Perl package](https://metacpan.org/dist/Graph/view/lib/Graph.pod),\n(1998-2014),\n[MetaCPAN](https://metacpan.org).\n\n### Videos\n\n[AAv1] Anton Antonov,\n[\"Graph demo in Raku (teaser)\"](https://www.youtube.com/watch?v=0uJl9q7jIf8),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv2] Anton Antonov,\n[\"Graph neat examples in Raku (Set 1)\"](https://www.youtube.com/watch?v=5qXgqqRZHow),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv3] Anton Antonov,\n[\"Raku RAG demo\"](https://www.youtube.com/watch?v=JHO2Wk1b-Og),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv4] Anton Antonov,\n[\"Sparse matrix neat examples in Raku\"](https://www.youtube.com/watch?v=kQo3wpiUu6w),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv5] Anton Antonov,\n[\"Graph neat examples in Raku (Set 2)\"](https://www.youtube.com/watch?v=E7qhutQcWCY),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv6] Anton Antonov,\n[\"Graph neat examples in Raku (Set 3)\"](https://www.youtube.com/watch?v=S_3e7liz4KM),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv7] Anton Antonov,\n[\"Chess positions and knight's tours via graphs (in Raku)\"](https://www.youtube.com/watch?v=fwQrQyWC7R0),\n(2024),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n\n[AAv8] Anton Antonov,\n[\"Graph neat examples in Raku (Set 4)\"](https://youtu.be/dabUhXW1pkw),\n(2025),\n[YouTube/@AAA4Prediction](https://www.youtube.com/@AAA4Prediction).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantononcube%2Fraku-graph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fantononcube%2Fraku-graph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantononcube%2Fraku-graph/lists"}