steffi 0.0.1

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.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source :rubygems
2
+ gemspec
3
+
4
+ group :development do
5
+ gem 'pry'
6
+ end
7
+
8
+ group :test do
9
+ gem 'rspec'
10
+ end
Binary file
@@ -0,0 +1,14 @@
1
+ module Steffi
2
+
3
+ module Igraph
4
+ bind :community_multilevel, [:pointer, :pointer, :pointer, :pointer, :pointer], :int
5
+ end
6
+
7
+ class Graph
8
+ def communities
9
+ membership = Vector.new
10
+ Igraph.community_multilevel ptr, nil, membership.ptr, nil, nil
11
+ membership
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,78 @@
1
+ module Steffi
2
+
3
+ module Igraph
4
+ bind :read_graph_edgelist, [:pointer, :pointer, :int, :bool], :int
5
+ bind :atlas, [:pointer, :int], :int
6
+ bind :cited_type_game, [:pointer, :int, :pointer, :pointer, :int, :bool], :int
7
+ bind :erdos_renyi_game, [:pointer, :int, :int, :double, :bool, :bool], :int
8
+ bind :forest_fire_game, [:pointer, :int, :double, :double, :int, :bool], :int
9
+ bind :famous, [:pointer, :string], :int
10
+ bind :full, [:pointer, :int, :bool, :bool], :int
11
+ bind :ring, [:pointer, :int, :bool, :bool, :bool], :int
12
+ bind :star, [:pointer, :int, :int, :int], :int
13
+ bind :tree, [:pointer, :int, :int, :int], :int
14
+ end
15
+
16
+ class Graph
17
+
18
+ class << self
19
+
20
+ def load path
21
+ stream = C.fopen path, 'r'
22
+ g = from :read_graph_edgelist, stream, 0, false
23
+ C.fclose stream
24
+ g
25
+ end
26
+
27
+ def atlas i
28
+ from :atlas, i
29
+ end
30
+
31
+ def citations n, p
32
+ types = (0...n).to_a
33
+ types = Vector.from_a(types).ptr
34
+ attractivity = 1.0 / p
35
+ prefs = [attractivity] * (n+1)
36
+ prefs = Vector.from_a(prefs).ptr
37
+ from :cited_type_game, n, types, prefs, 1, false
38
+ end
39
+
40
+ def erdos_renyi n, k
41
+ from :erdos_renyi_game, 1, n, k, false, false
42
+ end
43
+
44
+ def famous name
45
+ from :famous, name.to_s
46
+ end
47
+
48
+ def forest_fire n, k
49
+ from :forest_fire_game, n, 0.01/k, 1, 2, false
50
+ end
51
+
52
+ def full n
53
+ from :full, n, false, false
54
+ end
55
+
56
+ def ring n
57
+ from :ring, n, false, false, true
58
+ end
59
+
60
+ def star n
61
+ from :star, n, 2, 0
62
+ end
63
+
64
+ def tree n, k
65
+ from :tree, n, k, 2
66
+ end
67
+
68
+ private #-------------------------------------------------------
69
+
70
+ def from name, *args
71
+ Graph.new do |g|
72
+ Igraph.send name, g.ptr, *args
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,15 @@
1
+ module Steffi
2
+ class Edge
3
+ attr_accessor :graph, :from, :to
4
+
5
+ def initialize graph,from,to
6
+ @graph = graph
7
+ @from = from
8
+ @to = to
9
+ end
10
+
11
+ def to_s
12
+ "(#{from},#{to})"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Steffi
2
+ module Igraph
3
+ callback :error_handler, [:string, :string, :int, :int], :void
4
+
5
+ bind :set_error_handler, [:error_handler], :error_handler
6
+ bind :strerror, [:int], :string
7
+
8
+ class Error < StandardError; end
9
+
10
+ ErrorHandler = Proc.new do |reason, file, line, code|
11
+ raise Error.new "#{strerror code}: #{reason} (#{file}:#{line})"
12
+ end
13
+
14
+ set_error_handler ErrorHandler
15
+ end
16
+ end
data/lib/steffi/ffi.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'ffi'
2
+
3
+ module Steffi
4
+
5
+ module C
6
+ extend FFI::Library
7
+ ffi_lib :c
8
+
9
+ attach_function :fopen, [:pointer, :pointer], :pointer
10
+ attach_function :fclose, [:pointer], :int
11
+ end
12
+
13
+ module Igraph
14
+ extend FFI::Library
15
+ ffi_lib File.expand_path('../../../ext/libigraph.0.6.dylib', __FILE__)
16
+
17
+ def self.bind name, in_t, out_t
18
+ attach_function :"igraph_#{name}", in_t, out_t
19
+ end
20
+
21
+ def self.method_missing name, *args, &block
22
+ iname = :"igraph_#{name}"
23
+ respond_to?(iname) ? send(iname, *args, &block) : super
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,47 @@
1
+ module Steffi
2
+
3
+ module Igraph
4
+ bind :write_graph_edgelist, [:pointer, :pointer], :int
5
+ bind :destroy, [:pointer], :int
6
+ end
7
+
8
+ class Graph
9
+
10
+ class Struct < FFI::ManagedStruct
11
+ layout :n, :int,
12
+ :directed, :bool,
13
+ :from, Vector::Struct,
14
+ :to, Vector::Struct,
15
+ :oi, Vector::Struct,
16
+ :ii, Vector::Struct,
17
+ :os, Vector::Struct,
18
+ :is, Vector::Struct,
19
+ :attr, :pointer
20
+
21
+ def self.release ptr
22
+ Igraph.destroy ptr
23
+ end
24
+ end
25
+
26
+ attr_reader :ptr
27
+
28
+ def initialize
29
+ @ptr = FFI::MemoryPointer.new Struct
30
+ yield self if block_given?
31
+ end
32
+
33
+ def dump path
34
+ stream = C.fopen path, 'w'
35
+ Igraph.write_graph_edgelist ptr, stream
36
+ C.fclose stream
37
+ end
38
+
39
+ def d3
40
+ {
41
+ nodes: communities.each_with_index.map { |c,i| { name: i, group: c.to_i } },
42
+ links: edges.map { |e| { source: e.from, target: e.to, weight: 1 } }
43
+ }
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,41 @@
1
+ module Steffi
2
+ module Igraph
3
+ bind :diameter, [:pointer, :pointer, :pointer, :pointer, :pointer, :int, :int], :int
4
+ bind :ecount, [:pointer], :int
5
+ bind :vcount, [:pointer], :int
6
+
7
+ bind :edge, [:pointer, :int, :pointer, :pointer], :int
8
+ end
9
+
10
+ class Graph
11
+ def diameter
12
+ d = FFI::MemoryPointer.new :int
13
+ Igraph.diameter ptr, d, nil, nil, nil, 0, 1
14
+ d.get_int 0
15
+ end
16
+
17
+ def ecount
18
+ Igraph.ecount ptr
19
+ end
20
+
21
+ def vcount
22
+ Igraph.vcount ptr
23
+ end
24
+
25
+ def stats
26
+ Hash[ %w{ diameter ecount vcount }.map { |n| [ n, send(n) ] } ]
27
+ end
28
+
29
+ def edge i
30
+ from = FFI::MemoryPointer.new :int
31
+ to = FFI::MemoryPointer.new :int
32
+ Igraph.edge ptr, i, from, to
33
+ Edge.new self, from.get_int(0), to.get_int(0)
34
+ end
35
+
36
+ def edges
37
+ 0.upto(ecount - 1).map { |i| edge i }
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,65 @@
1
+ module Steffi
2
+
3
+ module Igraph
4
+ bind :vector_init, [:pointer, :long], :int
5
+ bind :vector_e, [:pointer, :long], :double
6
+ bind :vector_set, [:pointer, :long, :double], :void
7
+ bind :vector_size, [:pointer], :long
8
+ bind :vector_push_back, [:pointer, :double], :int
9
+ bind :vector_destroy, [:pointer], :void
10
+ end
11
+
12
+ class Vector
13
+
14
+ class Struct < FFI::ManagedStruct
15
+ layout :stor_begin, :pointer,
16
+ :stor_end, :pointer,
17
+ :end, :pointer
18
+
19
+ def self.release ptr
20
+ Igraph.vector_destroy ptr
21
+ end
22
+ end
23
+
24
+ include Enumerable
25
+
26
+ attr_reader :ptr
27
+
28
+ def initialize
29
+ @ptr = FFI::MemoryPointer.new Vector::Struct
30
+ Igraph.vector_init ptr, 0
31
+ end
32
+
33
+ def << obj
34
+ Igraph.vector_push_back ptr, obj.to_f
35
+ end
36
+
37
+ def [] i
38
+ Igraph.vector_e ptr, i
39
+ end
40
+
41
+ def []= i, obj
42
+ Igraph.vector_set ptr, i, obj.to_f
43
+ end
44
+
45
+ def size
46
+ Igraph.vector_size ptr
47
+ end
48
+
49
+ def each
50
+ 0.upto(size-1) { |i| yield self[i] }
51
+ end
52
+
53
+ def to_s
54
+ to_a.to_s
55
+ end
56
+
57
+ def self.from_a ary
58
+ v = new
59
+ ary.each { |i| v << i }
60
+ v
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,12 @@
1
+ module Steffi
2
+ class Version
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ PATCH = 1
6
+ PRE = nil
7
+
8
+ def self.to_s
9
+ [MAJOR, MINOR, PATCH, PRE].compact.join '.'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module Steffi
2
+ class Vertex
3
+ def initialize graph
4
+ @graph = graph
5
+ end
6
+ end
7
+ end
data/lib/steffi.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'steffi/ffi'
2
+ require 'steffi/error'
3
+
4
+ require 'steffi/vector'
5
+
6
+ require 'steffi/graph'
7
+ require 'steffi/vertex'
8
+ require 'steffi/edge'
9
+
10
+ require 'steffi/create'
11
+ require 'steffi/metrics'
12
+ require 'steffi/communities'
13
+
14
+ module Steffi
15
+ end
data/steffi.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ lib = File.expand_path '../lib', __FILE__
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'steffi/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'steffi'
7
+ s.version = Steffi::Version
8
+ s.date = '2013-01-27'
9
+ s.summary = 'FFI bindings to the igraph library'
10
+ s.description = s.summary
11
+ s.authors = ['James Dabbs']
12
+ s.email = 'jamesdabbs@gmail.com'
13
+ s.files = %w{ Gemfile steffi.gemspec }
14
+ s.files += Dir['lib/**/*.rb'] + Dir['ext/**/*']
15
+ s.homepage = 'http://github.com/jamesdabbs/steffi'
16
+
17
+ s.add_dependency 'ffi'
18
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: steffi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - James Dabbs
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-01-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: FFI bindings to the igraph library
31
+ email: jamesdabbs@gmail.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - Gemfile
37
+ - steffi.gemspec
38
+ - lib/steffi/communities.rb
39
+ - lib/steffi/create.rb
40
+ - lib/steffi/edge.rb
41
+ - lib/steffi/error.rb
42
+ - lib/steffi/ffi.rb
43
+ - lib/steffi/graph.rb
44
+ - lib/steffi/metrics.rb
45
+ - lib/steffi/vector.rb
46
+ - lib/steffi/version.rb
47
+ - lib/steffi/vertex.rb
48
+ - lib/steffi.rb
49
+ - ext/libigraph.0.6.dylib
50
+ homepage: http://github.com/jamesdabbs/steffi
51
+ licenses: []
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 1.8.24
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: FFI bindings to the igraph library
74
+ test_files: []