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 +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: []
|