classbench 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36de8ab8ecd1c0cf26aba7cf4313975fac9d853c
4
- data.tar.gz: eff25cbca6958cc159171bb801312409c87f2281
3
+ metadata.gz: 0476c25d8f3928d4d671593eb0008199838443a1
4
+ data.tar.gz: af9f48ef68198ea312cf5bf2c7e7f7264df1ddee
5
5
  SHA512:
6
- metadata.gz: a2aedb99efd751401e1fbb73c534b78ca4e59779266e4088733cc318accaca03b9d46574ba3cad044d37f82e33f734a4cca6ef612914c2c0406cb27a7724f88f
7
- data.tar.gz: 72594c05c6fa23843e776de0cd071f5cad30fbb2b114f9a8db03ac92579e657e1b4e4d1d8f085f44ed0f8073bd0c82282d3d9a22cb43474bde0e6dc39c5bd8dc
6
+ metadata.gz: 7df7583555c764b29b9a3b2bfa496fe58f20350b22f449d83bda3a09242c4eea79b2361306a301781cd32904be09ae2de8b34ebfb9dc8c04938cb7bb5e93431a
7
+ data.tar.gz: 470d1129f07c85f2db6081a419db550cd9ff096aa5879748b2fade35e80b189424df2165b302de5f441aceb984b23ce892514d815b0edc24da1e368c987c6c7a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.5
data/classbench.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: classbench 0.0.3 ruby lib
5
+ # stub: classbench 0.0.5 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "classbench"
9
- s.version = "0.0.3"
9
+ s.version = "0.0.5"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Adam Lucansky", "Gianni Antichi", "Jiri Matousek"]
14
- s.date = "2015-06-20"
14
+ s.date = "2015-06-21"
15
15
  s.description = "Statistical generation of firewall/OpenFLOW rules based on seed file (IN DEVELOPMENT)"
16
16
  s.email = "adamlucansky@gmail.com"
17
17
  s.extra_rdoc_files = [
@@ -28,8 +28,8 @@ Gem::Specification.new do |s|
28
28
  "VERSION",
29
29
  "classbench.gemspec",
30
30
  "lib/classbench.rb",
31
- "lib/classbench/tier.rb",
32
- "lib/classbench/tier_node.rb",
31
+ "lib/classbench/trie.rb",
32
+ "lib/classbench/trie_node.rb",
33
33
  "test/helper.rb",
34
34
  "test/test_classbench.rb",
35
35
  "test/test_docopt.rb"
@@ -0,0 +1,92 @@
1
+ module Classbench
2
+
3
+ # Structure representing trie statistics proposed in the ClassBench tool.
4
+ #
5
+ # Array members store statistics defined separately for each level of the
6
+ # trie. Prefix nesting is defined for the whole trie.
7
+ Struct.new("ClassbenchStats",
8
+ # (float[]) number of prefixes (not prefix nodes) with given length
9
+ :prefix_lengths,
10
+ # (float[]) probability of node with only one child (from all non-leaf nodes),
11
+ :branching_one_child,
12
+ # (float[]) probability of node with two children (from all non-leaf nodes)
13
+ :branching_two_children,
14
+ # (float[]) average relative weight ratio of lighter vs heavier subtree (nodes with two children only)
15
+ :skew,
16
+ # (int) maximum number of prefix nodes on an arbitrary path in the trie
17
+ :prefix_nesting)
18
+
19
+
20
+ # Structure representing statistics related to trie nodes.
21
+ #
22
+ # All the statistics are stored separately for each level of the trie.
23
+ Struct.new("NodeStats",
24
+ :leaf, # (int[]) number of leaf nodes
25
+ :one_child, # (int[]) number of nodes with one child only
26
+ :two_children, # (int[]) number of nodes with both children
27
+ :prefix, # (int[]) number of prefix nodes (not prefixes)
28
+ :non_prefix # (int[]) number of non-prefix nodes
29
+ )
30
+
31
+ # Structure representing statistics related to the trie.
32
+ #
33
+ # Statistics are divided into two groups:
34
+ # 1) statistics proposed in ClassBench tool and
35
+ # 2) statistics related to trie nodes.
36
+ #
37
+ Struct.new("TrieStats", :classbench_stats, :node_stats)
38
+
39
+ # Class for representation of a n-ary prefix tree - trie.
40
+ class Trie
41
+ attr_accessor :root
42
+
43
+ def initialize
44
+ end
45
+
46
+ def insert(prefix)
47
+ self.root = TrieNode.new(0) if not root
48
+
49
+ # Empty prefix
50
+ if prefix.size == 0
51
+ root.increment_prefixes
52
+ return
53
+ end
54
+
55
+ current_node = self.root
56
+ next_node = nil
57
+
58
+ # For each char
59
+ prefix.split('').each_with_index do |ch, i|
60
+ next_node = current_node.subtree[ch]
61
+
62
+ if next_node.nil?
63
+ next_node = TrieNode.new(i+1)
64
+ current_node.subtree[ch] = next_node
65
+ end
66
+
67
+ current_node = next_node
68
+ end
69
+
70
+ current_node.increment_prefixes
71
+ end
72
+
73
+ # Erase not implemented/neccessary
74
+
75
+ def get_stats
76
+ return if not root
77
+ root.compute_weights
78
+
79
+ level = root.level
80
+
81
+ que = [root]
82
+ # BFS, append from right, take from left
83
+ while not que.empty?
84
+ node = que.shift # take one from left
85
+
86
+ node.subtree.each do |char, subnode|
87
+ que << subnode
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,8 +1,8 @@
1
- class TierNode
1
+ class TrieNode
2
2
  attr_accessor :level # depth of node
3
3
  attr_accessor :prefixes_count # number of occurences of the prefix
4
4
 
5
- attr_accessor :subtree # Hash mapping character -> TierNode
5
+ attr_accessor :subtree # Hash mapping character -> TrieNode
6
6
  attr_accessor :subtree_weights
7
7
 
8
8
  def initialize(level)
data/lib/classbench.rb CHANGED
@@ -1,11 +1,26 @@
1
- require 'classbench/tier'
2
- require 'classbench/tier_node'
1
+ require 'classbench/trie'
2
+ require 'classbench/trie_node'
3
+
4
+ require 'pp'
3
5
 
4
6
  module Classbench
7
+ def self.generate_prefix
8
+ len = rand(33)
9
+
10
+ (0...len).map { [0,1][rand(2)]}.join
11
+ end
12
+
5
13
  def self.hi
6
- #puts "Hello world"
7
- t = Tier.new
8
- t.insert "1010000"
14
+ t = Trie.new
15
+ #2.times { t.insert "101" }
16
+ #3.times { t.insert "100" }
17
+ 500_000.times { t.insert generate_prefix }
18
+ puts "Stats"
19
+ t.get_stats
20
+
21
+ puts "Done"
22
+
23
+
9
24
 
10
25
  end
11
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: classbench
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Lucansky
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-06-20 00:00:00.000000000 Z
13
+ date: 2015-06-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rdoc
@@ -72,8 +72,8 @@ files:
72
72
  - VERSION
73
73
  - classbench.gemspec
74
74
  - lib/classbench.rb
75
- - lib/classbench/tier.rb
76
- - lib/classbench/tier_node.rb
75
+ - lib/classbench/trie.rb
76
+ - lib/classbench/trie_node.rb
77
77
  - test/helper.rb
78
78
  - test/test_classbench.rb
79
79
  - test/test_docopt.rb
@@ -1,42 +0,0 @@
1
- module Classbench
2
-
3
- # Class for representation of a n-ary prefix tree - trie.
4
- class Tier
5
- attr_accessor :root
6
-
7
- def insert(prefix)
8
- self.root = TierNode.new(0) if not root
9
-
10
- # Empty prefix
11
- if prefix.size == 0
12
- root.increment_prefixes
13
- return
14
- end
15
-
16
- current_node = self.root
17
- next_node = nil
18
-
19
- # For each char
20
- prefix.split('').each_with_index do |ch, i|
21
- next_node = current_node.subtree[ch]
22
-
23
- if next_node.nil?
24
- next_node = TierNode.new(i+1)
25
- current_node.subtree[ch] = next_node
26
- end
27
-
28
- current_node = next_node
29
- end
30
-
31
- current_node.increment_prefixes
32
- end
33
-
34
- # Erase not implemented/neccessary
35
-
36
- def get_stats
37
- return if not root
38
-
39
- root.compute_weights
40
- end
41
- end
42
- end