abstract_graph 1.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +13 -5
  2. data/Rakefile +11 -1
  3. data/lib/abstract_graph.rb +1 -0
  4. data/lib/abstract_graph/composition.rb +1 -1
  5. data/lib/abstract_graph/composition/edge.rb +5 -0
  6. data/lib/abstract_graph/composition/edge/initialize.rb +6 -0
  7. data/lib/abstract_graph/composition/edge/is_coincident.rb +5 -2
  8. data/lib/abstract_graph/composition/unique_name_collection.rb +28 -0
  9. data/lib/abstract_graph/composition/unique_name_collection/add.rb +23 -0
  10. data/lib/abstract_graph/composition/unique_name_collection/delete.rb +20 -0
  11. data/lib/abstract_graph/composition/unique_name_collection/dup.rb +24 -0
  12. data/lib/abstract_graph/composition/unique_name_collection/each.rb +18 -0
  13. data/lib/abstract_graph/composition/unique_name_collection/find.rb +18 -0
  14. data/lib/abstract_graph/composition/unique_name_collection/initialize.rb +22 -0
  15. data/lib/abstract_graph/composition/unique_name_collection/link.rb +42 -0
  16. data/lib/abstract_graph/composition/unique_name_collection/method_missing.rb +18 -0
  17. data/lib/abstract_graph/composition/unique_name_collection/rename.rb +34 -0
  18. data/lib/abstract_graph/composition/unique_name_collection/ticket.rb +18 -0
  19. data/lib/abstract_graph/composition/unique_name_collection/ticket/get.rb +20 -0
  20. data/lib/abstract_graph/composition/unique_name_collection/ticket/initialize.rb +20 -0
  21. data/lib/abstract_graph/composition/unique_name_collection/ticket/set.rb +20 -0
  22. data/lib/abstract_graph/composition/vertex.rb +5 -1
  23. data/lib/abstract_graph/composition/vertex/initialize.rb +6 -0
  24. data/lib/abstract_graph/graph.rb +1 -0
  25. data/lib/abstract_graph/graph/add_edge.rb +9 -8
  26. data/lib/abstract_graph/graph/add_vertex.rb +5 -2
  27. data/lib/abstract_graph/graph/adjacency_list.rb +8 -3
  28. data/lib/abstract_graph/graph/change_edge_name.rb +6 -4
  29. data/lib/abstract_graph/graph/change_vertex_name.rb +5 -3
  30. data/lib/abstract_graph/graph/connected.rb +36 -0
  31. data/lib/abstract_graph/graph/delete_edge.rb +5 -4
  32. data/lib/abstract_graph/graph/delete_vertex.rb +5 -4
  33. data/lib/abstract_graph/graph/dup.rb +8 -3
  34. data/lib/abstract_graph/graph/get_edge_name.rb +7 -4
  35. data/lib/abstract_graph/graph/has_edge.rb +6 -3
  36. data/lib/abstract_graph/graph/has_vertex.rb +6 -3
  37. data/lib/abstract_graph/graph/initialize.rb +5 -1
  38. data/lib/abstract_graph/graph/is_adjacent.rb +9 -7
  39. data/lib/abstract_graph/graph/merge_vertices.rb +16 -14
  40. data/lib/abstract_graph/graph/split_vertex.rb +10 -7
  41. data/lib/abstract_graph/graph/templates/complete_bipartite_graph.rb +7 -5
  42. data/lib/abstract_graph/graph/templates/complete_graph.rb +8 -6
  43. data/lib/abstract_graph/graph/templates/cycle_graph.rb +6 -5
  44. data/lib/abstract_graph/graph/templates/path_graph.rb +6 -4
  45. data/lib/abstract_graph/graph/templates/petersen_graph.rb +8 -2
  46. data/lib/abstract_graph/version.rb +1 -1
  47. data/spec/abstract_graph/composition/{uniquenamecollection → unique_name_collection}/add_spec.rb +0 -0
  48. data/spec/abstract_graph/composition/{uniquenamecollection → unique_name_collection}/dup_spec.rb +0 -0
  49. data/spec/abstract_graph/composition/unique_name_collection/each_spec.rb +38 -0
  50. data/spec/abstract_graph/composition/unique_name_collection/find_spec.rb +33 -0
  51. data/spec/abstract_graph/composition/{uniquenamecollection → unique_name_collection}/initialize_spec.rb +0 -0
  52. data/spec/abstract_graph/composition/{uniquenamecollection → unique_name_collection}/link_spec.rb +0 -0
  53. data/spec/abstract_graph/composition/{uniquenamecollection → unique_name_collection}/method_missing_spec.rb +4 -15
  54. data/spec/abstract_graph/composition/{uniquenamecollection → unique_name_collection}/rename_spec.rb +1 -1
  55. data/spec/abstract_graph/composition/{uniquenamecollection_spec.rb → unique_name_collection_spec.rb} +0 -0
  56. data/spec/abstract_graph/graph/add_edge_spec.rb +1 -1
  57. data/spec/abstract_graph/graph/connected_spec.rb +39 -0
  58. data/tasks/benchmark.rb +47 -0
  59. data/tasks/create_method.rb +64 -0
  60. data/tasks/list_methods.rb +5 -0
  61. metadata +45 -32
  62. data/lib/abstract_graph/composition/uniquenamecollection.rb +0 -22
  63. data/lib/abstract_graph/composition/uniquenamecollection/add.rb +0 -19
  64. data/lib/abstract_graph/composition/uniquenamecollection/dup.rb +0 -20
  65. data/lib/abstract_graph/composition/uniquenamecollection/initialize.rb +0 -14
  66. data/lib/abstract_graph/composition/uniquenamecollection/link.rb +0 -32
  67. data/lib/abstract_graph/composition/uniquenamecollection/method_missing.rb +0 -14
  68. data/lib/abstract_graph/composition/uniquenamecollection/rename.rb +0 -28
  69. data/lib/abstract_graph/composition/vertex/delete.rb +0 -12
  70. data/spec/abstract_graph/composition/vertex/delete_spec.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7a6bbd7d12e215a907b79ebaef777d9282f4e283
4
- data.tar.gz: 8207dfe01745e9a6c50a75bc59f79a2f1248045f
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NTk2OWI3Y2Y4YmU0NDAyNjBkNjI2N2RhMTk2OGY2NjAzM2Y4YmQ5OQ==
5
+ data.tar.gz: !binary |-
6
+ OTFmYmYwOTFjNzQ3OThlNGU4OTM0MjFkY2MzN2U1MmM5ODQ5YWNjYw==
5
7
  SHA512:
6
- metadata.gz: f7c6d5082e389a24a6db96e4c103825803ecfd8ebc1f41117192093a349dfe7104329d14d7c7b1098f04a783f225cfbbffd25242514a0cad5e2b569e61564e3c
7
- data.tar.gz: 406b2b87218d98b9832fe479791192c38098ca7453a8e9fcb3bb68e9a7050ffee51aa4a4a2fdc97a7a7ab84d268ec1ee80fe35faeca8a1d9745cc90633911e06
8
+ metadata.gz: !binary |-
9
+ Mzg5OGFkMDY1ZmMwMzFiYjJlMDA5MDljZTljNGE0ZGE1NTU3ZDNlODQ4MTBj
10
+ Mzc1MTQ1MWY2OGRkOTcwZDE1M2FmZjI1NWQ5NGU2ZjVhODJiMzM3NGE4ZDI5
11
+ Yzc0N2Y0NDU3YWQzNTRjNmM1MDAzM2YyMjY2ZTExYmMyZGFkODE=
12
+ data.tar.gz: !binary |-
13
+ Yjk5NWMwMDRkMWM0ZWVkNGM3YmQxZGM5N2I2ZjUwMWZhN2Q4YWMwNzc3YWZj
14
+ MjIxNGJjOGY1NzU3YTRiN2RhYjc2MWM2MWNjOGVkMDJhMDU3YzVlMWRjNzEx
15
+ YmY2NmQ3ZTE2ZTFjMWEzNGY5OTAzZjUwMzc2MTdmODEwZmU3ZmU=
data/Rakefile CHANGED
@@ -1,6 +1,11 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
3
2
 
3
+ # Add paths
4
+ $:.unshift File.expand_path('..', __FILE__)
5
+ $:.unshift File.expand_path('../lib', __FILE__)
6
+
7
+ require "lib/abstract_graph"
8
+ require "bundler/gem_tasks"
4
9
  require "rspec/core/rake_task"
5
10
 
6
11
  desc "Run specs"
@@ -12,3 +17,8 @@ task :default => :spec
12
17
 
13
18
  desc "Run tests (same as rake spec)"
14
19
  task :test => :spec
20
+
21
+ require "tasks/create_method"
22
+ require "tasks/list_methods"
23
+ require "tasks/benchmark"
24
+
@@ -1,3 +1,4 @@
1
+ require "set"
1
2
  require "abstract_graph/version"
2
3
  require "abstract_graph/composition"
3
4
  require "abstract_graph/graph"
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "abstract_graph/composition/vertex"
4
4
  require "abstract_graph/composition/edge"
5
- require "abstract_graph/composition/uniquenamecollection"
5
+ require "abstract_graph/composition/unique_name_collection"
6
6
 
7
7
  module AbstractGraph
8
8
  module Composition
@@ -8,6 +8,11 @@ module AbstractGraph
8
8
  attr_reader :name
9
9
  attr_accessor :vertices
10
10
 
11
+ # d: Set the name of edge.
12
+ # a: Throw an ArgumentError if the name is not a string
13
+ # t: constant
14
+ # p: name should be string
15
+ # r: The name
11
16
  def name=(name)
12
17
  raise ArgumentError if name.class != String
13
18
  @name = name
@@ -4,6 +4,12 @@ module AbstractGraph
4
4
  module Composition
5
5
  class Edge
6
6
 
7
+ # d: Create an edge with a name and two vertices
8
+ # a: Check if a string is passed, otherwise, the next two must be the vertices
9
+ # t: constant
10
+ # p: name if we want to name our edge, otherwise it'll be ""
11
+ # The next two args are the two vertices that this edge connects
12
+ # r: Edge object
7
13
  def initialize ( *args )
8
14
  if args[0].class == String
9
15
  @name = args[0]
@@ -4,10 +4,13 @@ module AbstractGraph
4
4
  module Composition
5
5
  class Edge
6
6
 
7
- # returns whether or not e covers the same two vertices
7
+ # d: Check if two edges are covering the same vertices.
8
+ # a: Compare the object_id, by extracting them and sorting them.
9
+ # t: constant
8
10
  # p: Edge e is the comparing edge
11
+ # r: true or false depending on coincident
9
12
  def is_coincident? e
10
- return ( ( e.vertices | @vertices ) - ( e.vertices & @vertices ) ).empty?
13
+ return e.vertices.map{|v| v.object_id}.sort == @vertices.map{|v| v.object_id}.sort
11
14
  end
12
15
 
13
16
  end
@@ -0,0 +1,28 @@
1
+ # required in "abstract_graph/composition"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+
6
+ # public UniqueNameCollection class
7
+ # Note that the collection of this
8
+ # class must implement #name
9
+ class UniqueNameCollection
10
+ attr_accessor :collection
11
+ attr_accessor :namespace_ticket
12
+ @@namespace = {}
13
+ @@namespace_counter = 0
14
+ end
15
+
16
+ end
17
+ end
18
+
19
+ require "abstract_graph/composition/unique_name_collection/initialize"
20
+ require "abstract_graph/composition/unique_name_collection/add"
21
+ require "abstract_graph/composition/unique_name_collection/dup"
22
+ require "abstract_graph/composition/unique_name_collection/method_missing"
23
+ require "abstract_graph/composition/unique_name_collection/link"
24
+ require "abstract_graph/composition/unique_name_collection/rename"
25
+ require "abstract_graph/composition/unique_name_collection/each"
26
+ require "abstract_graph/composition/unique_name_collection/ticket"
27
+ require "abstract_graph/composition/unique_name_collection/delete"
28
+ require "abstract_graph/composition/unique_name_collection/find"
@@ -0,0 +1,23 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Adds the object to our UNC.
8
+ # a: Ensure that our namespace doesn't already have the object name and
9
+ # then add the object to namespace and collection.
10
+ # t: constant
11
+ # p: Object o that implements #name
12
+ # r: The object o itself
13
+ def add( o )
14
+ set = @@namespace[@namespace_ticket.get][0]
15
+ raise IndexError if set.include? o.name
16
+ set << o.name
17
+ @collection[o.name] = o
18
+ self
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Delete the object from the collection
8
+ # a: Delete the object from the collection and from the nameserver
9
+ # t: constant
10
+ # p: name of object we want to delete
11
+ # r: object that was deleted
12
+ def delete( name )
13
+ return nil unless @collection[name]
14
+ @@namespace[@namespace_ticket.get][0].delete name
15
+ @collection.delete name
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Deep copies our object.
8
+ # a: Does a deep copy of the object, in otherwords
9
+ # copies every object in the collection.
10
+ # t: |collection|
11
+ # p:
12
+ # r: the copy of the UNC
13
+ def dup
14
+ other = self.class.new
15
+ # copy each object in our collection over
16
+ @collection.each_value do |o|
17
+ other.add o.dup
18
+ end
19
+ other
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Iterate through all objects.
8
+ # a: Enumerates through every object.
9
+ # t: constant
10
+ # p: block that we pass in each object
11
+ # r: Enumerable if no block, collection if yes block
12
+ def each( &block )
13
+ @collection.each_value( &block )
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Finds a stored object given the name.
8
+ # a: Goes into collection and retrieves based on key.
9
+ # t: constant
10
+ # p: name of object
11
+ # r: object
12
+ def find(name)
13
+ @collection[name]
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Initializes the UNC.
8
+ # a: Assign itself a namespace_ticket and start the collection by adding
9
+ # the namespace a set of names and backreference of tickets
10
+ # t: constant
11
+ # p:
12
+ # r: new UNC
13
+ def initialize
14
+ @collection = Hash.new
15
+ @@namespace_counter += 1
16
+ @namespace_ticket = Ticket.new(@@namespace_counter)
17
+ @@namespace[@@namespace_counter] = [Set.new, Set.new([@namespace_ticket])]
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,42 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Links the UNC so they have unique namespace.
8
+ # a: check the intersection of namespace so that there's no collision, then
9
+ # reset the namespace to contain the shared namespaces and update tickets
10
+ # t: |intersection and size of ticket|
11
+ # p: UniqueNameCollection unc is the other collection we want to link
12
+ # r: false if the two collections are not already mutually unique
13
+ # UNC if it succeeds
14
+ def link( unc )
15
+ our_ticket = @namespace_ticket.get
16
+ other_ticket = unc.namespace_ticket.get
17
+ our_namespace = @@namespace[our_ticket]
18
+ other_namespace = @@namespace[other_ticket]
19
+
20
+ namespace_intersection = our_namespace[0] & other_namespace[0]
21
+ return nil unless namespace_intersection.empty?
22
+
23
+ # Create the assumption that |our_namespace| >= |other_namespace|
24
+ if other_namespace[0].size > our_namespace[0].size
25
+ our_namespace, other_namespace = other_namespace, our_namespace
26
+ our_ticket, other_ticket = other_ticket, our_ticket
27
+ end
28
+
29
+ # Assume it is fine to link now, add to the larger namespace
30
+ our_namespace[0].merge other_namespace[0]
31
+ other_namespace[1].map do |ticket|
32
+ ticket.set our_ticket
33
+ end
34
+ our_namespace[1].merge other_namespace[1]
35
+
36
+ @@namespace.delete other_ticket
37
+ self
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Handles everything.
8
+ # a: Pass all methods into the hash.
9
+ # t:
10
+ # p:
11
+ # r:
12
+ def method_missing( m, *args, &block )
13
+ @collection.values.send( m.to_sym, *args, &block )
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: Change the name of a vertex in our graph.
8
+ # a: Check the namespace otherwise, set collection and add to namespace
9
+ # t: constant
10
+ # p: String oldname represents the current vertex's name
11
+ # String newname represents the new name of our vertex
12
+ # r: UNC itself
13
+ def rename( oldname, newname )
14
+ return nil unless @collection.has_key? oldname
15
+
16
+ nameserver = @@namespace[@namespace_ticket.get][0]
17
+ throw Exception if nameserver.include? newname
18
+
19
+ # change the nameserver
20
+ nameserver.delete oldname
21
+ nameserver << newname
22
+
23
+ # rename the object itself
24
+ @collection[oldname].name = newname
25
+ # remap the name
26
+ @collection[newname] = @collection[oldname]
27
+ # clear the old name
28
+ @collection.delete oldname
29
+ self
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,18 @@
1
+ # required in "abstract_graph/composition/unique_name_collection"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+
7
+ # d: This is the ticket for the nameserver in UNC
8
+ class Ticket
9
+ attr_accessor :number
10
+ end
11
+
12
+ end
13
+ end
14
+ end
15
+
16
+ require "abstract_graph/composition/unique_name_collection/ticket/initialize"
17
+ require "abstract_graph/composition/unique_name_collection/ticket/get"
18
+ require "abstract_graph/composition/unique_name_collection/ticket/set"
@@ -0,0 +1,20 @@
1
+ # required in "abstract_graph/composition/unique_name_collection/ticket"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+ class Ticket
7
+
8
+ # d: Returns the number
9
+ # a:
10
+ # t: constant
11
+ # p:
12
+ # r: @number
13
+ def get
14
+ @number
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # required in "abstract_graph/composition/unique_name_collection/ticket"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+ class Ticket
7
+
8
+ # d: Returns the Ticket object
9
+ # a: Sets number
10
+ # t: constant
11
+ # p: number to initialize with
12
+ # r: self
13
+ def initialize( number )
14
+ @number = number
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ # required in "abstract_graph/composition/unique_name_collection/ticket"
2
+
3
+ module AbstractGraph
4
+ module Composition
5
+ class UniqueNameCollection
6
+ class Ticket
7
+
8
+ # d: Sets the Ticket number.
9
+ # a: Sets number
10
+ # t: constant
11
+ # p: number to set to
12
+ # r: self
13
+ def set( number )
14
+ @number = number
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end