Skip to content

Commit

Permalink
Add vectors, neighbor and incident lookups
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesdabbs committed Apr 11, 2013
1 parent 7c09ddc commit 5a182a6
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 43 deletions.
16 changes: 15 additions & 1 deletion lib/steffi/edge_set.rb
Expand Up @@ -26,7 +26,7 @@ def [] n
end end


def each def each
0.upto size do |i| 0.upto size - 1 do |i|
yield self[i] yield self[i]
end end
end end
Expand All @@ -35,5 +35,19 @@ def find pair, error=false
id = FFI::MemoryPointer.new :int id = FFI::MemoryPointer.new :int
Igraph.get_eid @graph.pointer, id, pair.first, pair.last, @graph.directed?, error Igraph.get_eid @graph.pointer, id, pair.first, pair.last, @graph.directed?, error
end end

# def find_pairs *pairs
# edges = Vector.new
# error = false
# Igraph.get_eids @graph.pointer, edges.pointer, Vector.from_a(pairs), nil, @graph.directed?, error
# edges
# end

# def find_path *vertices
# edges = Vector.new
# error = false
# Igraph.get_eids @graph.pointer, edges.pointer, nil, Vector.from_a(pairs), nil, @graph.directed?, error
# edges
# end
end end
end end
58 changes: 51 additions & 7 deletions lib/steffi/ffi.rb
Expand Up @@ -34,13 +34,13 @@ def self.method_missing name, *args, &block
end end
end end


# 2.1 Graph constructors and deconstructors # 4.2.1 Graph constructors and deconstructors
bind :empty, [:pointer, :int, :bool] bind :empty, [:pointer, :int, :bool]
bind :empty_attrs, [:pointer, :int, :bool, :pointer] # graph, vertex count, directed?, (void *) attributes bind :empty_attrs, [:pointer, :int, :bool, :pointer] # graph, vertex count, directed?, (void *) attributes
bind :copy, [:pointer, :pointer] bind :copy, [:pointer, :pointer]
bind :destroy, [:pointer] bind :destroy, [:pointer]


# 2.2 Basic query operations # 4.2.2 Basic query operations
bind :vcount, [:pointer], :int bind :vcount, [:pointer], :int
bind :ecount, [:pointer], :int bind :ecount, [:pointer], :int
bind :edge, [:pointer, :int, :pointer, :pointer] bind :edge, [:pointer, :int, :pointer, :pointer]
Expand All @@ -52,21 +52,65 @@ def self.method_missing name, *args, &block
# graph, &[edge #]. &[pairs], &[path], directed?, error? # graph, &[edge #]. &[pairs], &[path], directed?, error?
bind :get_eids_multi, [:pointer, :pointer, :pointer, :pointer, :bool, :bool] bind :get_eids_multi, [:pointer, :pointer, :pointer, :pointer, :bool, :bool]


bind :neighbors, [:pointer, :pointer, :int, :int] # graph, &[result], node, mode bind :neighbors, [:pointer, :pointer, :int, :int]
bind :incident, [:pointer, :pointer, :int, :int] # graph, &[result], node, mode bind :incident, [:pointer, :pointer, :int, :int]
bind :is_directed, [:pointer], :bool bind :is_directed, [:pointer], :bool


# graph, &[results], vids, mode, loops? # graph, &[results], vids, mode, loops?
bind :degree, [:pointer, :pointer, :int, :bool] bind :degree, [:pointer, :pointer, :int, :bool]


# 2.3 Adding and deleting vertices and edges # 4.2.3 Adding and deleting vertices and edges
bind :add_edge, [:pointer, :int, :int] bind :add_edge, [:pointer, :int, :int]
bind :add_edges, [:pointer, :pointer, :pointer] # graph, [edges], (void *) attrs bind :add_edges, [:pointer, :pointer, :pointer] # graph, [edges], (void *) attrs
bind :add_vertices, [:pointer, :int, :pointer] # graph, id, (void *) attr bind :add_vertices, [:pointer, :int, :pointer] # graph, id, (void *) attr
bind :delete_edges, [:pointer, :pointer] # graph, eids bind :delete_edges, [:pointer, :pointer] # graph, eids
bind :delete_vertices, [:pointer, :pointer] # graph, vids bind :delete_vertices, [:pointer, :pointer] # graph, vids


# 2.4 Deprecated # 7.2.2
# igraph_adjacent bind :vector_init, [:pointer, :long] # vector, size
bind :vector_init_copy, [:pointer, :pointer, :long] # vector, data, length
bind :vector_init_seq, [:pointer, :double, :double] # vector, from, to
bind :vector_copy, [:pointer, :pointer] # from, to
bind :vector_destroy, [:pointer] # vector

# 7.2.3 Initializing elements
bind :vector_null, [:pointer], :void # vector
bind :vector_fill, [:pointer, :double], :void # vector, value

# 7.2.4 Accessing elements
bind :vector_e, [:pointer, :long], :double # vector, pos => value
bind :vector_e_ptr, [:pointer, :long], :pointer # vector, pos => address
bind :vector_set, [:pointer, :long, :double], :void # vector, pos, value
bind :vector_tail, [:pointer], :double # vector => value

# 7.2.5 Vector views
bind :vector_view, [:pointer, :pointer, :long], :pointer # vector, data, len => vector

# 7.2.6 Copying vectors
bind :vector_copy_to, [:pointer, :pointer], :void # vector, array
bind :vector_update, [:pointer, :pointer] # to, from
bind :vector_append, [:pointer, :pointer] # to, from
bind :vector_swap, [:pointer, :pointer] # v1, v2

# 7.2.7 Exchanging elements
# ...
# 7.2.8 Vector operations
# ...
# 7.2.9 Vector comparisons
# ...
# 7.2.10 Finding minimum and maximum
# ...
# 7.2.11 Vector properties
# ...
# 7.2.12 Searching for elements
# ...
# 7.2.13 Resizing operations
# ...
# 7.2.14 Sorting
# ...
# 7.2.15 Set operations on sorted vectors
# ...
# 7.2.16 Pointer vectors
# ...
end end
end end
67 changes: 36 additions & 31 deletions lib/steffi/vector.rb
@@ -1,16 +1,10 @@
module Steffi module Steffi

module Igraph module Igraph
bind :vector_init, [:pointer, :long], :int bind :vector_push_back, [:pointer, :double]
bind :vector_e, [:pointer, :long], :double bind :vector_size, [:pointer], :int
bind :vector_set, [:pointer, :long, :double], :void
bind :vector_size, [:pointer], :long
bind :vector_push_back, [:pointer, :double], :int
bind :vector_destroy, [:pointer], :void
end end


class Vector class Vector

class Struct < FFI::ManagedStruct class Struct < FFI::ManagedStruct
layout :stor_begin, :pointer, layout :stor_begin, :pointer,
:stor_end, :pointer, :stor_end, :pointer,
Expand All @@ -21,45 +15,56 @@ def self.release ptr
end end
end end


def self.null
new { |v| Igraph.vector_init v.pointer, 0 }
end

def self.from_a ary
v = new { |v| Igraph.vector_init v.pointer, 0 }
ary.each { |i| v << i}
v
end

include Enumerable include Enumerable


attr_reader :ptr attr_reader :pointer


def initialize def initialize
@ptr = FFI::MemoryPointer.new Vector::Struct @pointer = FFI::MemoryPointer.new Vector::Struct
Igraph.vector_init ptr, 0 yield self if block_given?
self
end end


def << obj def length
Igraph.vector_push_back ptr, obj.to_f Igraph.vector_size @pointer
end end


def [] i def << obj
Igraph.vector_e ptr, i Igraph.vector_push_back @pointer, obj.to_f
end end


def []= i, obj def [] i
Igraph.vector_set ptr, i, obj.to_f Igraph.vector_e @pointer, i
end end


def size # def []= i, obj
Igraph.vector_size ptr # Igraph.vector_set ptr, i, obj.to_f
end # end


def each def each
0.upto(size-1) { |i| yield self[i] } 0.upto length - 1 do |i|
end yield self[i]

end
def to_s
to_a.to_s
end end


def self.from_a ary # def to_s
v = new # to_a.to_s
ary.each { |i| v << i } # end
v
end


# def self.from_a ary
# v = new
# ary.each { |i| v << i }
# v
# end
end end

end end
18 changes: 16 additions & 2 deletions lib/steffi/vertex.rb
@@ -1,7 +1,21 @@
module Steffi module Steffi
class Vertex class Vertex
def initialize graph def initialize graph, id
@graph = graph @graph, @id = graph, id
end

def neighbors
mode = 3 # IGRAPH_ALL / FIXME: define and use enum
v = Vector.null
Igraph.neighbors @graph.pointer, v.pointer, @id, mode
v.to_a
end

def incident
mode = 3 # IGRAPH_ALL / FIXME: define and use enum
v = Vector.null
Igraph.incident @graph.pointer, v.pointer, @id, mode
v.map &:to_i
end end
end end
end end
12 changes: 12 additions & 0 deletions lib/steffi/vertex_set.rb
@@ -1,5 +1,7 @@
module Steffi module Steffi
class VertexSet class VertexSet
include Enumerable

def initialize graph def initialize graph
@graph = graph @graph = graph
end end
Expand All @@ -11,5 +13,15 @@ def size
def empty? def empty?
size == 0 size == 0
end end

def [] n
Vertex.new @graph, n
end

def each
0.upto size - 1 do |i|
yield self[i]
end
end
end end
end end
24 changes: 22 additions & 2 deletions spec/steffi/graph_spec.rb
Expand Up @@ -15,7 +15,7 @@
# expect { Steffi::Graph.famous 'non-existent' }.to raise_error(Steffi::Igraph::Error) # expect { Steffi::Graph.famous 'non-existent' }.to raise_error(Steffi::Igraph::Error)
# end # end


# -- 2 ----- # -- 4.1-3 -----


it 'can create empty graphs' do it 'can create empty graphs' do
g = Steffi::Graph.empty 5 g = Steffi::Graph.empty 5
Expand Down Expand Up @@ -60,5 +60,25 @@
end end


pending 'can lookup directed edges' pending 'can lookup directed edges'
pending 'can handle errors when looking up edges' pending 'can handle errors when looking up edges (eid, eids, eids_multi)'

# it 'can look up a list of edges by vertex' do
# g = Steffi::Graph.full 3
# g.edges.find_pairs([0,1], [1,2]).should == [0, 1]
# end

# it 'can look up a list of edges in a path' do
# g = Steffi::Graph.full 3
# g.edges.find_path([0,1,2]).should == [0, 1]
# end

it 'can look up neighbors' do
g = Steffi::Graph.full 5
g.vertices.first.neighbors.should == [1, 2, 3, 4]
end

it 'knows incident edges' do
g = Steffi::Graph.full 3
g.vertices.first.incident.should == [0, 1]
end
end end
5 changes: 5 additions & 0 deletions spec/steffi/vector_spec.rb
@@ -1,6 +1,11 @@
require 'helper' require 'helper'


describe Steffi::Vector do describe Steffi::Vector do
it 'can be copied from an array' do
v = Steffi::Vector.from_a [0, 1, 2]
v.length.should == 3
end

# subject do # subject do
# v = Steffi::Vector.new # v = Steffi::Vector.new
# v << 3.1415 # v << 3.1415
Expand Down

0 comments on commit 5a182a6

Please sign in to comment.