https://github.com/urbdyn/petgraph-wasm
A work in progress, selective WASM wrapper around the fantastic petgraph library in Rust.
https://github.com/urbdyn/petgraph-wasm
nodejs petgraph rust wasm
Last synced: 11 days ago
JSON representation
A work in progress, selective WASM wrapper around the fantastic petgraph library in Rust.
- Host: GitHub
- URL: https://github.com/urbdyn/petgraph-wasm
- Owner: urbdyn
- License: apache-2.0
- Created: 2021-02-06T15:06:53.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2023-02-13T21:57:20.000Z (over 2 years ago)
- Last Synced: 2025-05-04T05:18:48.568Z (14 days ago)
- Topics: nodejs, petgraph, rust, wasm
- Language: Rust
- Homepage:
- Size: 69.3 KB
- Stars: 11
- Watchers: 7
- Forks: 1
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGE_LOG.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# petgraph-wasm
[![NPM Version][npm-image]][npm-url]
A work in progress, selective WASM wrapper around the fantastic [petgraph](https://github.com/petgraph/petgraph) library in Rust.
This project aims to provide a direct port of the petgraph library to an NPM packages which preserves as much of the original API structure and design as possible.
For more details please check out the [thoroughly documented petgraph API](https://docs.rs/petgraph/0.5.1/petgraph/).## Example
```typescript
// Typescript exampleimport {DiGraph, toposort} from 'petgraph-wasm'
// Create new directional graph
const g = new DiGraph()// Add nodes to directional graph
const kno_index = g.addNode("Knoxville")
const vil_index = g.addNode("Vilnius")
const tai_index = g.addNode("Taipei")// Connect them with edges
g.addEdge(kno_index,vil_index)
g.addEdge(kno_index,tai_index)
g.addEdge(vil_index,tai_index)// Sort them
const sorted_g = toposort(g)// Detect cycles
g.addEdge(tai_index,kno_index)
// Will throw error!
toposort(g)
```## Performance
You should always measure you're exact needs to know how this library will work for you.
But here's a few order of magnitude examples as run on a GCP VM with a 2.25GHz AMD EPYC CPU.
There are probably overly "optomistic" in design as compared to real world needs.| Action | Nodes | Edges | Time |
|------------|-----------|------------|---------------|
| `toposort` | 10,000 | 9,000 | ~2ms |
| `toposort` | 10,000 | 90,000 | ~5ms |
| `toposort` | 10,000 | 900,000 | ~20ms |
| `toposort` | 100,000 | 99,000 | ~20ms |
| `toposort` | 100,000 | 990,000 | ~70ms |
| `toposort` | 100,000 | 900,000 | ~600ms |
| `toposort` | 1,000,000 | 999,000 | ~350ms |
| `toposort` | 1,000,000 | 9,990,000 | ~750ms |
| `toposort` | 1,000,000 | 99,900,000 | out-of-memory |## Development
To work on this you will need to install rust-up and wasm-pack.
```bash
# Build the npm package
wasm-pack build --target nodejs
# Test on node
wasm-pack test --node
# Create release build
./bin/ci.sh
# Try out benchmark of 100,000 nodes each with 15 edges
time ./example_js/benchmark.js 100000 15
```[npm-image]: https://img.shields.io/npm/v/@urbdyn/petgraph-wasm.svg
[npm-url]: https://npmjs.org/package/@urbdyn/petgraph-wasm