graph-function 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c946f96f1d2b6ad1677597932a09d73718cd212
4
- data.tar.gz: 1384ddf665e7264e443cadbe244d1b891de6fa38
3
+ metadata.gz: f3928a98f9b9e14464ba42f12d15c1ed57c94e69
4
+ data.tar.gz: 09922b5d7483db4c3331124add4a25b5e07365ac
5
5
  SHA512:
6
- metadata.gz: dd6abd630322b75eb5c39b0f93db4e93cc9982a3d0befee797e633fda804317bc3ca91e396e1285d9aa80456cdbfb1e29fd5bf0a1f2f50ebb35db3348df5efd3
7
- data.tar.gz: f92d97f294452485d1ba65b6023b4c5ca7e0d1147eb070bc10c0801b8ab3021e7e699f3566aba4d9e38a21d9a2835aaf7a3058f1a3772a0b3e1a736072ee215e
6
+ metadata.gz: 5b6adec137335e29db10683a1e56efda5b074e9679647a2e33282e3d7b52e820361655ead33e9ab311999e08baecccaf347a66a0c508372a1ebfcc2797eff9a7
7
+ data.tar.gz: 530020596f1973d34a64e8253de722268a39b9cb3031d7b16e53fe3e2f22c1d5662cbfabd3459a9d258f4de9dae484f2187be0ca5fe0e650d296454bea7b3901
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .DS_Store
data/README.md CHANGED
@@ -41,12 +41,12 @@ require 'graph/function'
41
41
  Graph::Function.configure
42
42
  ```
43
43
 
44
- If you don't want to output to x11, just set `config.terminal` to a different option like `jpg`. Output is the file location of output, and is ignored for x11.
44
+ If you don't want to output to x11, just set `config.terminal` to a different option like `gif` (or anything else gnuplot [respects as a terminal](http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/gnuplot_primer/gptermcmp.html)). Output is the file location of output, and is ignored for x11.
45
45
 
46
46
  ```ruby
47
47
  Graph::Function.configure do |config|
48
- config.terminal = 'jpg'
49
- config.output = File.expand_path('../your_graph_name.jpg', __FILE__)
48
+ config.terminal = 'gif'
49
+ config.output = File.expand_path('../your_graph_name.gif', __FILE__)
50
50
  end
51
51
  ```
52
52
 
@@ -60,19 +60,19 @@ Graph::Function::IntsComparison.of(c.method(:function_name_one), c.method(:funct
60
60
  # => will output an xquartz graph
61
61
  ```
62
62
 
63
- ![comparison](two_func.jpg)
63
+ ![comparison](spec/graph/two_func.gif)
64
64
 
65
65
  If your functions need to operate on other types, then you need to generate values of those types. For this, I use [Rantly](https://github.com/hayeah/rantly). Here's an example of comparing two functions that take `Hash{String => Integer}`:
66
66
 
67
67
  ```ruby
68
68
  generator = proc {|size| Rantly { dict(size) { [string, integer] } }
69
69
  dict_comparison = Graph::Function::Comparison.new(generator)
70
- # CustomComparison can take any number of Methods
70
+ # Comparison can take any number of Methods
71
71
  dict_comparison.of(method(:hash_func_one), method(:hash_func_two))
72
72
  # => will output an xquartz graph
73
73
  ```
74
74
 
75
- ![comparison](custom_comparison.jpg)
75
+ ![comparison](spec/graph/comparison.gif)
76
76
 
77
77
  If you want to make use of more "real" fake data, [Faker](https://github.com/stympy/faker) is included, and can be used like so:
78
78
 
@@ -84,6 +84,8 @@ graph.of(method(:custom_types))
84
84
  # => will output an xquartz graph
85
85
  ```
86
86
 
87
+ ![faker](spec/graph/faker.gif)
88
+
87
89
  The only downside here is that you can't parameterize `Faker`, but you could use random generators to mix it up. Using the above example, `graph-function` won't pass anything into the `faker_generator` but the `size`, so if we want the value to change, we could use `Faker::Date.backward(proc { rand(10) }.call)`.
88
90
 
89
91
  Check out the [spec file](spec/graph/function_spec.rb) to see all of these and more examples.
@@ -0,0 +1,303 @@
1
+ <!DOCTYPE HTML>
2
+ <html>
3
+ <head>
4
+ <title>Gnuplot Canvas Graph</title>
5
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
6
+ <!--[if IE]><script type="text/javascript" src="excanvas.js"></script><![endif]-->
7
+ <script src="/usr/local/Cellar/gnuplot/5.0.4/share/gnuplot/5.0/js/canvastext.js"></script>
8
+ <script src="/usr/local/Cellar/gnuplot/5.0.4/share/gnuplot/5.0/js/gnuplot_common.js"></script>
9
+ <script src="/usr/local/Cellar/gnuplot/5.0.4/share/gnuplot/5.0/js/gnuplot_dashedlines.js"></script>
10
+ <script type="text/javascript">gnuplot.init = function() {};</script>
11
+ <script type="text/javascript">
12
+ var canvas, ctx;
13
+ gnuplot.grid_lines = true;
14
+ gnuplot.zoomed = false;
15
+ gnuplot.active_plot_name = "gnuplot_canvas";
16
+
17
+ function gnuplot_canvas() {
18
+ canvas = document.getElementById("gnuplot_canvas");
19
+ ctx = canvas.getContext("2d");
20
+ // Gnuplot version 5.0.4
21
+ // short forms of commands provided by gnuplot_common.js
22
+ function DT (dt) {gnuplot.dashtype(dt);};
23
+ function DS (x,y) {gnuplot.dashstart(x,y);};
24
+ function DL (x,y) {gnuplot.dashstep(x,y);};
25
+ function M (x,y) {if (gnuplot.pattern.length > 0) DS(x,y); else gnuplot.M(x,y);};
26
+ function L (x,y) {if (gnuplot.pattern.length > 0) DL(x,y); else gnuplot.L(x,y);};
27
+ function Dot (x,y) {gnuplot.Dot(x/10.,y/10.);};
28
+ function Pt (N,x,y,w) {gnuplot.Pt(N,x/10.,y/10.,w/10.);};
29
+ function R (x,y,w,h) {gnuplot.R(x,y,w,h);};
30
+ function T (x,y,fontsize,justify,string) {gnuplot.T(x,y,fontsize,justify,string);};
31
+ function TR (x,y,angle,fontsize,justify,string) {gnuplot.TR(x,y,angle,fontsize,justify,string);};
32
+ function bp (x,y) {gnuplot.bp(x,y);};
33
+ function cfp () {gnuplot.cfp();};
34
+ function cfsp() {gnuplot.cfsp();};
35
+
36
+ gnuplot.hypertext_list = [];
37
+ gnuplot.on_hypertext = -1;
38
+ function Hypertext(x,y,w,text) {
39
+ newtext = {x:x, y:y, w:w, text:text};
40
+ gnuplot.hypertext_list.push(newtext);
41
+ }
42
+ gnuplot.dashlength = 400;
43
+ ctx.lineCap = "round"; ctx.lineJoin = "round";
44
+ CanvasTextFunctions.enable(ctx);
45
+ ctx.strokeStyle = "rgb(215,215,215)";
46
+ ctx.lineWidth = 1;
47
+
48
+ ctx.lineWidth = 1;
49
+ ctx.strokeStyle = "rgb(000,000,000)";
50
+ ctx.beginPath();
51
+ M(540,3680);
52
+ L(640,3680);
53
+ M(5759,3680);
54
+ L(5659,3680);
55
+ ctx.stroke();
56
+ ctx.closePath();
57
+ ctx.fillStyle = "rgb(000,000,000)";
58
+ T(460,3730,10.0,"Right"," 0");
59
+ ctx.beginPath();
60
+ M(540,3197);
61
+ L(640,3197);
62
+ M(5759,3197);
63
+ L(5659,3197);
64
+ ctx.stroke();
65
+ ctx.closePath();
66
+ T(460,3247,10.0,"Right"," 2");
67
+ ctx.beginPath();
68
+ M(540,2715);
69
+ L(640,2715);
70
+ M(5759,2715);
71
+ L(5659,2715);
72
+ ctx.stroke();
73
+ ctx.closePath();
74
+ T(460,2765,10.0,"Right"," 4");
75
+ ctx.beginPath();
76
+ M(540,2232);
77
+ L(640,2232);
78
+ M(5759,2232);
79
+ L(5659,2232);
80
+ ctx.stroke();
81
+ ctx.closePath();
82
+ T(460,2282,10.0,"Right"," 6");
83
+ ctx.beginPath();
84
+ M(540,1749);
85
+ L(640,1749);
86
+ M(5759,1749);
87
+ L(5659,1749);
88
+ ctx.stroke();
89
+ ctx.closePath();
90
+ T(460,1799,10.0,"Right"," 8");
91
+ ctx.beginPath();
92
+ M(540,1266);
93
+ L(640,1266);
94
+ M(5759,1266);
95
+ L(5659,1266);
96
+ ctx.stroke();
97
+ ctx.closePath();
98
+ T(460,1316,10.0,"Right"," 10");
99
+ ctx.beginPath();
100
+ M(540,784);
101
+ L(640,784);
102
+ M(5759,784);
103
+ L(5659,784);
104
+ ctx.stroke();
105
+ ctx.closePath();
106
+ T(460,834,10.0,"Right"," 12");
107
+ ctx.beginPath();
108
+ M(540,301);
109
+ L(640,301);
110
+ M(5759,301);
111
+ L(5659,301);
112
+ ctx.stroke();
113
+ ctx.closePath();
114
+ T(460,351,10.0,"Right"," 14");
115
+ ctx.beginPath();
116
+ M(540,3680);
117
+ L(540,3580);
118
+ M(540,301);
119
+ L(540,401);
120
+ ctx.stroke();
121
+ ctx.closePath();
122
+ T(540,3830,10.0,"Center"," 0");
123
+ ctx.beginPath();
124
+ M(1584,3680);
125
+ L(1584,3580);
126
+ M(1584,301);
127
+ L(1584,401);
128
+ ctx.stroke();
129
+ ctx.closePath();
130
+ T(1584,3830,10.0,"Center"," 2000");
131
+ ctx.beginPath();
132
+ M(2628,3680);
133
+ L(2628,3580);
134
+ M(2628,301);
135
+ L(2628,401);
136
+ ctx.stroke();
137
+ ctx.closePath();
138
+ T(2628,3830,10.0,"Center"," 4000");
139
+ ctx.beginPath();
140
+ M(3671,3680);
141
+ L(3671,3580);
142
+ M(3671,301);
143
+ L(3671,401);
144
+ ctx.stroke();
145
+ ctx.closePath();
146
+ T(3671,3830,10.0,"Center"," 6000");
147
+ ctx.beginPath();
148
+ M(4715,3680);
149
+ L(4715,3580);
150
+ M(4715,301);
151
+ L(4715,401);
152
+ ctx.stroke();
153
+ ctx.closePath();
154
+ T(4715,3830,10.0,"Center"," 8000");
155
+ ctx.beginPath();
156
+ M(5759,3680);
157
+ L(5759,3580);
158
+ M(5759,301);
159
+ L(5759,401);
160
+ ctx.stroke();
161
+ ctx.closePath();
162
+ T(5759,3830,10.0,"Center"," 10000");
163
+ ctx.beginPath();
164
+ M(540,301);
165
+ L(540,3680);
166
+ L(5759,3680);
167
+ L(5759,301);
168
+ L(540,301);
169
+ ctx.closePath();
170
+ ctx.stroke();
171
+ TR(90,2041,270,10.0,"Center","execution time");
172
+ T(3149,3980,10.0,"Center","input size");
173
+ T(3149,201,10.0,"Center","Sort vs BubbleSort");
174
+ if (typeof(gnuplot.hide_gp_plot_1) == "undefined"|| !gnuplot.hide_gp_plot_1) {
175
+ ctx.strokeStyle = "rgb(148,000,211)";
176
+ ctx.strokeStyle = "rgb(000,000,000)";
177
+ T(5099,514,10.0,"Right","sort");
178
+ ctx.strokeStyle = "rgb(148,000,211)";
179
+ ctx.beginPath();
180
+ M(5179,464);
181
+ L(5599,464);
182
+ M(540,3680);
183
+ L(1062,3680);
184
+ L(1584,3680);
185
+ L(2106,3680);
186
+ L(2628,3680);
187
+ L(3150,3680);
188
+ L(3671,3680);
189
+ L(4193,3680);
190
+ L(4715,3680);
191
+ L(5237,3680);
192
+ L(5759,3680);
193
+ ctx.stroke();
194
+ ctx.closePath();
195
+ Pt(0,540,3680,60.0);
196
+ Pt(0,1062,3680,60.0);
197
+ Pt(0,1584,3680,60.0);
198
+ Pt(0,2106,3680,60.0);
199
+ Pt(0,2628,3680,60.0);
200
+ Pt(0,3150,3680,60.0);
201
+ Pt(0,3671,3680,60.0);
202
+ Pt(0,4193,3680,60.0);
203
+ Pt(0,4715,3680,60.0);
204
+ Pt(0,5237,3680,60.0);
205
+ Pt(0,5759,3680,60.0);
206
+ Pt(0,5389,464,60.0);
207
+ } // End gp_plot_1
208
+ if (typeof(gnuplot.hide_gp_plot_2) == "undefined"|| !gnuplot.hide_gp_plot_2) {
209
+ ctx.lineWidth = 1;
210
+ ctx.strokeStyle = "rgb(000,000,000)";
211
+ DT(gnuplot.solid);
212
+ ctx.strokeStyle = "rgb(000,158,115)";
213
+ ctx.strokeStyle = "rgb(000,000,000)";
214
+ ctx.fillStyle = "rgb(000,000,000)";
215
+ ctx.beginPath();
216
+ M(5099,589);
217
+ M(4411,589);
218
+ ctx.stroke();
219
+ ctx.closePath();
220
+ T(4411,639,10.0,"","bubble_sort");
221
+ ctx.strokeStyle = "rgb(000,158,115)";
222
+ ctx.beginPath();
223
+ M(5179,589);
224
+ L(5599,589);
225
+ M(540,3680);
226
+ L(1062,3649);
227
+ L(1584,3559);
228
+ L(2106,3411);
229
+ L(2628,3192);
230
+ L(3150,2941);
231
+ L(3671,2601);
232
+ L(4193,2207);
233
+ L(4715,1772);
234
+ L(5237,1243);
235
+ L(5759,696);
236
+ ctx.stroke();
237
+ ctx.closePath();
238
+ Pt(1,540,3680,60.0);
239
+ Pt(1,1062,3649,60.0);
240
+ Pt(1,1584,3559,60.0);
241
+ Pt(1,2106,3411,60.0);
242
+ Pt(1,2628,3192,60.0);
243
+ Pt(1,3150,2941,60.0);
244
+ Pt(1,3671,2601,60.0);
245
+ Pt(1,4193,2207,60.0);
246
+ Pt(1,4715,1772,60.0);
247
+ Pt(1,5237,1243,60.0);
248
+ Pt(1,5759,696,60.0);
249
+ Pt(1,5389,589,60.0);
250
+ } // End gp_plot_2
251
+ ctx.lineWidth = 2;
252
+ ctx.strokeStyle = "rgb(000,000,000)";
253
+ DT(gnuplot.solid);
254
+ ctx.lineWidth = 1;
255
+ ctx.beginPath();
256
+ M(540,301);
257
+ L(540,3680);
258
+ L(5759,3680);
259
+ L(5759,301);
260
+ L(540,301);
261
+ ctx.closePath();
262
+ ctx.stroke();
263
+
264
+ // plot boundaries and axis scaling information for mousing
265
+ gnuplot.plot_term_xmax = 600;
266
+ gnuplot.plot_term_ymax = 400;
267
+ gnuplot.plot_xmin = 54.0;
268
+ gnuplot.plot_xmax = 575.9;
269
+ gnuplot.plot_ybot = 368.0;
270
+ gnuplot.plot_ytop = 30.1;
271
+ gnuplot.plot_width = 521.9;
272
+ gnuplot.plot_height = 337.9;
273
+ gnuplot.plot_axis_xmin = 0;
274
+ gnuplot.plot_axis_xmax = 10000;
275
+ gnuplot.plot_axis_ymin = 0;
276
+ gnuplot.plot_axis_ymax = 14;
277
+ gnuplot.plot_axis_x2min = "none"
278
+ gnuplot.plot_axis_y2min = "none"
279
+ gnuplot.plot_logaxis_x = 0;
280
+ gnuplot.plot_logaxis_y = 0;
281
+ gnuplot.plot_axis_width = gnuplot.plot_axis_xmax - gnuplot.plot_axis_xmin;
282
+ gnuplot.plot_axis_height = gnuplot.plot_axis_ymax - gnuplot.plot_axis_ymin;
283
+ gnuplot.plot_timeaxis_x = "";
284
+ gnuplot.plot_timeaxis_y = "";
285
+ }
286
+ </script>
287
+ <link type="text/css" href="/usr/local/Cellar/gnuplot/5.0.4/share/gnuplot/5.0/js/gnuplot_mouse.css" rel="stylesheet">
288
+ </head>
289
+ <body onload="gnuplot_canvas(); gnuplot.init();" oncontextmenu="return false;">
290
+
291
+ <div class="gnuplot">
292
+ <canvas id="Tile" width="32" height="32" hidden></canvas>
293
+ <table class="plot">
294
+ <tr><td>
295
+ <canvas id="gnuplot_canvas" width="600" height="400" tabindex="0">
296
+ Sorry, your browser seems not to support the HTML 5 canvas element
297
+ </canvas>
298
+ </td></tr>
299
+ </table>
300
+ </div>
301
+
302
+ </body>
303
+ </html>
@@ -0,0 +1,28 @@
1
+ require 'graph/function'
2
+
3
+ Graph::Function.configure do |config|
4
+ config.terminal = 'canvas'
5
+ config.output = File.expand_path('../comparing.html', __FILE__)
6
+ end
7
+
8
+ def bubble_sort(array)
9
+ n = array.length
10
+ loop do
11
+ swapped = false
12
+ (n-1).times do |i|
13
+ if array[i] > array[i+1]
14
+ array[i], array[i+1] = array[i+1], array[i]
15
+ swapped = true
16
+ end
17
+ end
18
+ break if not swapped
19
+ end
20
+ array
21
+ end
22
+
23
+ def sort(array)
24
+ array.sort
25
+ end
26
+
27
+ puts 'comparing sort and bubble_sort'
28
+ Graph::Function::IntsComparison.of(method(:sort), method(:bubble_sort))
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'gnuplot'
22
22
  spec.add_dependency 'rantly'
23
23
  spec.add_dependency 'faker'
24
+ spec.add_dependency 'ruby-progressbar'
24
25
  spec.add_dependency 'benchmark-memory'
25
26
  spec.add_development_dependency 'bundler', '~> 1.12'
26
27
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -2,6 +2,7 @@ require 'gnuplot'
2
2
  require 'benchmark'
3
3
  require 'rantly'
4
4
  require 'faker'
5
+ require 'ruby-progressbar'
5
6
 
6
7
  require 'graph/function/version'
7
8
  require 'graph/function/reformat_string'
@@ -19,13 +19,16 @@ module Graph
19
19
  Gnuplot.open do |gp|
20
20
  Gnuplot::Plot.new(gp) do |plot|
21
21
 
22
- plot.title "#{methods.map {|m| camel_title(m.name) }.join(', ') }"
22
+ plot.title "#{title = methods.map {|m| camel_title(m.name) }.join(', ') }"
23
23
  set_up(plot)
24
24
 
25
25
  x = (0..10000).step(1000).to_a
26
+ pb = ProgressBar.create(title: title, total: x.size)
26
27
 
27
28
  methods.each do |m|
29
+ pb.reset
28
30
  y = x.collect do |v|
31
+ pb.increment
29
32
  data = data_generator.call(v)
30
33
  # FIXME can i get ride of the cost of `send`?
31
34
  Benchmark.measure { self.send(m.name, data) }.real
@@ -12,12 +12,14 @@ module Graph
12
12
  self.class.send(:define_method, :a, proc(&method_one))
13
13
  self.class.send(:define_method, :b, proc(&method_two))
14
14
 
15
- plot.title "#{camel_title(method_one.name)} vs #{camel_title(method_two.name)}"
15
+ plot.title (title = "#{camel_title(method_one.name)} vs #{camel_title(method_two.name)}")
16
16
  set_up(plot)
17
17
 
18
18
  x = (0..10000).step(1000).to_a
19
+ pb = ProgressBar.create(title: title, total: x.size)
19
20
 
20
21
  y = x.collect do |v|
22
+ pb.increment
21
23
  array = (0..v - 1).to_a.shuffle
22
24
  Benchmark.measure { a(array) }.real
23
25
  end
@@ -27,7 +29,10 @@ module Graph
27
29
  ds.title = "#{escape_underscores(method_one.name)}"
28
30
  end
29
31
 
32
+ pb.reset
33
+
30
34
  z = x.collect do |v|
35
+ pb.increment
31
36
  array = (0..v - 1).to_a.shuffle
32
37
  Benchmark.measure { b(array) }.real
33
38
  end
@@ -17,12 +17,14 @@ module Graph
17
17
  Gnuplot.open do |gp|
18
18
  Gnuplot::Plot.new(gp) do |plot|
19
19
 
20
- plot.title "#{camel_title(method_obj.name)}"
20
+ plot.title "#{title = camel_title(method_obj.name)}"
21
21
  set_up(plot)
22
22
 
23
23
  x = (0..10000).step(1000).to_a
24
+ pb = ProgressBar.create(title: title, total: x.size)
24
25
 
25
26
  y = x.collect do |v|
27
+ pb.increment
26
28
  data = data_generator.call(v)
27
29
  Benchmark.measure { a(data) }.real
28
30
  end
@@ -1,5 +1,5 @@
1
1
  module Graph
2
2
  module Function
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graph-function
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Moore-Niemi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-23 00:00:00.000000000 Z
11
+ date: 2016-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gnuplot
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ruby-progressbar
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: benchmark-memory
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +156,8 @@ files:
142
156
  - bin/console
143
157
  - bin/setup
144
158
  - custom_comparison.jpg
159
+ - examples/comparing.html
160
+ - examples/comparing_canvas.rb
145
161
  - graph-function.gemspec
146
162
  - lib/graph/function.rb
147
163
  - lib/graph/function/comparison.rb