steffi 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +10 -0
- data/ext/libigraph.0.6.dylib +0 -0
- data/lib/steffi/communities.rb +14 -0
- data/lib/steffi/create.rb +78 -0
- data/lib/steffi/edge.rb +15 -0
- data/lib/steffi/error.rb +16 -0
- data/lib/steffi/ffi.rb +26 -0
- data/lib/steffi/graph.rb +47 -0
- data/lib/steffi/metrics.rb +41 -0
- data/lib/steffi/vector.rb +65 -0
- data/lib/steffi/version.rb +12 -0
- data/lib/steffi/vertex.rb +7 -0
- data/lib/steffi.rb +15 -0
- data/steffi.gemspec +18 -0
- metadata +74 -0
data/Gemfile
ADDED
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
|
data/lib/steffi/edge.rb
ADDED
data/lib/steffi/error.rb
ADDED
@@ -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
|
data/lib/steffi/graph.rb
ADDED
@@ -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
|
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: []
|