Giter Club home page Giter Club logo

py-tarjan's Introduction

Python implementation of Tarjan's algorithm

Tarjan's algorithm takes as input a directed (possibly cyclic!) graph and returns as output its strongly connected components in a topological order.

Example

image

>>> tarjan({1:[2],2:[1,5],3:[4],4:[3,5],5:[6],6:[7],7:[8],8:[6,9],9:[]})
[[9], [8, 7, 6], [5], [2, 1], [4, 3]]

Uses

Cyclic dependencies

In various cases, dependencies might be cyclic and a group of interdependant actions must be executed simultaneously. It is not uncommon that the simulataneous execution is costly. With Tarjan's algorithm, one can determine an efficient order in which to execute the groups of interdependant actions.

Transitive closure

Using Tarjan's algorithm, one can efficiently compute the transitive closure of a graph. (Given a graph G, the transitive closure of G is a graph that contains the same vertices and contains an edge from v to w if and only if there is a path from v to w in G.)

The transitive closure is implemented in `tarjan.tc`:

>>> from tarjan.tc import tc
>>> tc({1:[2],2:[1,5],3:[4],4:[3,5],5:[6],6:[7],7:[8],8:[6,9],9:[]})
{1: (1, 2, 5, 6, 7, 8, 9),
 2: (1, 2, 5, 6, 7, 8, 9),
 3: (3, 4, 5, 6, 7, 8, 9),
 4: (3, 4, 5, 6, 7, 8, 9),
 5: (8, 9, 6, 7),
 6: (8, 9, 6, 7),
 7: (8, 9, 6, 7),
 8: (8, 9, 6, 7),
 9: ()}

Expand group hierarchies

Given a graph of groups, one can use the transitive closure to determine all indirect members of a group. (Someone is an indirect member of a group, if it is a member of a group that is a member of a group that ... is a member of the group.)

Installation

Simply execute

pip install tarjan

or from this source distribution, run

python setup.py install

image

py-tarjan's People

Contributors

bwesterb avatar do3cc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

py-tarjan's Issues

Licensing question

@bwesterb Thank you for this great lib. Note that it is used in https://github.com/debrouwere/python-whatwhen by @debrouwere that is ISC-licensed. I am also considering it for use in the Apache-licensed https://github.com/nexB/scancode-toolkit .
The AGPL license means it is not easy to use your code as a library unless the using code is also AGPL or AGPL compatible and treated as AGPL-licensed practically at runtime.
Would you consider another license such the LGPL instead?
Please ignore if you feel strongly about this!
Thank you.

Version too clever. breaks.

We are installing tarjan via buildout, probably the same problem exists with pip.
In proper buildout configurations you pin every package to a specific version.
We pinned tarjan to 0.1.2. Buildout finds tarjan on pypi as a source release, downloads it and builds an egg out of it.
When building the egg, the version of the egg is infered by what is written in setup.py.
That get_git_version() For some reason returns a version 1.0.1. My buildout realizes that it got the wrong egg and bails out. This happens with 0.1.2 and 0.2.1.

If the version number were just a string, this problem would not exist. I can provide a PR for it and would be very glad for a new egg with a static version.
I'd like to use this opportunity to mention a package I did not write but use a lot: https://pypi.python.org/pypi/zest.releaser Which is an alternative way to avoid updating a version number by hand.

tarjan_recursive stack set

Hi,
I do not have any issues with your implementation. I just confuse that why you use two stack S and S_set. The algorithm pseudo code in Wikipedia uses only one stack.
My implementation does not have the S_set and it never finishes with a large graph (1 million nodes). I put in the S_set like you and it works instantly.
So why do we need the S_set there?
Thank you.

Cannot see the source code

I want to see the source code of tarjan module itself but it seems not included here. Can you post it? what are the available functions?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.