kmat 0.0.3

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.gitignore +15 -0
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.md +675 -0
  7. data/README.md +224 -0
  8. data/Rakefile +26 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/ext/kmat/arith/binary.c +1121 -0
  12. data/ext/kmat/arith/logical.c +332 -0
  13. data/ext/kmat/arith/math.c +34 -0
  14. data/ext/kmat/arith/statistics.c +173 -0
  15. data/ext/kmat/arith/unary.c +165 -0
  16. data/ext/kmat/auto_collect.rb +118 -0
  17. data/ext/kmat/elementwise_function.rb +149 -0
  18. data/ext/kmat/extconf.rb +75 -0
  19. data/ext/kmat/id.txt +80 -0
  20. data/ext/kmat/id_sym.rb +40 -0
  21. data/ext/kmat/km_util.h +97 -0
  22. data/ext/kmat/kmat.h +96 -0
  23. data/ext/kmat/lapack_headers/blas.h +354 -0
  24. data/ext/kmat/lapack_headers/lapacke.h +19455 -0
  25. data/ext/kmat/lapack_headers/lapacke_config.h +119 -0
  26. data/ext/kmat/lapack_headers/lapacke_mangling.h +17 -0
  27. data/ext/kmat/lapack_headers/lapacke_utils.h +579 -0
  28. data/ext/kmat/linalg/dla.c +1629 -0
  29. data/ext/kmat/linalg/linalg.c +267 -0
  30. data/ext/kmat/linalg/norm.c +727 -0
  31. data/ext/kmat/linalg/vla.c +102 -0
  32. data/ext/kmat/linalg/working.c +240 -0
  33. data/ext/kmat/main.c +95 -0
  34. data/ext/kmat/smat/accessor.c +719 -0
  35. data/ext/kmat/smat/array.c +108 -0
  36. data/ext/kmat/smat/boxmuller.c +72 -0
  37. data/ext/kmat/smat/constructer.c +302 -0
  38. data/ext/kmat/smat/convert.c +375 -0
  39. data/ext/kmat/smat/elem.c +171 -0
  40. data/ext/kmat/smat/fund.c +702 -0
  41. data/ext/kmat/smat/share.c +427 -0
  42. data/ext/kmat/smat/smat.c +530 -0
  43. data/ext/kmat/smat/sort.c +1156 -0
  44. data/ext/kmat/sym.txt +34 -0
  45. data/kmat.gemspec +46 -0
  46. data/lib/kmat.rb +20 -0
  47. data/lib/kmat/accessor.rb +164 -0
  48. data/lib/kmat/arith.rb +189 -0
  49. data/lib/kmat/linalg.rb +279 -0
  50. data/lib/kmat/logical.rb +150 -0
  51. data/lib/kmat/misc.rb +122 -0
  52. data/lib/kmat/random.rb +106 -0
  53. data/lib/kmat/statistics.rb +98 -0
  54. data/lib/kmat/version.rb +3 -0
  55. metadata +156 -0
@@ -0,0 +1,106 @@
1
+ class Random
2
+ private def _kmat_rand_d(arg=nil)
3
+ if arg
4
+ self.rand(arg).to_f
5
+ else
6
+ self.rand()
7
+ end
8
+ end
9
+ private def _kmat_rand_z(arg=nil)
10
+ if arg
11
+ Complex(self.rand(arg), self.rand(arg))
12
+ else
13
+ Complex(self.rand(), self.rand())
14
+ end
15
+ end
16
+ private def _kmat_rand_i(arg=nil)
17
+ case arg
18
+ when NilClass
19
+ self.rand(2)
20
+ when Integer, Range
21
+ self.rand(arg)
22
+ when Float
23
+ if 0.0 <= arg && arg <= 1.0
24
+ ( self.rand() < arg ) ? 1 : 0
25
+ else
26
+ raise ArgumentError, 'Float argument must be in [0, 1] for vt:int'
27
+ end
28
+ else
29
+ raise ArgumentError, 'for vt:int, arg must be Integer(Uniform(0...arg)), Range(Uniform(arg)), Float(1 with probability arg, 0 with probability 1-arg) or omitted'
30
+ end
31
+ end
32
+ private def _kmat_rand_b(arg=nil)
33
+ if arg.nil?
34
+ if self.rand(2) == 0
35
+ false
36
+ else
37
+ true
38
+ end
39
+ elsif arg.kind_of?(Numeric) && 0.0 <= arg && arg <= 1.0
40
+ ( self.rand() < arg )
41
+ else
42
+ raise ArgumentError, 'for vt:bool, arg must be Float(true with probability arg, false with probability 1-arg) or omitted'
43
+ end
44
+ end
45
+ private def _kmat_rand_v(arg=nil)
46
+ if arg
47
+ self.rand(arg)
48
+ else
49
+ self.rand()
50
+ end
51
+ end
52
+ def kmat_vt_rand(vt, arg=nil)
53
+ case Mat.vt_refine(vt)
54
+ when :float
55
+ _kmat_rand_d(arg)
56
+ when :complex
57
+ _kmat_rand_z(arg)
58
+ when :int
59
+ _kmat_rand_i(arg)
60
+ when :bool
61
+ _kmat_rand_b(arg)
62
+ when :object
63
+ _kmat_rand_v(arg)
64
+ else
65
+ raise Mat::InternalError, 'unknown value type'
66
+ end
67
+ end
68
+ end
69
+
70
+ class << Random
71
+ using(Module.new do
72
+ refine Random.singleton_class do
73
+ alias :kmat_srand_org :srand
74
+ end
75
+ end)
76
+ def srand(*args)
77
+ @kmat_stored = false
78
+ kmat_srand_org(*args)
79
+ end
80
+ def randn(*args)
81
+ Random::DEFAULT.randn(*args)
82
+ end
83
+ end
84
+
85
+ module Kernel
86
+ module_function def randn(*args)
87
+ Random::DEFAULT.randn(*args)
88
+ end
89
+ end
90
+
91
+ class Mat
92
+ def rand(arg=nil, random: $MatRandom)
93
+ _rand0(random, arg)
94
+ end
95
+ def randn(random: $MatRandom)
96
+ _randn0(random)
97
+ end
98
+ end
99
+ class << Mat
100
+ def rand(m=1, n=1, random: $MatRandom)
101
+ _rand0(m, n, random)
102
+ end
103
+ def randn(m=1, n=1, random: $MatRandom)
104
+ _randn0(m, n, random)
105
+ end
106
+ end
@@ -0,0 +1,98 @@
1
+ class Mat
2
+ def sum(arg=:all)
3
+ case arg
4
+ when Mat
5
+ _sum(arg)
6
+ when :all, :a
7
+ _sum(Mat.new(1, 1, self.vtype))
8
+ when :col, :c
9
+ _sum(Mat.new(1, col_size, self.vtype))
10
+ when :row, :r
11
+ _sum(Mat.new(row_size, 1, self.vtype))
12
+ when :none, :n
13
+ self.dup
14
+ end
15
+ end
16
+
17
+ def mean(arg=:all)
18
+ foo = sum(arg)
19
+ if foo.kind_of?(Mat)
20
+ if foo.row_size != self.row_size
21
+ foo.e_div(self.row_size)
22
+ else
23
+ foo.e_div(self.col_size)
24
+ end
25
+ elsif arg.kind_of?(Mat)
26
+ arg.e_div(self.length)
27
+ arg[0, 0]
28
+ else
29
+ foo.quo(self.length)
30
+ end
31
+ end
32
+
33
+ private def _mean(arg, ddof)
34
+ foo = sum(arg)
35
+ if foo.kind_of?(Mat)
36
+ if foo.row_size != self.row_size
37
+ foo.e_div(self.row_size-ddof)
38
+ else
39
+ foo.e_div(self.col_size-ddof)
40
+ end
41
+ elsif arg.kind_of?(Mat)
42
+ arg.e_div(self.length-ddof)
43
+ arg[0, 0]
44
+ else
45
+ foo.quo(self.length)
46
+ end
47
+ end
48
+ def var(arg=:all, ddof: 0)
49
+ foo = mean(arg)
50
+ if foo.kind_of?(Mat)
51
+ bar = foo.repmat(self.row_size.div(foo.col_size), self.col_size.div(foo.col_size))
52
+ bar.sub!(self).e_mul!(bar)
53
+ else
54
+ unless arg.kind_of?(Mat)
55
+ arg = Mat.new(1, 1, self.vtype) do
56
+ foo
57
+ end
58
+ end
59
+ bar = Mat.new(self.row_size, self.col_size, self.vtype)
60
+ bar.fill(foo)
61
+ end
62
+ bar.sub!(self)
63
+ bar.e_mul!(bar)
64
+ bar.__send__(:_mean, arg, ddof)
65
+ if foo.kind_of?(Mat)
66
+ bar
67
+ else
68
+ bar[0, 0]
69
+ end
70
+ end
71
+ alias :variance :var
72
+
73
+ def std(arg=:all, ddof: 0)
74
+ foo = var(arg, ddof: ddof)
75
+ if foo.kind_of?(Mat)
76
+ foo.sqrt!
77
+ elsif arg.kind_of?(Mat)
78
+ arg.sqrt!
79
+ arg[0, 0]
80
+ else
81
+ Math.sqrt(arg)
82
+ end
83
+ end
84
+ alias :stddev :std
85
+ alias :standard_deviation :std
86
+
87
+ def geo_mean(arg=:all)
88
+ foo = self.log.mean(arg)
89
+ if foo.kind_of?(Mat)
90
+ foo.exp!
91
+ elsif arg.kind_of?(Mat)
92
+ arg.exp!
93
+ arg[0, 0]
94
+ else
95
+ Math.exp(foo)
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,3 @@
1
+ class Mat
2
+ VERSION = "0.0.3"
3
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kmat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - KAZOON
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-12-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.12.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.12.2
69
+ description:
70
+ email:
71
+ - cycloawaodorin+gem@gmail.com
72
+ executables: []
73
+ extensions:
74
+ - ext/kmat/extconf.rb
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitattributes"
78
+ - ".gitignore"
79
+ - CHANGELOG.md
80
+ - Gemfile
81
+ - LICENSE.md
82
+ - README.md
83
+ - Rakefile
84
+ - bin/console
85
+ - bin/setup
86
+ - ext/kmat/arith/binary.c
87
+ - ext/kmat/arith/logical.c
88
+ - ext/kmat/arith/math.c
89
+ - ext/kmat/arith/statistics.c
90
+ - ext/kmat/arith/unary.c
91
+ - ext/kmat/auto_collect.rb
92
+ - ext/kmat/elementwise_function.rb
93
+ - ext/kmat/extconf.rb
94
+ - ext/kmat/id.txt
95
+ - ext/kmat/id_sym.rb
96
+ - ext/kmat/km_util.h
97
+ - ext/kmat/kmat.h
98
+ - ext/kmat/lapack_headers/blas.h
99
+ - ext/kmat/lapack_headers/lapacke.h
100
+ - ext/kmat/lapack_headers/lapacke_config.h
101
+ - ext/kmat/lapack_headers/lapacke_mangling.h
102
+ - ext/kmat/lapack_headers/lapacke_utils.h
103
+ - ext/kmat/linalg/dla.c
104
+ - ext/kmat/linalg/linalg.c
105
+ - ext/kmat/linalg/norm.c
106
+ - ext/kmat/linalg/vla.c
107
+ - ext/kmat/linalg/working.c
108
+ - ext/kmat/main.c
109
+ - ext/kmat/smat/accessor.c
110
+ - ext/kmat/smat/array.c
111
+ - ext/kmat/smat/boxmuller.c
112
+ - ext/kmat/smat/constructer.c
113
+ - ext/kmat/smat/convert.c
114
+ - ext/kmat/smat/elem.c
115
+ - ext/kmat/smat/fund.c
116
+ - ext/kmat/smat/share.c
117
+ - ext/kmat/smat/smat.c
118
+ - ext/kmat/smat/sort.c
119
+ - ext/kmat/sym.txt
120
+ - kmat.gemspec
121
+ - lib/kmat.rb
122
+ - lib/kmat/accessor.rb
123
+ - lib/kmat/arith.rb
124
+ - lib/kmat/linalg.rb
125
+ - lib/kmat/logical.rb
126
+ - lib/kmat/misc.rb
127
+ - lib/kmat/random.rb
128
+ - lib/kmat/statistics.rb
129
+ - lib/kmat/version.rb
130
+ homepage: https://github.com/cycloawaodorin/
131
+ licenses:
132
+ - GPL-3.0
133
+ metadata:
134
+ homepage_uri: https://github.com/cycloawaodorin/
135
+ source_code_uri: https://github.com/cycloawaodorin/kmat
136
+ changelog_uri: https://github.com/cycloawaodorin/kmat/blob/master/CHANGELOG.md
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 2.6.0
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubygems_version: 3.0.6
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: Kmat is a Ruby gem for matrix operations. Kmat uses BLAS/LAPACK as back-end.
156
+ test_files: []