networkx 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e86cfdb083751f6aa9d45d894dd4a83ec75623acd237c6cdc8e7cd356306409
4
- data.tar.gz: 60ef78a9da3df8d7f61e297af48873795b21d9675138e953dd160597d9bfdc09
3
+ metadata.gz: 39e75c0ad21604275a008c53a29f282d681f3c50cb7648470cc6e4e2cffa5071
4
+ data.tar.gz: 93e93f5a2603beb715b38856518ed47e698c0978c5ff02a737a7baff68357e8c
5
5
  SHA512:
6
- metadata.gz: a7d64db11e72ecd05bba646d89116da859caa2e48b9063b158780e625c7fdf802cd840c3aace32a00314762805a27fa1373b36795462d7640f4ed7385466d403
7
- data.tar.gz: 46886910fc5f3bb550fb089af740bb5c0e32cd5a1ff3dd2394a13256ddc3f6b4e9f32c48c37d2d827b2bc8edba36cd0894201aec833a2fb4d59318f7fb85b7ae
6
+ metadata.gz: 1ce185b8e9246db7b791d4d1800b39d1ad9a5f1036c99899842554c31e2400469d775acd382c2dfc27275857db58e66228062502bffefb16ddca4c3a63b346fe
7
+ data.tar.gz: 9b615db49ec2ba5e06bbfecf1710849d079661b301a85493740434eae464bfd74c250c38c31ed2cc5dfb93983cb2c7315fe27452c2f6a243051ac1f80512816b
data/.rubocop.yml CHANGED
@@ -1,12 +1,12 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
- TargetRubyVersion: 3.0
3
+ TargetRubyVersion: 2.7
4
4
  Include:
5
5
  - 'lib/**/*'
6
6
  - 'spec/**/*_spec.rb'
7
7
  - 'Gemfile'
8
8
  - 'Rakefile'
9
- - '*.gemspace'
9
+ - '*.gemspec'
10
10
  DisplayCopNames: true
11
11
 
12
12
  require:
data/README.md CHANGED
@@ -1,23 +1,37 @@
1
1
  # NetworkX.rb
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/networkx.svg)](https://badge.fury.io/rb/networkx)
4
+
3
5
  [NetworkX](https://networkx.github.io/) is a very popular Python library, that handles various use-cases of the Graph Data Structure.
4
6
  This project intends to provide a working alternative to the Ruby community, by closely mimicing as many features as possible.
5
7
 
6
8
  ## List of contents
7
9
 
8
10
  - [Installing](#installing)
11
+ - [Usage](#Usage)
9
12
  - [Document](#document)
10
- - [Roadmap](#roadmap)
11
13
  - [Contributing](#contributing)
12
14
  - [License](#license)
13
15
 
14
16
  ## Installing
15
17
 
16
- - Clone the repository or fork
17
- - Clone this repository with `git clone https://github.com/SciRuby/networkx.rb.git`
18
- - or You can fork and do clone it.
19
- - Navigate to networkx with `cd networkx.rb`
20
- - Install dependencies with `gem install bundler && bundle install`
18
+ - install it yourself as:
19
+ ```console
20
+ $ gem install networkx
21
+ ```
22
+
23
+
24
+ - Or use Bundler & Gemfile
25
+ 1. add this line to your application's Gemfile:
26
+ ```ruby
27
+ gem 'networkx'
28
+ ```
29
+ 2. And then execute:
30
+ ```console
31
+ $ bundle install
32
+ ```
33
+
34
+ ## Usage
21
35
 
22
36
  ```ruby
23
37
  require 'networkx'
@@ -30,22 +44,6 @@ g.add_edge('start', 'stop')
30
44
 
31
45
  You can read [Document](https://SciRuby.github.io/networkx.rb/) for this library.
32
46
 
33
- ## Roadmap
34
-
35
- Quite easily, any networkx user would be able to understand the number of details that have been implemented in the Python library. As a humble start towards the release of v0.1.0, the following could be the goals to achieve :
36
-
37
- - `Node` : This class should be capable of handling different types of nodes (not just `String` / `Integer`).
38
- A possible complex use-case could be XML nodes.
39
-
40
- - `Edge` : This class should be capable of handling different types of edges.
41
- Though a basic undirected Graph doesn't store any metadata in the edges, weighted edges and parametric edges are something that need to be handled.
42
-
43
- - `Graph` : The simplest of graphs.
44
- This class handles just connections between different `Node`s via `Edge`s.
45
-
46
- - `DirectedGraph` : Inherits from `Graph` class.
47
- Uses directions between `Edge`s.
48
-
49
47
  ## Contributing
50
48
 
51
49
  Your contributions are always welcome!
@@ -2,61 +2,16 @@ module NetworkX
2
2
  # Computes pagerank values for the graph
3
3
  #
4
4
  # @param graph [Graph] a graph
5
- # @param init [Array<Numeric>] initial pagerank values for the nodes
6
5
  # @param alpha [Numeric] the alpha value to compute the pagerank
7
6
  # @param eps [Numeric] tolerence to check for convergence
8
7
  # @param max_iter [Integer] max iterations for the pagerank algorithm to run
9
8
  #
10
- # @return [Array<Numeric>] pagerank values of the graph
11
- def self.pagerank(graph, init = nil, alpha = 0.85, eps = 1e-4, max_iter = 100)
12
- dim = graph.nodes.length
13
- if init.nil?
14
- init = graph.nodes(data: false).to_h{ |i| [i, 1.0 / dim] }
15
- else
16
- s = init.values.sum.to_f
17
- init = init.transform_values { |v| v / s }
18
- end
19
- raise ArgumentError, 'Init array needs to have same length as number of graph nodes!' \
20
- unless dim == init.length
21
-
22
- matrix = []
23
- elem_ind = {}
24
- p = []
25
- curr = init.values
26
- init.keys.each_with_index { |n, i| elem_ind[n] = i }
27
- graph.adj.each do |_u, u_edges|
28
- adj_arr = Array.new(dim, 0)
29
- u_edges.each do |v, _|
30
- adj_arr[elem_ind[v]] = 1
31
- end
32
- matrix << adj_arr
33
- end
34
- (0..(dim - 1)).each do |i|
35
- p[i] = []
36
- (0..(dim - 1)).each { |j| p[i][j] = matrix[i][j] / (matrix[i].sum * 1.0) }
37
- end
38
-
39
- max_iter.times do |_|
40
- prev = curr.clone
41
- dim.times do |i|
42
- ip = 0
43
- dim.times { |j| ip += p.transpose[i][j] * prev[j] }
44
- curr[i] = (alpha * ip) + ((1 - alpha) / (dim * 1.0))
45
- end
46
- err = 0
47
- dim.times { |i| err += (prev[i] - curr[i]).abs }
48
- return curr if err < eps
49
- end
50
- raise ArgumentError, 'PageRank failed to converge!'
51
- end
52
-
53
- def self.pagerank2(graph, alpha: 0.85, personalization: nil, eps: 1e-6, max_iter: 100)
9
+ # @return [Hash of Object => Float] pagerank values of the graph
10
+ def self.pagerank(graph, alpha: 0.85, personalization: nil, eps: 1e-6, max_iter: 100)
54
11
  n = graph.number_of_nodes
55
12
 
56
13
  matrix, index_to_node = NetworkX.to_matrix(graph, 0)
57
14
 
58
- # index_to_node = {0=>0, 1=>1, 2=>2, 3=>3}
59
-
60
15
  index_from_node = index_to_node.invert
61
16
 
62
17
  probabilities = Array.new(n) do |i|
@@ -84,6 +39,7 @@ module NetworkX
84
39
  err = (0...n).map{|i| (prev[i] - curr[i]).abs }.sum
85
40
  return (0...n).map{|i| [index_to_node[i], curr[i]] }.sort.to_h if err < eps
86
41
  end
42
+ warn "pagerank() failed within #{max_iter} iterations. Please inclease max_iter: or loosen eps:"
87
43
  (0...n).map{|i| [index_to_node[i], curr[i]] }.sort.to_h
88
44
  end
89
45
  end
@@ -1,3 +1,3 @@
1
1
  module NetworkX
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
data/networkx.gemspec CHANGED
@@ -13,13 +13,15 @@ Gem::Specification.new do |spec|
13
13
  spec.email = ['athityakumar@gmail.com']
14
14
  spec.summary = 'A Ruby implemenation of the well-known graph library called networkx.'
15
15
  spec.description = NetworkX::DESCRIPTION
16
- spec.homepage = 'https://github.com/athityakumar/networkx.rb'
16
+ spec.homepage = 'https://github.com/SciRuby/networkx.rb'
17
17
  spec.license = 'MIT'
18
18
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
19
  spec.bindir = 'bin'
20
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ['lib']
22
22
 
23
+ spec.required_ruby_version = '>= 2.7'
24
+
23
25
  spec.add_development_dependency 'bundler', '~> 2.0'
24
26
  spec.add_development_dependency 'rake', '~> 13.0'
25
27
  spec.add_development_dependency 'rspec', '~> 3.0'
@@ -34,4 +36,6 @@ Gem::Specification.new do |spec|
34
36
 
35
37
  spec.add_runtime_dependency 'matrix', '~> 0.4'
36
38
  spec.add_runtime_dependency 'rb_heap', '~> 1.0'
39
+
40
+ spec.metadata['rubygems_mfa_required'] = 'true'
37
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: networkx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Athitya Kumar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-25 00:00:00.000000000 Z
11
+ date: 2022-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -207,7 +207,6 @@ files:
207
207
  - ".github/PULL_REQUEST_TEMPLATE.md"
208
208
  - ".github/workflows/ci.yml"
209
209
  - ".github/workflows/doc.yml"
210
- - ".github/workflows/gem-push.yml"
211
210
  - ".gitignore"
212
211
  - ".rspec"
213
212
  - ".rubocop.yml"
@@ -259,10 +258,11 @@ files:
259
258
  - lib/networkx/traversals/edge_dfs.rb
260
259
  - lib/networkx/version.rb
261
260
  - networkx.gemspec
262
- homepage: https://github.com/athityakumar/networkx.rb
261
+ homepage: https://github.com/SciRuby/networkx.rb
263
262
  licenses:
264
263
  - MIT
265
- metadata: {}
264
+ metadata:
265
+ rubygems_mfa_required: 'true'
266
266
  post_install_message:
267
267
  rdoc_options: []
268
268
  require_paths:
@@ -271,7 +271,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
271
271
  requirements:
272
272
  - - ">="
273
273
  - !ruby/object:Gem::Version
274
- version: '0'
274
+ version: '2.7'
275
275
  required_rubygems_version: !ruby/object:Gem::Requirement
276
276
  requirements:
277
277
  - - ">="
@@ -1,45 +0,0 @@
1
- name: Ruby Gem
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
- pull_request:
7
- branches: [ main ]
8
-
9
- jobs:
10
- build:
11
- name: Build + Publish
12
- runs-on: ubuntu-latest
13
- permissions:
14
- contents: read
15
- packages: write
16
-
17
- steps:
18
- - uses: actions/checkout@v2
19
- - name: Set up Ruby 2.6
20
- uses: actions/setup-ruby@v1
21
- with:
22
- ruby-version: 2.6.x
23
-
24
- - name: Publish to GPR
25
- run: |
26
- mkdir -p $HOME/.gem
27
- touch $HOME/.gem/credentials
28
- chmod 0600 $HOME/.gem/credentials
29
- printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
30
- gem build *.gemspec
31
- gem push --KEY github --host https://rubygems.pkg.github.com/${OWNER} *.gem
32
- env:
33
- GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
34
- OWNER: ${{ github.repository_owner }}
35
-
36
- - name: Publish to RubyGems
37
- run: |
38
- mkdir -p $HOME/.gem
39
- touch $HOME/.gem/credentials
40
- chmod 0600 $HOME/.gem/credentials
41
- printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
42
- gem build *.gemspec
43
- gem push *.gem
44
- env:
45
- GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"