convolver 0.1.1 → 0.1.2
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 +4 -4
- data/.gitignore +1 -0
- data/lib/convolver.rb +43 -0
- data/lib/convolver/version.rb +1 -1
- metadata +2 -3
- data/benchmarks/convolver_vs_fftw3.rb +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0f2badf8733818f128a1c6f1456ae37e114f549
|
4
|
+
data.tar.gz: 81889f084e50d4789ec202082422dd9b24304210
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 557d6b5738041165a5a22f4ede39d4d0cc7333aa6bfd2937cf3334e16e8daa7c12672ed6377be31003974b90b4a8a942f93fdf812d886202894d46088a2c30a5
|
7
|
+
data.tar.gz: d598375b28278a5ac14619280068cfaeab82fe2d1c4aac9aeae817bb4b4958c913c1fb6674af1b9f4af901f7844621863e2ffd9d4991dc7ca31e7c8e32818c48
|
data/.gitignore
CHANGED
data/lib/convolver.rb
CHANGED
@@ -28,8 +28,51 @@ module Convolver
|
|
28
28
|
(FFTW3.ifft( cfreqs ).real * (1.0/mod_a.size))[*ranges]
|
29
29
|
end
|
30
30
|
|
31
|
+
# A rough estimate of time that #convolve_fftw3 will take, based on complexity
|
32
|
+
# of its operations, and some rough benchmarking. A value of 1.0 corresponds to results
|
33
|
+
# varying between 1 and 12 milliseconds on the test computer.
|
34
|
+
# @param [NArray] signal must be same size or larger than kernel in each dimension
|
35
|
+
# @param [NArray] kernel must be same size or smaller than signal in each dimension
|
36
|
+
# @return [Float] rough estimate of time for convolution compared to baseline
|
37
|
+
def self.predict_convolve_fft_time signal, kernel
|
38
|
+
16 * 4.55e-08 * combined_shape(signal.shape,kernel.shape).inject(1) { |t,x| t * x * Math.log(x) }
|
39
|
+
end
|
40
|
+
|
41
|
+
# A rough estimate of time that #convolve will take, based on complexity
|
42
|
+
# of its operations, and some rough benchmarking. A value of 1.0 corresponds to results
|
43
|
+
# varying bewteen 2 and 8 milliseconds on the test computer.
|
44
|
+
# @param [NArray] signal must be same size or larger than kernel in each dimension
|
45
|
+
# @param [NArray] kernel must be same size or smaller than signal in each dimension
|
46
|
+
# @return [Float] rough estimate of time for convolution compared to baseline
|
47
|
+
def self.predict_convolve_basic_time signal, kernel
|
48
|
+
outputs = shape_to_size( result_shape( signal.shape, kernel.shape ) )
|
49
|
+
4.54e-12 * (outputs * shape_to_size( signal.shape ) * shape_to_size( kernel.shape ))
|
50
|
+
end
|
51
|
+
|
31
52
|
private
|
32
53
|
|
54
|
+
def self.shape_to_size shape
|
55
|
+
shape.inject(1) { |t,x| t * x }
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.combined_shape signal_shape, kernel_shape
|
59
|
+
combined_shape = [ ]
|
60
|
+
signal_shape.each_with_index do |signal_size, i|
|
61
|
+
kernel_size = kernel_shape[i]
|
62
|
+
combined_shape[i] = signal_size + kernel_size - 1
|
63
|
+
end
|
64
|
+
combined_shape
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.result_shape signal_shape, kernel_shape
|
68
|
+
result_shape = [ ]
|
69
|
+
signal_shape.each_with_index do |signal_size, i|
|
70
|
+
kernel_size = kernel_shape[i]
|
71
|
+
result_shape[i] = signal_size - kernel_size + 1
|
72
|
+
end
|
73
|
+
result_shape
|
74
|
+
end
|
75
|
+
|
33
76
|
def self.fft_offsets signal_shape, kernel_shape
|
34
77
|
combined_shape = []
|
35
78
|
shift_by = []
|
data/lib/convolver/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: convolver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil Slater
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: narray
|
@@ -123,7 +123,6 @@ files:
|
|
123
123
|
- README.md
|
124
124
|
- Rakefile
|
125
125
|
- benchmarks/convolve_benchmark.rb
|
126
|
-
- benchmarks/convolver_vs_fftw3.rb
|
127
126
|
- benchmarks/nn_layer_benchmark.rb
|
128
127
|
- convolver.gemspec
|
129
128
|
- ext/convolver/cnn_components.c
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'convolver'
|
2
|
-
require 'benchmark'
|
3
|
-
|
4
|
-
class Convolver2DBenchmark
|
5
|
-
attr_reader :image, :kernel
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
# These show Convolver.convolve as 3x faster than FFTW3
|
9
|
-
@image = NArray.sfloat(256 * 256).random
|
10
|
-
@kernel = NArray.sfloat(16 * 16).random
|
11
|
-
|
12
|
-
# These are roughly even (10% advantage to FFTW3)
|
13
|
-
# @image = NArray.sfloat(256 * 256).random
|
14
|
-
# @kernel = NArray.sfloat(32 * 32).random
|
15
|
-
|
16
|
-
# These show FFTW3 as 4x faster than Convolver.convolve
|
17
|
-
# @image = NArray.sfloat(256 * 256).random
|
18
|
-
# @kernel = NArray.sfloat(64 * 64).random
|
19
|
-
|
20
|
-
# These show Convolver.convolve as 200x faster than FFTW3
|
21
|
-
# @image = NArray.sfloat(50 * 64 * 64).random
|
22
|
-
# @kernel = NArray.sfloat(50 * 64 * 64).random
|
23
|
-
|
24
|
-
# These show FFTW3 as 2x faster than Convolver.convolve
|
25
|
-
# @image = NArray.sfloat(128 * 128).random
|
26
|
-
# @kernel = NArray.sfloat(64 * 64).random
|
27
|
-
|
28
|
-
# These show FFTW3 and Convolver.convolve roughly equal
|
29
|
-
# @image = NArray.sfloat(80 * 80).random
|
30
|
-
# @kernel = NArray.sfloat(64 * 64).random
|
31
|
-
|
32
|
-
# These show FFTW3 as 2x faster than Convolver.convolve
|
33
|
-
# @image = NArray.sfloat(2 * 80 * 80).random
|
34
|
-
# @kernel = NArray.sfloat(2 * 64 * 64).random
|
35
|
-
|
36
|
-
# These are roughly even - increasing size of image favours FFTW3
|
37
|
-
#@image = NArray.sfloat(2000 + 80 * 80).random
|
38
|
-
#@kernel = NArray.sfloat(80 * 80).random
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
Benchmark.bm do |x|
|
43
|
-
source = Convolver2DBenchmark.new
|
44
|
-
x.report('convolver') { 100.times { Convolver.convolve( source.image, source.kernel ) } }
|
45
|
-
x.report('fftw3') { 100.times { Convolver.convolve_fftw3( source.image, source.kernel ) } }
|
46
|
-
end
|