steffi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []