{"id":27730694,"url":"https://github.com/lantunes/netomaton","last_synced_at":"2026-04-09T00:31:31.210Z","repository":{"id":34918710,"uuid":"160832006","full_name":"lantunes/netomaton","owner":"lantunes","description":"Automata on arbitrary networks, with Python","archived":false,"fork":false,"pushed_at":"2023-07-06T21:46:04.000Z","size":55267,"stargazers_count":66,"open_issues_count":3,"forks_count":13,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-28T18:14:20.621Z","etag":null,"topics":["cellular-automata","complex-systems","discrete-dynamical-systems","network-automata","neural-network","nonlinear-systems"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lantunes.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-07T14:11:24.000Z","updated_at":"2025-09-26T11:26:40.000Z","dependencies_parsed_at":"2023-01-16T23:00:58.619Z","dependency_job_id":null,"html_url":"https://github.com/lantunes/netomaton","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/lantunes/netomaton","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lantunes%2Fnetomaton","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lantunes%2Fnetomaton/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lantunes%2Fnetomaton/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lantunes%2Fnetomaton/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lantunes","download_url":"https://codeload.github.com/lantunes/netomaton/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lantunes%2Fnetomaton/sbom","scorecard":{"id":578687,"data":{"date":"2025-08-11","repo":{"name":"github.com/lantunes/netomaton","commit":"ac1e00901ec1fcfc334a41e2f1a94060a842aee3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/5 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/python-app.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: GHSA-6p56-wp2h-9hxr","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-app.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/lantunes/netomaton/python-app.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-app.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/lantunes/netomaton/python-app.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:40","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:41","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:42","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:43","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:44","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:45","Warn: pipCommand not pinned by hash: .github/workflows/python-app.yml:46","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}}]},"last_synced_at":"2025-08-20T18:33:58.275Z","repository_id":34918710,"created_at":"2025-08-20T18:33:58.275Z","updated_at":"2025-08-20T18:33:58.275Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31579849,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cellular-automata","complex-systems","discrete-dynamical-systems","network-automata","neural-network","nonlinear-systems"],"created_at":"2025-04-28T06:02:17.871Z","updated_at":"2026-04-09T00:31:31.191Z","avatar_url":"https://github.com/lantunes.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/lantunes/netomaton/master/resources/logo.png\" alt=\"logo\"\u003e\u003c/img\u003e\n\u003c/div\u003e\n\n\u003cb\u003eNetomaton\u003c/b\u003e is a Python framework for exploring discrete dynamical systems. It is a software abstraction\nmeant to aid in the implementation of models of collective computation. Examples of such computational models include \nCellular Automata and Neural Networks. This also includes some continuous dynamical systems, such as ordinary and \npartial differential equations, since the simulation of such systems involves the discretization of space and time. \nNetomaton is also a tool for exploring Complex Systems.\n\nUnderlying all discrete dynamical systems (and discretized continuous dynamical systems) are networks of stateful units \nthat obey rules that specify how their states change over time. Netomaton thus considers all dynamical systems as a \nmodel of computation known as Functional Network Automata.\n\n[![testing status](https://github.com/lantunes/netomaton/actions/workflows/python-app.yml/badge.svg?branch=master)](https://github.com/lantunes/netomaton/actions)\n[![latest version](https://img.shields.io/pypi/v/netomaton?style=flat-square\u0026logo=PyPi\u0026logoColor=white\u0026color=blue)](https://pypi.org/project/netomaton/)\n\n### Getting Started\n\nNetomaton can be installed via pip:\n\n```\npip install netomaton\n```\n\nRequirements for using this library are Python 3.6, numpy 1.15.4,\nmatplotlib 3.0.2, networkx 2.5, and msgpack 1.0.2.\n\n\n### What are Network Automata?\n\nThe [Wikipedia entry](https://en.wikipedia.org/wiki/Network_automaton)\nfor Network Automata has stated:\n\n\u003e A network automaton (plural network automata) is a mathematical system consisting of a network of nodes that evolves over time according to predetermined rules. It is similar in concept to a cellular automaton, but much less studied.\n\n\u003e Stephen Wolfram's book _A New Kind of Science_, which is primarily concerned with cellular automata, briefly discusses network automata, and suggests (without positive evidence) that the universe might at the very lowest level be a network automaton.\n\nA Network Automaton is a discrete dynamical system comprised of a collection\nof nodes (the computational units) causally connected to each other, as\nspecified by a network-defining adjacency matrix. The nodes adopt states\nat each timestep of the network's evolution, as prescribed by an activity\nfunction, *f*. Moreover, the network's topology can also change over time, as\nprescribed by a connectivity function, *g*.\n\nThe network's topology is specified by the adjacency matrix, **A**, which\nis of size _N_\u003csub\u003etot\u003c/sub\u003e *X* _N_\u003csub\u003etot\u003c/sub\u003e, where _N_\u003csub\u003etot\u003c/sub\u003e\nrepresents the total number of nodes in the network. Each non-zero entry\nin **A** represents the existence of a link. The value of the entry\nrepresents a link weight. The matrix **A** thus contains information\nabout the existence of links, and their direction.\n\nThe network is evolved for *T* timesteps. The activity of the network is\ndefined by the activities of all its nodes, and is represented by **S**\u003csub\u003e*t*\u003c/sub\u003e,\nwhere *t* is a particular timestep. During each timestep, the activity\nfunction *f* is invoked, followed by the connectivity function *g*, such\nthat:\n\n**S**\u003csub\u003e*t+1*\u003c/sub\u003e = *f*(**A**\u003csub\u003e*t*\u003c/sub\u003e, **S**\u003csub\u003e*t*\u003c/sub\u003e)\n\n**A**\u003csub\u003e*t+1*\u003c/sub\u003e = *g*(**A**\u003csub\u003e*t*\u003c/sub\u003e, **S**\u003csub\u003e*t*\u003c/sub\u003e)\n\n\nThere are no restrictions to the kinds of topological changes that a\nnetwork may undergo over the course of its evolution. A network may have\nnodes added or removed at any given timestep.\n\nTo learn more, please refer to the scientific literature on the subject:\n\n\u003e Wolfram, S. (2002). A New Kind of Science (pp. 475–545). Champaign, IL: Wolfram Media.\n\n\u003e Tomassini, Marco. \"Generalized automata networks.\" International Conference on Cellular Automata. Springer, Berlin, Heidelberg, 2006.\n\n\u003e Sayama, Hiroki, and Craig Laramee. \"Generative network automata: A generalized framework for modeling adaptive network dynamics using graph rewritings.\" Adaptive Networks. Springer, Berlin, Heidelberg, 2009. 311-332.\n\n\u003e Smith, David MD, et al. \"Network automata: Coupling structure and function in dynamic networks.\" Advances in Complex Systems 14.03 (2011): 317-339.\n\n### Examples\n\nHere's an example of the Elementary Cellular Automaton Rule 30 (as\ndescribed by Stephen Wolfram in his book\n[_A New Kind of Science_](https://www.wolframscience.com/nks/)),\nimplemented with the Netomaton library:\n```python\nimport netomaton as ntm\n\nnetwork = ntm.topology.cellular_automaton(n=200)\n\ninitial_conditions = [0] * 100 + [1] + [0] * 99\n\ntrajectory = ntm.evolve(network=network, initial_conditions=initial_conditions,\n                        activity_rule=ntm.rules.nks_ca_rule(30), timesteps=100,\n                        memoize=True)\n\nntm.plot_activities(trajectory)\n```\n\n\u003cimg src=\"resources/rule30.png\" width=\"50%\"/\u003e\n\nThis repository contains examples of implementations of\nvarious kinds of collective computation models, all implemented using\nthe Netomaton framework. Follow the link to learn more:\n\n* [Elementary Cellular Automata](demos/elementary_ca/README.md)\n* [1D Cellular Automata with Totalistic Rules](demos/totalistic_ca/README.md)\n* [Reversible 1D Cellular Automata](demos/reversible_ca/README.md)\n* [Density Classification with Evolved 1D Cellular Automata](demos/ca_density_classification/README.md)\n* [Density Classification with a Watts-Strogatz small-world graph](demos/small_world_density_classification/README.md)\n* [Asynchronous Automata](demos/asynchronous_automata/README.md)\n* [Continuous Automata](demos/continuous_automata/README.md)\n* [Finite State Machines](demos/finite_state_machine/README.md)\n* [Pushdown Automata](demos/pushdown_automata/README.md)\n* [Turing Machines](demos/turing_machine/README.md)\n* [Langton's Lambda and Measures of Complexity](demos/langtons_lambda/README.md)\n* [2D Cellular Automata](demos/totalistic_ca2d/README.md)\n* [Conway's Game of Life](demos/game_of_life/README.md)\n* [Fredkin's Self-Replicating CA](demos/fredkin_self_replicating_ca/README.md)\n* [Langton's Loops](demos/langtons_loops/README.md)\n* [Gray-Scott Reaction-Diffusion Model](demos/reaction_diffusion/README.md)\n* [Hexagonal Cell Lattices](demos/hexagonal_ca/README.md)\n* [Hopfield Network](demos/hopfield_net/README.md)\n* [Restricted Boltzmann Machine](demos/restricted_boltzmann_machine/README.md)\n* [Multilayer Perceptron](demos/mlp/README.md)\n* [Perturbations](demos/perturbation_demo/README.md)\n* [Sandpiles](demos/sandpiles/README.md)\n* [Continuous-Time Models](demos/continuous_time_models/README.md)\n* [Travelling Salesman Problem with the Hopfield-Tank Neural Net](demos/hopfield_tank_tsp/README.md)\n* [Logistic Map](demos/logistic_map/README.md)\n* [Lorenz Attractor](demos/lorenz_attractor/README.md)\n* [Collatz Conjecture](demos/collatz_conjecture/README.md)\n* [Substitution Systems](demos/substitution_systems/README.md)\n* [Lindenmayer Systems](demos/lindenmayer_systems/README.md)\n* [Wireworld](demos/wireworld/README.md)\n* [Random Attachment Model](demos/random_attachment_model/README.md)\n* [Randomly Growing Network](demos/randomly_growing_network/README.md)\n* [Restricted Network Automata](demos/restricted_network_automata/README.md)\n* [Functional Network Automata](demos/functional_network_automata/README.md)\n* [Evolving Networks](demos/evolving_networks/README.md)\n* [Fungal Growth Model](demos/fungal_growth/README.md)\n* [Flocking](demos/flocking/README.md)\n* [Optimizing Particle Swarms](demos/optimizing_particle_swarms/README.md)\n* [Wolfram Physics Model](demos/wolfram_physics/README.md)\n\nAdditionally, this library includes a number of utility functions for\nworking with the results produced by the automata. For example, there\nis the `animate` function, which is explained more [here](demos/animation_demo/README.md).\nIt is also important to understand the `timesteps` and `input`\nparameters of the `evolve` function, explained [here](demos/timesteps_and_input/README.md).\n\n### About this project\n\nThis project proposes the idea that many popular and well-known\ncollective computational models can all be thought of as Functional Network Automata.\nSuch models include Cellular Automata, Boltzmann Machines, and various\nflavours of Neural Networks, such as the Hopfield Net, and the Multilayer\nPerceptron. This library does not attempt to be a replacement for great\nframeworks such as TensorFlow, which are optimized, both in software and\nhardware, for working with Neural Networks, for example. What this library\ndoes attempt to be is a generalization of collective computation,\ninstantiated in software, with the goal of helping us see similarities\nbetween models, and imagine new models that borrow features from existing\nexamples. It aims to provide a software architecture for understanding\nand exploring the nature of computation in potentially dynamic networks.\n\nNetomaton arose from a personal need to reconcile various models of collective\ncomputation. In what fundamental ways does a Neural Network differ from a\nCellular Automaton? What can a Boltzmann Machine do that other models can't?\nWhat do any of these models have in common? What sorts of new models can\nwe imagine? These are the questions that this library aspires to help answer.\n\nNetomaton tries to make accessible any model of collective computation.\nIn so doing, it adopts certain generalizations and abstractions that,\nwhile providing a common language for discussing seemingly disparate kinds of\nmodels, incur a cost in terms of increased runtime complexity. The cost\nof being very general is a less than ideal runtime performance, as any\ngiven implementation is not optimized for a specific setting. For\nexample, regarding neural networks roughly as a series of matrix\nmultiplications allows one to take advantage of software and hardware\nthat can do those operations quickly. The focus of Netomaton, on the\nother hand, is not on practicality, but on flexibility.\n\n### Development\n\nCreate a Conda environment from the provided environment YAML file:\n```\n$ conda env create -f netomaton_dev.yaml\n```\n\n**Documentation**\n\nTo build the Sphinx documentation, from the `doc` directory:\n```\n$ make clean html\n```\nThe generated files will be in `_build/html`.\n\n**Testing**\n\nThere are a number of unit tests for this project. To run the tests:\n```\n$ pytest tests\n```\n\n--------------------\n\n### Citation Info\n\nThis project has been published on [Zenodo](https://zenodo.org/record/3893141#.XuUOg55KhZI),\nwhich provides a DOI, as well as an easy way to generate citations in a number of formats.\nFor example, this project may be cited as:\n\n\n\u003e Antunes, Luis M. (2019, September 28). Netomaton: A Python Library for working with \nNetwork Automata. Zenodo. http://doi.org/10.5281/zenodo.3893141\n\n\nBibTeX:\n```\n@software{antunes_luis_m_2019_3893141,\n  author       = {Antunes, Luis M.},\n  title        = {{Netomaton: A Python Library for working with \n                   Network Automata}},\n  month        = sep,\n  year         = 2019,\n  publisher    = {Zenodo},\n  doi          = {10.5281/zenodo.3893141},\n  url          = {https://doi.org/10.5281/zenodo.3893141}\n}\n```\n\n### Stars\n\nPlease star this repository if you find it useful, or use it as part of your research.\n\n### Copyrights\n\nCopyright (c) 2018-2020 Luis M. Antunes (@lantunes) All rights reserved.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flantunes%2Fnetomaton","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flantunes%2Fnetomaton","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flantunes%2Fnetomaton/lists"}