scout_realtime 0.5.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.
Files changed (563) hide show
  1. data/.gitignore +21 -0
  2. data/CHANGELOG.md +7 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +37 -0
  6. data/Rakefile +16 -0
  7. data/Vagrantfile +7 -0
  8. data/bin/scout_realtime +117 -0
  9. data/lib/scout_realtime/lib/aggregator.rb +8 -0
  10. data/lib/scout_realtime/lib/metric.rb +36 -0
  11. data/lib/scout_realtime/lib/multi_aggregator.rb +12 -0
  12. data/lib/scout_realtime/lib/ring_buffer.rb +25 -0
  13. data/lib/scout_realtime/lib/trollop.rb +782 -0
  14. data/lib/scout_realtime/main.rb +76 -0
  15. data/lib/scout_realtime/models/cpu.rb +21 -0
  16. data/lib/scout_realtime/models/disk.rb +21 -0
  17. data/lib/scout_realtime/models/memory.rb +17 -0
  18. data/lib/scout_realtime/models/network.rb +14 -0
  19. data/lib/scout_realtime/models/processes.rb +13 -0
  20. data/lib/scout_realtime/runner.rb +34 -0
  21. data/lib/scout_realtime/version.rb +5 -0
  22. data/lib/scout_realtime/web/favicon.ico +0 -0
  23. data/lib/scout_realtime/web/images/logo.png +0 -0
  24. data/lib/scout_realtime/web/images/pause.png +0 -0
  25. data/lib/scout_realtime/web/images/play.png +0 -0
  26. data/lib/scout_realtime/web/javascripts/application.js +265 -0
  27. data/lib/scout_realtime/web/javascripts/bootstrap.min.js +7 -0
  28. data/lib/scout_realtime/web/javascripts/charts.js +189 -0
  29. data/lib/scout_realtime/web/javascripts/d3.barchart.js +210 -0
  30. data/lib/scout_realtime/web/javascripts/d3.linechart.js +168 -0
  31. data/lib/scout_realtime/web/javascripts/d3.v3.min.js +5 -0
  32. data/lib/scout_realtime/web/javascripts/handlebars-v1.1.0.js +2563 -0
  33. data/lib/scout_realtime/web/javascripts/jquery.js +3010 -0
  34. data/lib/scout_realtime/web/javascripts/metrics_for_development.js +6 -0
  35. data/lib/scout_realtime/web/stylesheets/bootstrap-theme.min.css +7 -0
  36. data/lib/scout_realtime/web/stylesheets/bootstrap.min.css +7 -0
  37. data/lib/scout_realtime/web/stylesheets/styles.css +254 -0
  38. data/lib/scout_realtime/web/views/graph.erb +6 -0
  39. data/lib/scout_realtime/web/views/header.erb +8 -0
  40. data/lib/scout_realtime/web/views/index.erb +21 -0
  41. data/lib/scout_realtime/web/views/layout.erb +33 -0
  42. data/lib/scout_realtime/web/views/overview_charts.erb +30 -0
  43. data/lib/scout_realtime/web/views/processes.erb +31 -0
  44. data/lib/scout_realtime/web/views/sidebar.erb +19 -0
  45. data/lib/scout_realtime/web_app.rb +59 -0
  46. data/lib/scout_realtime.rb +58 -0
  47. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/bytes.rb +1 -0
  48. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/chars.rb +1 -0
  49. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/each.rb +3 -0
  50. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/each_byte.rb +9 -0
  51. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/each_char.rb +35 -0
  52. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/each_line.rb +3 -0
  53. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/getbyte.rb +5 -0
  54. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/lines.rb +5 -0
  55. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf/readbyte.rb +5 -0
  56. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/argf.rb +3 -0
  57. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/collect.rb +3 -0
  58. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/combination.rb +24 -0
  59. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/cycle.rb +16 -0
  60. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/delete_if.rb +3 -0
  61. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/each.rb +3 -0
  62. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/each_index.rb +3 -0
  63. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/find_index.rb +1 -0
  64. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/flatten.rb +47 -0
  65. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/index.rb +15 -0
  66. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/map.rb +3 -0
  67. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/permutation.rb +30 -0
  68. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/pop.rb +15 -0
  69. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/product.rb +32 -0
  70. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/reject.rb +3 -0
  71. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/reverse_each.rb +3 -0
  72. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/rindex.rb +15 -0
  73. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/select.rb +3 -0
  74. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/shift.rb +13 -0
  75. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array/shuffle.rb +17 -0
  76. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/array.rb +3 -0
  77. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/binding/eval.rb +7 -0
  78. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/binding.rb +3 -0
  79. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/dir/each.rb +7 -0
  80. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/dir/foreach.rb +9 -0
  81. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/dir.rb +3 -0
  82. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/count.rb +17 -0
  83. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/cycle.rb +24 -0
  84. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/detect.rb +3 -0
  85. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/drop.rb +13 -0
  86. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/drop_while.rb +16 -0
  87. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/each_cons.rb +4 -0
  88. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/each_slice.rb +4 -0
  89. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/each_with_index.rb +3 -0
  90. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/entries.rb +11 -0
  91. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/find.rb +3 -0
  92. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/find_all.rb +3 -0
  93. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/find_index.rb +21 -0
  94. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/first.rb +21 -0
  95. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/group_by.rb +14 -0
  96. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/inject.rb +14 -0
  97. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/max_by.rb +16 -0
  98. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/min_by.rb +16 -0
  99. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/minmax.rb +21 -0
  100. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/minmax_by.rb +19 -0
  101. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/none.rb +7 -0
  102. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/one.rb +23 -0
  103. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/partition.rb +3 -0
  104. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/reduce.rb +1 -0
  105. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/reject.rb +3 -0
  106. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/reverse_each.rb +12 -0
  107. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/select.rb +3 -0
  108. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/sort_by.rb +3 -0
  109. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/take.rb +9 -0
  110. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/take_while.rb +14 -0
  111. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable/to_a.rb +12 -0
  112. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerable.rb +3 -0
  113. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerator/each.rb +6 -0
  114. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerator/next.rb +15 -0
  115. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerator/rewind.rb +13 -0
  116. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerator/with_index.rb +14 -0
  117. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/enumerator.rb +3 -0
  118. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/delete_if.rb +3 -0
  119. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/each.rb +3 -0
  120. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/each_key.rb +3 -0
  121. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/each_pair.rb +3 -0
  122. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/each_value.rb +3 -0
  123. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/reject.rb +4 -0
  124. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env/select.rb +3 -0
  125. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/env.rb +3 -0
  126. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/fixnum/div.rb +7 -0
  127. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/fixnum/fdiv.rb +7 -0
  128. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/fixnum.rb +3 -0
  129. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/float/fdiv.rb +3 -0
  130. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/float.rb +3 -0
  131. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/gc/stress.rb +9 -0
  132. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/gc.rb +3 -0
  133. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/constructor.rb +25 -0
  134. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/delete_if.rb +3 -0
  135. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/each.rb +3 -0
  136. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/each_key.rb +3 -0
  137. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/each_pair.rb +3 -0
  138. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/each_value.rb +3 -0
  139. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/eql.rb +1 -0
  140. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/hash.rb +17 -0
  141. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/reject.rb +3 -0
  142. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash/select.rb +3 -0
  143. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/hash.rb +3 -0
  144. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/downto.rb +3 -0
  145. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/even.rb +7 -0
  146. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/odd.rb +7 -0
  147. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/ord.rb +7 -0
  148. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/pred.rb +7 -0
  149. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/times.rb +3 -0
  150. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer/upto.rb +3 -0
  151. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/integer.rb +3 -0
  152. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/bytes.rb +1 -0
  153. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/chars.rb +1 -0
  154. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/each.rb +3 -0
  155. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/each_byte.rb +6 -0
  156. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/each_char.rb +34 -0
  157. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/each_line.rb +6 -0
  158. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/foreach.rb +7 -0
  159. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/getbyte.rb +3 -0
  160. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/lines.rb +1 -0
  161. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io/readbyte.rb +3 -0
  162. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/io.rb +3 -0
  163. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/kernel/__method__.rb +8 -0
  164. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/kernel/instance_exec.rb +10 -0
  165. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/kernel/tap.rb +8 -0
  166. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/kernel.rb +3 -0
  167. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/method/name.rb +49 -0
  168. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/method.rb +3 -0
  169. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/module/class_exec.rb +1 -0
  170. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/module/module_exec.rb +11 -0
  171. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/module.rb +3 -0
  172. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/numeric/step.rb +3 -0
  173. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/numeric.rb +3 -0
  174. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/object_space/each_object.rb +5 -0
  175. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/object_space.rb +3 -0
  176. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/process/exec.rb +3 -0
  177. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/process.rb +3 -0
  178. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/range/each.rb +3 -0
  179. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/range/step.rb +3 -0
  180. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/range.rb +3 -0
  181. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/regexp/union.rb +11 -0
  182. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/regexp.rb +3 -0
  183. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/stdlib/tmpdir.rb +44 -0
  184. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/stdlib.rb +1 -0
  185. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/stop_iteration.rb +14 -0
  186. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/bytes.rb +1 -0
  187. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/bytesize.rb +3 -0
  188. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/each.rb +3 -0
  189. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/each_byte.rb +5 -0
  190. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/each_char.rb +13 -0
  191. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/each_line.rb +5 -0
  192. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/end_with.rb +12 -0
  193. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/lines.rb +1 -0
  194. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/partition.rb +20 -0
  195. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/rpartition.rb +19 -0
  196. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/start_with.rb +12 -0
  197. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string/upto.rb +15 -0
  198. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/string.rb +3 -0
  199. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/struct/each.rb +3 -0
  200. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/struct/each_pair.rb +3 -0
  201. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/struct.rb +3 -0
  202. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/symbol/to_proc.rb +8 -0
  203. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7/symbol.rb +3 -0
  204. data/lib/vendor/backports-3.3.5/lib/backports/1.8.7.rb +3 -0
  205. data/lib/vendor/backports-3.3.5/lib/backports/1.8.8.rb +2 -0
  206. data/lib/vendor/backports-3.3.5/lib/backports/1.8.rb +2 -0
  207. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/array/sample.rb +19 -0
  208. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/array/try_convert.rb +7 -0
  209. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/array.rb +3 -0
  210. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/dir/to_path.rb +3 -0
  211. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/dir.rb +3 -0
  212. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/enumerable/each_with_index.rb +14 -0
  213. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/enumerable/each_with_object.rb +9 -0
  214. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/enumerable.rb +3 -0
  215. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/enumerator/new.rb +40 -0
  216. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/enumerator/with_object.rb +6 -0
  217. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/enumerator.rb +3 -0
  218. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/env/key.rb +5 -0
  219. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/env.rb +3 -0
  220. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/atime.rb +5 -0
  221. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/basename.rb +5 -0
  222. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/binary.rb +6 -0
  223. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/blockdev.rb +5 -0
  224. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/chardev.rb +5 -0
  225. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/chmod.rb +5 -0
  226. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/chown.rb +5 -0
  227. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/ctime.rb +5 -0
  228. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/delete.rb +5 -0
  229. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/directory.rb +5 -0
  230. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/dirname.rb +5 -0
  231. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/executable.rb +5 -0
  232. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/executable_real.rb +5 -0
  233. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/exist.rb +5 -0
  234. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/exists.rb +5 -0
  235. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/expand_path.rb +14 -0
  236. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/extname.rb +5 -0
  237. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/file.rb +5 -0
  238. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/ftype.rb +5 -0
  239. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/grpowned.rb +5 -0
  240. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/join.rb +5 -0
  241. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/lchmod.rb +5 -0
  242. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/lchown.rb +5 -0
  243. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/link.rb +5 -0
  244. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/lstat.rb +5 -0
  245. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/mtime.rb +5 -0
  246. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/new.rb +5 -0
  247. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/open.rb +23 -0
  248. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/owned.rb +5 -0
  249. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/pipe.rb +5 -0
  250. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/readable.rb +5 -0
  251. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/readable_real.rb +5 -0
  252. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/readlink.rb +5 -0
  253. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/rename.rb +5 -0
  254. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/setgid.rb +5 -0
  255. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/setuid.rb +5 -0
  256. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/size.rb +14 -0
  257. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/socket.rb +5 -0
  258. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/split.rb +5 -0
  259. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/stat.rb +5 -0
  260. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/sticky.rb +5 -0
  261. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/symlink.rb +6 -0
  262. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/to_path.rb +3 -0
  263. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/truncate.rb +5 -0
  264. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/unlink.rb +5 -0
  265. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/writable.rb +5 -0
  266. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/writable_real.rb +5 -0
  267. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file/zero.rb +5 -0
  268. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/file.rb +3 -0
  269. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/float/round.rb +21 -0
  270. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/float.rb +3 -0
  271. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/hash/assoc.rb +12 -0
  272. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/hash/default_proc.rb +14 -0
  273. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/hash/key.rb +3 -0
  274. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/hash/rassoc.rb +9 -0
  275. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/hash/try_convert.rb +7 -0
  276. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/hash.rb +3 -0
  277. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/integer/magnitude.rb +3 -0
  278. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/integer/round.rb +24 -0
  279. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/integer.rb +3 -0
  280. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/io/binread.rb +10 -0
  281. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/io/open.rb +21 -0
  282. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/io/try_convert.rb +7 -0
  283. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/io/ungetbyte.rb +3 -0
  284. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/io.rb +3 -0
  285. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/kernel/__callee__.rb +7 -0
  286. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/kernel/define_singleton_method.rb +9 -0
  287. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/kernel/public_method.rb +11 -0
  288. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/kernel/public_send.rb +13 -0
  289. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/kernel/require_relative.rb +14 -0
  290. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/kernel.rb +3 -0
  291. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/math/log.rb +20 -0
  292. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/math/log2.rb +5 -0
  293. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/math.rb +3 -0
  294. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/numeric/round.rb +11 -0
  295. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/numeric.rb +3 -0
  296. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/proc/case_compare.rb +6 -0
  297. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/proc/curry.rb +24 -0
  298. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/proc/lambda.rb +40 -0
  299. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/proc/yield.rb +3 -0
  300. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/proc.rb +3 -0
  301. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/range/cover.rb +3 -0
  302. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/range.rb +3 -0
  303. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/regexp/try_convert.rb +7 -0
  304. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/regexp.rb +3 -0
  305. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/stdlib/prime.rb +497 -0
  306. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/stdlib.rb +1 -0
  307. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/ascii_only.rb +7 -0
  308. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/chr.rb +7 -0
  309. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/clear.rb +8 -0
  310. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/codepoints.rb +8 -0
  311. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/each_codepoint.rb +3 -0
  312. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/getbyte.rb +3 -0
  313. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/ord.rb +7 -0
  314. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/setbyte.rb +3 -0
  315. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string/try_convert.rb +7 -0
  316. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/string.rb +3 -0
  317. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/capitalize.rb +7 -0
  318. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/casecmp.rb +8 -0
  319. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/comparable.rb +7 -0
  320. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/comparison.rb +8 -0
  321. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/downcase.rb +7 -0
  322. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/element_reference.rb +7 -0
  323. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/empty.rb +7 -0
  324. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/length.rb +7 -0
  325. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/match.rb +9 -0
  326. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/next.rb +1 -0
  327. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/size.rb +7 -0
  328. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/succ.rb +8 -0
  329. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/swapcase.rb +7 -0
  330. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol/upcase.rb +7 -0
  331. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1/symbol.rb +3 -0
  332. data/lib/vendor/backports-3.3.5/lib/backports/1.9.1.rb +3 -0
  333. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/keep_if.rb +8 -0
  334. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/product.rb +26 -0
  335. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/repeated_combination.rb +25 -0
  336. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/repeated_permutation.rb +26 -0
  337. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/rotate.rb +17 -0
  338. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/select.rb +8 -0
  339. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/sort_by.rb +9 -0
  340. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array/uniq.rb +30 -0
  341. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/array.rb +3 -0
  342. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/complex/to_r.rb +10 -0
  343. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/complex.rb +3 -0
  344. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/dir/home.rb +5 -0
  345. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/dir.rb +3 -0
  346. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/enumerable/chunk.rb +39 -0
  347. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/enumerable/collect_concat.rb +1 -0
  348. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/enumerable/each_entry.rb +11 -0
  349. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/enumerable/flat_map.rb +11 -0
  350. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/enumerable/slice_before.rb +30 -0
  351. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/enumerable.rb +3 -0
  352. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/float/infinity.rb +3 -0
  353. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/float/nan.rb +3 -0
  354. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/float.rb +3 -0
  355. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/hash/keep_if.rb +8 -0
  356. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/hash/select.rb +9 -0
  357. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/hash.rb +3 -0
  358. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/kernel/singleton_class.rb +7 -0
  359. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/kernel.rb +3 -0
  360. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/random.rb +1 -0
  361. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/stdlib/matrix/eigenvalue_decomposition.rb +886 -0
  362. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/stdlib/matrix/lup_decomposition.rb +218 -0
  363. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/stdlib/matrix.rb +1871 -0
  364. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/stdlib/set.rb +13 -0
  365. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2/stdlib.rb +1 -0
  366. data/lib/vendor/backports-3.3.5/lib/backports/1.9.2.rb +3 -0
  367. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/file/null.rb +16 -0
  368. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/file.rb +3 -0
  369. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/io/advise.rb +24 -0
  370. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/io/binwrite.rb +7 -0
  371. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/io/write.rb +7 -0
  372. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/io.rb +3 -0
  373. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/string/byteslice.rb +36 -0
  374. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/string/prepend.rb +10 -0
  375. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3/string.rb +3 -0
  376. data/lib/vendor/backports-3.3.5/lib/backports/1.9.3.rb +3 -0
  377. data/lib/vendor/backports-3.3.5/lib/backports/1.9.rb +2 -0
  378. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/array/bsearch.rb +32 -0
  379. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/array.rb +3 -0
  380. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/enumerable/lazy.rb +216 -0
  381. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/enumerable.rb +3 -0
  382. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/enumerator/lazy.rb +1 -0
  383. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/enumerator.rb +3 -0
  384. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/env/to_h.rb +5 -0
  385. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/env.rb +3 -0
  386. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/hash/default_proc.rb +16 -0
  387. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/hash/to_h.rb +7 -0
  388. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/hash.rb +3 -0
  389. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/nil/to_h.rb +7 -0
  390. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/nil.rb +3 -0
  391. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/range/bsearch.rb +49 -0
  392. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/range.rb +3 -0
  393. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/stdlib/abbrev.rb +1 -0
  394. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/stdlib/fake_stdlib_lib.rb +1 -0
  395. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/stdlib/ostruct.rb +27 -0
  396. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/stdlib.rb +1 -0
  397. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/struct/to_h.rb +9 -0
  398. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0/struct.rb +3 -0
  399. data/lib/vendor/backports-3.3.5/lib/backports/2.0.0.rb +3 -0
  400. data/lib/vendor/backports-3.3.5/lib/backports/2.0.rb +2 -0
  401. data/lib/vendor/backports-3.3.5/lib/backports/basic_object.rb +53 -0
  402. data/lib/vendor/backports-3.3.5/lib/backports/extra/random/MT19937.rb +76 -0
  403. data/lib/vendor/backports-3.3.5/lib/backports/extra/random/bits_and_bytes.rb +91 -0
  404. data/lib/vendor/backports-3.3.5/lib/backports/extra/random/implementation.rb +93 -0
  405. data/lib/vendor/backports-3.3.5/lib/backports/extra/random/load.rb +17 -0
  406. data/lib/vendor/backports-3.3.5/lib/backports/force/array_map.rb +1 -0
  407. data/lib/vendor/backports-3.3.5/lib/backports/force/enumerable_map.rb +3 -0
  408. data/lib/vendor/backports-3.3.5/lib/backports/force/hash_select.rb +9 -0
  409. data/lib/vendor/backports-3.3.5/lib/backports/force/string_length.rb +10 -0
  410. data/lib/vendor/backports-3.3.5/lib/backports/force/string_size.rb +1 -0
  411. data/lib/vendor/backports-3.3.5/lib/backports/rails/array.rb +6 -0
  412. data/lib/vendor/backports-3.3.5/lib/backports/rails/enumerable.rb +12 -0
  413. data/lib/vendor/backports-3.3.5/lib/backports/rails/hash.rb +31 -0
  414. data/lib/vendor/backports-3.3.5/lib/backports/rails/kernel.rb +6 -0
  415. data/lib/vendor/backports-3.3.5/lib/backports/rails/module.rb +6 -0
  416. data/lib/vendor/backports-3.3.5/lib/backports/rails/string.rb +42 -0
  417. data/lib/vendor/backports-3.3.5/lib/backports/rails.rb +4 -0
  418. data/lib/vendor/backports-3.3.5/lib/backports/tools.rb +343 -0
  419. data/lib/vendor/backports-3.3.5/lib/backports/version.rb +3 -0
  420. data/lib/vendor/backports-3.3.5/lib/backports.rb +4 -0
  421. data/lib/vendor/dante-0.2.0/lib/dante/runner.rb +275 -0
  422. data/lib/vendor/dante-0.2.0/lib/dante/version.rb +3 -0
  423. data/lib/vendor/dante-0.2.0/lib/dante.rb +26 -0
  424. data/lib/vendor/rack-1.5.2/lib/rack/auth/abstract/handler.rb +37 -0
  425. data/lib/vendor/rack-1.5.2/lib/rack/auth/abstract/request.rb +43 -0
  426. data/lib/vendor/rack-1.5.2/lib/rack/auth/basic.rb +58 -0
  427. data/lib/vendor/rack-1.5.2/lib/rack/auth/digest/md5.rb +129 -0
  428. data/lib/vendor/rack-1.5.2/lib/rack/auth/digest/nonce.rb +51 -0
  429. data/lib/vendor/rack-1.5.2/lib/rack/auth/digest/params.rb +53 -0
  430. data/lib/vendor/rack-1.5.2/lib/rack/auth/digest/request.rb +41 -0
  431. data/lib/vendor/rack-1.5.2/lib/rack/backports/uri/common_18.rb +56 -0
  432. data/lib/vendor/rack-1.5.2/lib/rack/backports/uri/common_192.rb +52 -0
  433. data/lib/vendor/rack-1.5.2/lib/rack/backports/uri/common_193.rb +29 -0
  434. data/lib/vendor/rack-1.5.2/lib/rack/body_proxy.rb +39 -0
  435. data/lib/vendor/rack-1.5.2/lib/rack/builder.rb +149 -0
  436. data/lib/vendor/rack-1.5.2/lib/rack/cascade.rb +52 -0
  437. data/lib/vendor/rack-1.5.2/lib/rack/chunked.rb +58 -0
  438. data/lib/vendor/rack-1.5.2/lib/rack/commonlogger.rb +64 -0
  439. data/lib/vendor/rack-1.5.2/lib/rack/conditionalget.rb +67 -0
  440. data/lib/vendor/rack-1.5.2/lib/rack/config.rb +20 -0
  441. data/lib/vendor/rack-1.5.2/lib/rack/content_length.rb +33 -0
  442. data/lib/vendor/rack-1.5.2/lib/rack/content_type.rb +29 -0
  443. data/lib/vendor/rack-1.5.2/lib/rack/deflater.rb +116 -0
  444. data/lib/vendor/rack-1.5.2/lib/rack/directory.rb +161 -0
  445. data/lib/vendor/rack-1.5.2/lib/rack/etag.rb +64 -0
  446. data/lib/vendor/rack-1.5.2/lib/rack/file.rb +138 -0
  447. data/lib/vendor/rack-1.5.2/lib/rack/handler/cgi.rb +61 -0
  448. data/lib/vendor/rack-1.5.2/lib/rack/handler/evented_mongrel.rb +8 -0
  449. data/lib/vendor/rack-1.5.2/lib/rack/handler/fastcgi.rb +98 -0
  450. data/lib/vendor/rack-1.5.2/lib/rack/handler/lsws.rb +61 -0
  451. data/lib/vendor/rack-1.5.2/lib/rack/handler/mongrel.rb +100 -0
  452. data/lib/vendor/rack-1.5.2/lib/rack/handler/scgi.rb +67 -0
  453. data/lib/vendor/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  454. data/lib/vendor/rack-1.5.2/lib/rack/handler/thin.rb +27 -0
  455. data/lib/vendor/rack-1.5.2/lib/rack/handler/webrick.rb +81 -0
  456. data/lib/vendor/rack-1.5.2/lib/rack/handler.rb +107 -0
  457. data/lib/vendor/rack-1.5.2/lib/rack/head.rb +22 -0
  458. data/lib/vendor/rack-1.5.2/lib/rack/lint.rb +699 -0
  459. data/lib/vendor/rack-1.5.2/lib/rack/lobster.rb +65 -0
  460. data/lib/vendor/rack-1.5.2/lib/rack/lock.rb +26 -0
  461. data/lib/vendor/rack-1.5.2/lib/rack/logger.rb +18 -0
  462. data/lib/vendor/rack-1.5.2/lib/rack/methodoverride.rb +31 -0
  463. data/lib/vendor/rack-1.5.2/lib/rack/mime.rb +677 -0
  464. data/lib/vendor/rack-1.5.2/lib/rack/mock.rb +190 -0
  465. data/lib/vendor/rack-1.5.2/lib/rack/multipart/generator.rb +93 -0
  466. data/lib/vendor/rack-1.5.2/lib/rack/multipart/parser.rb +176 -0
  467. data/lib/vendor/rack-1.5.2/lib/rack/multipart/uploaded_file.rb +34 -0
  468. data/lib/vendor/rack-1.5.2/lib/rack/multipart.rb +34 -0
  469. data/lib/vendor/rack-1.5.2/lib/rack/nulllogger.rb +18 -0
  470. data/lib/vendor/rack-1.5.2/lib/rack/recursive.rb +61 -0
  471. data/lib/vendor/rack-1.5.2/lib/rack/reloader.rb +109 -0
  472. data/lib/vendor/rack-1.5.2/lib/rack/request.rb +380 -0
  473. data/lib/vendor/rack-1.5.2/lib/rack/response.rb +155 -0
  474. data/lib/vendor/rack-1.5.2/lib/rack/rewindable_input.rb +104 -0
  475. data/lib/vendor/rack-1.5.2/lib/rack/runtime.rb +27 -0
  476. data/lib/vendor/rack-1.5.2/lib/rack/sendfile.rb +155 -0
  477. data/lib/vendor/rack-1.5.2/lib/rack/server.rb +362 -0
  478. data/lib/vendor/rack-1.5.2/lib/rack/session/abstract/id.rb +398 -0
  479. data/lib/vendor/rack-1.5.2/lib/rack/session/cookie.rb +178 -0
  480. data/lib/vendor/rack-1.5.2/lib/rack/session/memcache.rb +93 -0
  481. data/lib/vendor/rack-1.5.2/lib/rack/session/pool.rb +79 -0
  482. data/lib/vendor/rack-1.5.2/lib/rack/showexceptions.rb +378 -0
  483. data/lib/vendor/rack-1.5.2/lib/rack/showstatus.rb +113 -0
  484. data/lib/vendor/rack-1.5.2/lib/rack/static.rb +153 -0
  485. data/lib/vendor/rack-1.5.2/lib/rack/urlmap.rb +76 -0
  486. data/lib/vendor/rack-1.5.2/lib/rack/utils/okjson.rb +599 -0
  487. data/lib/vendor/rack-1.5.2/lib/rack/utils.rb +628 -0
  488. data/lib/vendor/rack-1.5.2/lib/rack.rb +87 -0
  489. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/authenticity_token.rb +31 -0
  490. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/base.rb +119 -0
  491. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/escaped_params.rb +87 -0
  492. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/form_token.rb +23 -0
  493. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/frame_options.rb +37 -0
  494. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/http_origin.rb +32 -0
  495. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/ip_spoofing.rb +23 -0
  496. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/json_csrf.rb +35 -0
  497. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/path_traversal.rb +47 -0
  498. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/remote_referrer.rb +20 -0
  499. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/remote_token.rb +22 -0
  500. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/session_hijacking.rb +36 -0
  501. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/version.rb +16 -0
  502. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection/xss_header.rb +25 -0
  503. data/lib/vendor/rack-protection-1.5.1/lib/rack/protection.rb +40 -0
  504. data/lib/vendor/rack-protection-1.5.1/lib/rack-protection.rb +1 -0
  505. data/lib/vendor/sinatra-1.4.4/.yardopts +5 -0
  506. data/lib/vendor/sinatra-1.4.4/lib/sinatra/base.rb +2034 -0
  507. data/lib/vendor/sinatra-1.4.4/lib/sinatra/images/404.png +0 -0
  508. data/lib/vendor/sinatra-1.4.4/lib/sinatra/images/500.png +0 -0
  509. data/lib/vendor/sinatra-1.4.4/lib/sinatra/main.rb +34 -0
  510. data/lib/vendor/sinatra-1.4.4/lib/sinatra/show_exceptions.rb +345 -0
  511. data/lib/vendor/sinatra-1.4.4/lib/sinatra/version.rb +3 -0
  512. data/lib/vendor/sinatra-1.4.4/lib/sinatra.rb +4 -0
  513. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/capture.rb +124 -0
  514. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/config_file.rb +167 -0
  515. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/content_for.rb +125 -0
  516. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/contrib/all.rb +2 -0
  517. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/contrib/setup.rb +53 -0
  518. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/contrib/version.rb +17 -0
  519. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/contrib.rb +39 -0
  520. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/cookies.rb +331 -0
  521. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/decompile.rb +121 -0
  522. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/engine_tracking.rb +96 -0
  523. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/extension.rb +95 -0
  524. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/json.rb +131 -0
  525. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/link_header.rb +132 -0
  526. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/multi_route.rb +87 -0
  527. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/namespace.rb +284 -0
  528. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/reloader.rb +394 -0
  529. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/respond_with.rb +247 -0
  530. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/streaming.rb +243 -0
  531. data/lib/vendor/sinatra-contrib-1.4.1/lib/sinatra/test_helpers.rb +87 -0
  532. data/lib/vendor/tilt-1.4.1/lib/tilt/asciidoc.rb +34 -0
  533. data/lib/vendor/tilt-1.4.1/lib/tilt/builder.rb +40 -0
  534. data/lib/vendor/tilt-1.4.1/lib/tilt/coffee.rb +54 -0
  535. data/lib/vendor/tilt-1.4.1/lib/tilt/css.rb +80 -0
  536. data/lib/vendor/tilt-1.4.1/lib/tilt/csv.rb +71 -0
  537. data/lib/vendor/tilt-1.4.1/lib/tilt/erb.rb +110 -0
  538. data/lib/vendor/tilt-1.4.1/lib/tilt/etanni.rb +27 -0
  539. data/lib/vendor/tilt-1.4.1/lib/tilt/haml.rb +64 -0
  540. data/lib/vendor/tilt-1.4.1/lib/tilt/liquid.rb +45 -0
  541. data/lib/vendor/tilt-1.4.1/lib/tilt/markaby.rb +52 -0
  542. data/lib/vendor/tilt-1.4.1/lib/tilt/markdown.rb +214 -0
  543. data/lib/vendor/tilt-1.4.1/lib/tilt/nokogiri.rb +43 -0
  544. data/lib/vendor/tilt-1.4.1/lib/tilt/plain.rb +20 -0
  545. data/lib/vendor/tilt-1.4.1/lib/tilt/radius.rb +55 -0
  546. data/lib/vendor/tilt-1.4.1/lib/tilt/rdoc.rb +47 -0
  547. data/lib/vendor/tilt-1.4.1/lib/tilt/string.rb +21 -0
  548. data/lib/vendor/tilt-1.4.1/lib/tilt/template.rb +292 -0
  549. data/lib/vendor/tilt-1.4.1/lib/tilt/textile.rb +30 -0
  550. data/lib/vendor/tilt-1.4.1/lib/tilt/wiki.rb +58 -0
  551. data/lib/vendor/tilt-1.4.1/lib/tilt/yajl.rb +94 -0
  552. data/lib/vendor/tilt-1.4.1/lib/tilt.rb +204 -0
  553. data/scout_realtime.gemspec +30 -0
  554. data/test/data_for_testing.rb +1 -0
  555. data/test/lib/metric_test.rb +48 -0
  556. data/test/models/cpu_test.rb +24 -0
  557. data/test/models/disk_test.rb +24 -0
  558. data/test/models/memory_test.rb +24 -0
  559. data/test/models/network_test.rb +24 -0
  560. data/test/models/processes_test.rb +24 -0
  561. data/test/runner_test.rb +30 -0
  562. data/test/test_helper.rb +4 -0
  563. metadata +730 -0
@@ -0,0 +1,1871 @@
1
+ # encoding: utf-8
2
+ #
3
+ # = matrix.rb
4
+ #
5
+ # An implementation of Matrix and Vector classes.
6
+ #
7
+ # See classes Matrix and Vector for documentation.
8
+ #
9
+ # Current Maintainer:: Marc-André Lafortune
10
+ # Original Author:: Keiju ISHITSUKA
11
+ # Original Documentation:: Gavin Sinclair (sourced from <i>Ruby in a Nutshell</i> (Matsumoto, O'Reilly))
12
+ ##
13
+
14
+ require "e2mmap.rb"
15
+
16
+ module ExceptionForMatrix # :nodoc:
17
+ def_e2message(TypeError, "wrong argument type %s (expected %s)")
18
+ def_e2message(ArgumentError, "Wrong # of arguments(%d for %d)")
19
+
20
+ def_exception("ErrOperationNotDefined", "Operation(%s) can\\'t be defined: %s op %s") unless const_defined?(:ErrOperationNotDefined)
21
+ def_exception("ErrOperationNotImplemented", "Sorry, Operation(%s) not implemented: %s op %s") unless const_defined?(:ErrOperationNotImplemented)
22
+ end
23
+
24
+ #
25
+ # The +Matrix+ class represents a mathematical matrix. It provides methods for creating
26
+ # matrices, operating on them arithmetically and algebraically,
27
+ # and determining their mathematical properties (trace, rank, inverse, determinant).
28
+ #
29
+ # == Method Catalogue
30
+ #
31
+ # To create a matrix:
32
+ # * Matrix[*rows]
33
+ # * Matrix.[](*rows)
34
+ # * Matrix.rows(rows, copy = true)
35
+ # * Matrix.columns(columns)
36
+ # * Matrix.build(row_size, column_size, &block)
37
+ # * Matrix.diagonal(*values)
38
+ # * Matrix.scalar(n, value)
39
+ # * Matrix.identity(n)
40
+ # * Matrix.unit(n)
41
+ # * Matrix.I(n)
42
+ # * Matrix.zero(n)
43
+ # * Matrix.row_vector(row)
44
+ # * Matrix.column_vector(column)
45
+ #
46
+ # To access Matrix elements/columns/rows/submatrices/properties:
47
+ # * #[](i, j)
48
+ # * #row_size
49
+ # * #column_size
50
+ # * #row(i)
51
+ # * #column(j)
52
+ # * #collect
53
+ # * #map
54
+ # * #each
55
+ # * #each_with_index
56
+ # * #find_index
57
+ # * #minor(*param)
58
+ #
59
+ # Properties of a matrix:
60
+ # * #diagonal?
61
+ # * #empty?
62
+ # * #hermitian?
63
+ # * #lower_triangular?
64
+ # * #normal?
65
+ # * #orthogonal?
66
+ # * #permutation?
67
+ # * #real?
68
+ # * #regular?
69
+ # * #singular?
70
+ # * #square?
71
+ # * #symmetric?
72
+ # * #unitary?
73
+ # * #upper_triangular?
74
+ # * #zero?
75
+ #
76
+ # Matrix arithmetic:
77
+ # * #*(m)
78
+ # * #+(m)
79
+ # * #-(m)
80
+ # * #/(m)
81
+ # * #inverse
82
+ # * #inv
83
+ # * #**
84
+ #
85
+ # Matrix functions:
86
+ # * #determinant
87
+ # * #det
88
+ # * #rank
89
+ # * #round
90
+ # * #trace
91
+ # * #tr
92
+ # * #transpose
93
+ # * #t
94
+ #
95
+ # Matrix decompositions:
96
+ # * #eigen
97
+ # * #eigensystem
98
+ # * #lup
99
+ # * #lup_decomposition
100
+ #
101
+ # Complex arithmetic:
102
+ # * conj
103
+ # * conjugate
104
+ # * imag
105
+ # * imaginary
106
+ # * real
107
+ # * rect
108
+ # * rectangular
109
+ #
110
+ # Conversion to other data types:
111
+ # * #coerce(other)
112
+ # * #row_vectors
113
+ # * #column_vectors
114
+ # * #to_a
115
+ #
116
+ # String representations:
117
+ # * #to_s
118
+ # * #inspect
119
+ #
120
+ Backports.suppress_verbose_warnings do
121
+ class Matrix
122
+ include Enumerable
123
+ include ExceptionForMatrix
124
+ unless autoload?(:EigenvalueDecomposition)
125
+ autoload :EigenvalueDecomposition, File.expand_path("../matrix/eigenvalue_decomposition", __FILE__) if 42.respond_to?(:conj)
126
+ autoload :LUPDecomposition, File.expand_path("../matrix/lup_decomposition", __FILE__)
127
+ end
128
+
129
+ # instance creations
130
+ private_class_method :new
131
+ attr_reader :rows
132
+ protected :rows
133
+
134
+ #
135
+ # Creates a matrix where each argument is a row.
136
+ # Matrix[ [25, 93], [-1, 66] ]
137
+ # => 25 93
138
+ # -1 66
139
+ #
140
+ def Matrix.[](*rows)
141
+ rows(rows, false)
142
+ end
143
+
144
+ #
145
+ # Creates a matrix where +rows+ is an array of arrays, each of which is a row
146
+ # of the matrix. If the optional argument +copy+ is false, use the given
147
+ # arrays as the internal structure of the matrix without copying.
148
+ # Matrix.rows([[25, 93], [-1, 66]])
149
+ # => 25 93
150
+ # -1 66
151
+ #
152
+ def Matrix.rows(rows, copy = true)
153
+ rows = convert_to_array(rows)
154
+ rows.map! do |row|
155
+ convert_to_array(row, copy)
156
+ end
157
+ size = (rows[0] || []).size
158
+ rows.each do |row|
159
+ Matrix.Raise ErrDimensionMismatch, "row size differs (#{row.size} should be #{size})" unless row.size == size
160
+ end
161
+ new rows, size
162
+ end
163
+
164
+ #
165
+ # Creates a matrix using +columns+ as an array of column vectors.
166
+ # Matrix.columns([[25, 93], [-1, 66]])
167
+ # => 25 -1
168
+ # 93 66
169
+ #
170
+ def Matrix.columns(columns)
171
+ rows(columns, false).transpose
172
+ end
173
+
174
+ #
175
+ # Creates a matrix of size +row_size+ x +column_size+.
176
+ # It fills the values by calling the given block,
177
+ # passing the current row and column.
178
+ # Returns an enumerator if no block is given.
179
+ #
180
+ # m = Matrix.build(2, 4) {|row, col| col - row }
181
+ # => Matrix[[0, 1, 2, 3], [-1, 0, 1, 2]]
182
+ # m = Matrix.build(3) { rand }
183
+ # => a 3x3 matrix with random elements
184
+ #
185
+ def Matrix.build(row_size, column_size = row_size)
186
+ row_size = CoercionHelper.coerce_to_int(row_size)
187
+ column_size = CoercionHelper.coerce_to_int(column_size)
188
+ raise ArgumentError if row_size < 0 || column_size < 0
189
+ return to_enum(:build, row_size, column_size) unless block_given?
190
+ rows = Array.new(row_size) do |i|
191
+ Array.new(column_size) do |j|
192
+ yield i, j
193
+ end
194
+ end
195
+ new rows, column_size
196
+ end
197
+
198
+ #
199
+ # Creates a matrix where the diagonal elements are composed of +values+.
200
+ # Matrix.diagonal(9, 5, -3)
201
+ # => 9 0 0
202
+ # 0 5 0
203
+ # 0 0 -3
204
+ #
205
+ def Matrix.diagonal(*values)
206
+ size = values.size
207
+ rows = Array.new(size) {|j|
208
+ row = Array.new(size, 0)
209
+ row[j] = values[j]
210
+ row
211
+ }
212
+ new rows
213
+ end
214
+
215
+ #
216
+ # Creates an +n+ by +n+ diagonal matrix where each diagonal element is
217
+ # +value+.
218
+ # Matrix.scalar(2, 5)
219
+ # => 5 0
220
+ # 0 5
221
+ #
222
+ def Matrix.scalar(n, value)
223
+ diagonal(*Array.new(n, value))
224
+ end
225
+
226
+ #
227
+ # Creates an +n+ by +n+ identity matrix.
228
+ # Matrix.identity(2)
229
+ # => 1 0
230
+ # 0 1
231
+ #
232
+ def Matrix.identity(n)
233
+ scalar(n, 1)
234
+ end
235
+ class << Matrix
236
+ alias unit identity
237
+ alias I identity
238
+ end
239
+
240
+ #
241
+ # Creates a zero matrix.
242
+ # Matrix.zero(2)
243
+ # => 0 0
244
+ # 0 0
245
+ #
246
+ def Matrix.zero(row_size, column_size = row_size)
247
+ rows = Array.new(row_size){Array.new(column_size, 0)}
248
+ new rows, column_size
249
+ end
250
+
251
+ #
252
+ # Creates a single-row matrix where the values of that row are as given in
253
+ # +row+.
254
+ # Matrix.row_vector([4,5,6])
255
+ # => 4 5 6
256
+ #
257
+ def Matrix.row_vector(row)
258
+ row = convert_to_array(row)
259
+ new [row]
260
+ end
261
+
262
+ #
263
+ # Creates a single-column matrix where the values of that column are as given
264
+ # in +column+.
265
+ # Matrix.column_vector([4,5,6])
266
+ # => 4
267
+ # 5
268
+ # 6
269
+ #
270
+ def Matrix.column_vector(column)
271
+ column = convert_to_array(column)
272
+ new [column].transpose, 1
273
+ end
274
+
275
+ #
276
+ # Creates a empty matrix of +row_size+ x +column_size+.
277
+ # At least one of +row_size+ or +column_size+ must be 0.
278
+ #
279
+ # m = Matrix.empty(2, 0)
280
+ # m == Matrix[ [], [] ]
281
+ # => true
282
+ # n = Matrix.empty(0, 3)
283
+ # n == Matrix.columns([ [], [], [] ])
284
+ # => true
285
+ # m * n
286
+ # => Matrix[[0, 0, 0], [0, 0, 0]]
287
+ #
288
+ def Matrix.empty(row_size = 0, column_size = 0)
289
+ Matrix.Raise ArgumentError, "One size must be 0" if column_size != 0 && row_size != 0
290
+ Matrix.Raise ArgumentError, "Negative size" if column_size < 0 || row_size < 0
291
+
292
+ new([[]]*row_size, column_size)
293
+ end
294
+
295
+ #
296
+ # Matrix.new is private; use Matrix.rows, columns, [], etc... to create.
297
+ #
298
+ def initialize(rows, column_size = rows[0].size)
299
+ # No checking is done at this point. rows must be an Array of Arrays.
300
+ # column_size must be the size of the first row, if there is one,
301
+ # otherwise it *must* be specified and can be any integer >= 0
302
+ @rows = rows
303
+ @column_size = column_size
304
+ end
305
+
306
+ def new_matrix(rows, column_size = rows[0].size) # :nodoc:
307
+ self.class.send(:new, rows, column_size) # bypass privacy of Matrix.new
308
+ end
309
+ private :new_matrix
310
+
311
+ #
312
+ # Returns element (+i+,+j+) of the matrix. That is: row +i+, column +j+.
313
+ #
314
+ def [](i, j)
315
+ @rows.fetch(i){return nil}[j]
316
+ end
317
+ alias element []
318
+ alias component []
319
+
320
+ def []=(i, j, v)
321
+ @rows[i][j] = v
322
+ end
323
+ alias set_element []=
324
+ alias set_component []=
325
+ private :[]=, :set_element, :set_component
326
+
327
+ #
328
+ # Returns the number of rows.
329
+ #
330
+ def row_size
331
+ @rows.size
332
+ end
333
+
334
+ #
335
+ # Returns the number of columns.
336
+ #
337
+ attr_reader :column_size
338
+
339
+ #
340
+ # Returns row vector number +i+ of the matrix as a Vector (starting at 0 like
341
+ # an array). When a block is given, the elements of that vector are iterated.
342
+ #
343
+ def row(i, &block) # :yield: e
344
+ if block_given?
345
+ @rows.fetch(i){return self}.each(&block)
346
+ self
347
+ else
348
+ Vector.elements(@rows.fetch(i){return nil})
349
+ end
350
+ end
351
+
352
+ #
353
+ # Returns column vector number +j+ of the matrix as a Vector (starting at 0
354
+ # like an array). When a block is given, the elements of that vector are
355
+ # iterated.
356
+ #
357
+ def column(j) # :yield: e
358
+ if block_given?
359
+ return self if j >= column_size || j < -column_size
360
+ row_size.times do |i|
361
+ yield @rows[i][j]
362
+ end
363
+ self
364
+ else
365
+ return nil if j >= column_size || j < -column_size
366
+ col = Array.new(row_size) {|i|
367
+ @rows[i][j]
368
+ }
369
+ Vector.elements(col, false)
370
+ end
371
+ end
372
+
373
+ #
374
+ # Returns a matrix that is the result of iteration of the given block over all
375
+ # elements of the matrix.
376
+ # Matrix[ [1,2], [3,4] ].collect { |e| e**2 }
377
+ # => 1 4
378
+ # 9 16
379
+ #
380
+ def collect(&block) # :yield: e
381
+ return to_enum(:collect) unless block_given?
382
+ rows = @rows.collect{|row| row.collect(&block)}
383
+ new_matrix rows, column_size
384
+ end
385
+ alias map collect
386
+
387
+ #
388
+ # Yields all elements of the matrix, starting with those of the first row,
389
+ # or returns an Enumerator is no block given.
390
+ # Elements can be restricted by passing an argument:
391
+ # * :all (default): yields all elements
392
+ # * :diagonal: yields only elements on the diagonal
393
+ # * :off_diagonal: yields all elements except on the diagonal
394
+ # * :lower: yields only elements on or below the diagonal
395
+ # * :strict_lower: yields only elements below the diagonal
396
+ # * :strict_upper: yields only elements above the diagonal
397
+ # * :upper: yields only elements on or above the diagonal
398
+ #
399
+ # Matrix[ [1,2], [3,4] ].each { |e| puts e }
400
+ # # => prints the numbers 1 to 4
401
+ # Matrix[ [1,2], [3,4] ].each(:strict_lower).to_a # => [3]
402
+ #
403
+ def each(which = :all) # :yield: e
404
+ return to_enum(:each, which) unless block_given?
405
+ last = column_size - 1
406
+ case which
407
+ when :all
408
+ block = Proc.new
409
+ @rows.each do |row|
410
+ row.each(&block)
411
+ end
412
+ when :diagonal
413
+ @rows.each_with_index do |row, row_index|
414
+ yield row.fetch(row_index){return self}
415
+ end
416
+ when :off_diagonal
417
+ @rows.each_with_index do |row, row_index|
418
+ column_size.times do |col_index|
419
+ yield row[col_index] unless row_index == col_index
420
+ end
421
+ end
422
+ when :lower
423
+ @rows.each_with_index do |row, row_index|
424
+ 0.upto([row_index, last].min) do |col_index|
425
+ yield row[col_index]
426
+ end
427
+ end
428
+ when :strict_lower
429
+ @rows.each_with_index do |row, row_index|
430
+ [row_index, column_size].min.times do |col_index|
431
+ yield row[col_index]
432
+ end
433
+ end
434
+ when :strict_upper
435
+ @rows.each_with_index do |row, row_index|
436
+ (row_index+1).upto(last) do |col_index|
437
+ yield row[col_index]
438
+ end
439
+ end
440
+ when :upper
441
+ @rows.each_with_index do |row, row_index|
442
+ row_index.upto(last) do |col_index|
443
+ yield row[col_index]
444
+ end
445
+ end
446
+ else
447
+ Matrix.Raise ArgumentError, "expected #{which.inspect} to be one of :all, :diagonal, :off_diagonal, :lower, :strict_lower, :strict_upper or :upper"
448
+ end
449
+ self
450
+ end
451
+
452
+ #
453
+ # Same as #each, but the row index and column index in addition to the element
454
+ #
455
+ # Matrix[ [1,2], [3,4] ].each_with_index do |e, row, col|
456
+ # puts "#{e} at #{row}, #{col}"
457
+ # end
458
+ # # => Prints:
459
+ # # 1 at 0, 0
460
+ # # 2 at 0, 1
461
+ # # 3 at 1, 0
462
+ # # 4 at 1, 1
463
+ #
464
+ def each_with_index(which = :all) # :yield: e, row, column
465
+ return to_enum(:each_with_index, which) unless block_given?
466
+ last = column_size - 1
467
+ case which
468
+ when :all
469
+ @rows.each_with_index do |row, row_index|
470
+ row.each_with_index do |e, col_index|
471
+ yield e, row_index, col_index
472
+ end
473
+ end
474
+ when :diagonal
475
+ @rows.each_with_index do |row, row_index|
476
+ yield row.fetch(row_index){return self}, row_index, row_index
477
+ end
478
+ when :off_diagonal
479
+ @rows.each_with_index do |row, row_index|
480
+ column_size.times do |col_index|
481
+ yield row[col_index], row_index, col_index unless row_index == col_index
482
+ end
483
+ end
484
+ when :lower
485
+ @rows.each_with_index do |row, row_index|
486
+ 0.upto([row_index, last].min) do |col_index|
487
+ yield row[col_index], row_index, col_index
488
+ end
489
+ end
490
+ when :strict_lower
491
+ @rows.each_with_index do |row, row_index|
492
+ [row_index, column_size].min.times do |col_index|
493
+ yield row[col_index], row_index, col_index
494
+ end
495
+ end
496
+ when :strict_upper
497
+ @rows.each_with_index do |row, row_index|
498
+ (row_index+1).upto(last) do |col_index|
499
+ yield row[col_index], row_index, col_index
500
+ end
501
+ end
502
+ when :upper
503
+ @rows.each_with_index do |row, row_index|
504
+ row_index.upto(last) do |col_index|
505
+ yield row[col_index], row_index, col_index
506
+ end
507
+ end
508
+ else
509
+ Matrix.Raise ArgumentError, "expected #{which.inspect} to be one of :all, :diagonal, :off_diagonal, :lower, :strict_lower, :strict_upper or :upper"
510
+ end
511
+ self
512
+ end
513
+
514
+ SELECTORS = {:all => true, :diagonal => true, :off_diagonal => true, :lower => true, :strict_lower => true, :strict_upper => true, :upper => true}.freeze unless const_defined?(:SELECTORS)
515
+ #
516
+ # :call-seq:
517
+ # index(value, selector = :all) -> [row, column]
518
+ # index(selector = :all){ block } -> [row, column]
519
+ # index(selector = :all) -> an_enumerator
520
+ #
521
+ # The index method is specialized to return the index as [row, column]
522
+ # It also accepts an optional +selector+ argument, see #each for details.
523
+ #
524
+ # Matrix[ [1,2], [3,4] ].index(&:even?) # => [0, 1]
525
+ # Matrix[ [1,1], [1,1] ].index(1, :strict_lower) # => [1, 0]
526
+ #
527
+ def index(*args)
528
+ raise ArgumentError, "wrong number of arguments(#{args.size} for 0-2)" if args.size > 2
529
+ which = (args.size == 2 || SELECTORS.include?(args.last)) ? args.pop : :all
530
+ return to_enum(:find_index, which, *args) unless block_given? || args.size == 1
531
+ if args.size == 1
532
+ value = args.first
533
+ each_with_index(which) do |e, row_index, col_index|
534
+ return row_index, col_index if e == value
535
+ end
536
+ else
537
+ each_with_index(which) do |e, row_index, col_index|
538
+ return row_index, col_index if yield e
539
+ end
540
+ end
541
+ nil
542
+ end
543
+ alias_method :find_index, :index
544
+ #
545
+ # Returns a section of the matrix. The parameters are either:
546
+ # * start_row, nrows, start_col, ncols; OR
547
+ # * row_range, col_range
548
+ #
549
+ # Matrix.diagonal(9, 5, -3).minor(0..1, 0..2)
550
+ # => 9 0 0
551
+ # 0 5 0
552
+ #
553
+ # Like Array#[], negative indices count backward from the end of the
554
+ # row or column (-1 is the last element). Returns nil if the starting
555
+ # row or column is greater than row_size or column_size respectively.
556
+ #
557
+ def minor(*param)
558
+ case param.size
559
+ when 2
560
+ row_range, col_range = param
561
+ from_row = row_range.first
562
+ from_row += row_size if from_row < 0
563
+ to_row = row_range.end
564
+ to_row += row_size if to_row < 0
565
+ to_row += 1 unless row_range.exclude_end?
566
+ size_row = to_row - from_row
567
+
568
+ from_col = col_range.first
569
+ from_col += column_size if from_col < 0
570
+ to_col = col_range.end
571
+ to_col += column_size if to_col < 0
572
+ to_col += 1 unless col_range.exclude_end?
573
+ size_col = to_col - from_col
574
+ when 4
575
+ from_row, size_row, from_col, size_col = param
576
+ return nil if size_row < 0 || size_col < 0
577
+ from_row += row_size if from_row < 0
578
+ from_col += column_size if from_col < 0
579
+ else
580
+ Matrix.Raise ArgumentError, param.inspect
581
+ end
582
+
583
+ return nil if from_row > row_size || from_col > column_size || from_row < 0 || from_col < 0
584
+ rows = @rows[from_row, size_row].collect{|row|
585
+ row[from_col, size_col]
586
+ }
587
+ new_matrix rows, [column_size - from_col, size_col].min
588
+ end
589
+
590
+ #--
591
+ # TESTING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
592
+ #++
593
+
594
+ #
595
+ # Returns +true+ is this is a diagonal matrix.
596
+ # Raises an error if matrix is not square.
597
+ #
598
+ def diagonal?
599
+ Matrix.Raise ErrDimensionMismatch unless square?
600
+ each(:off_diagonal).all?(&:zero?)
601
+ end
602
+
603
+ #
604
+ # Returns +true+ if this is an empty matrix, i.e. if the number of rows
605
+ # or the number of columns is 0.
606
+ #
607
+ def empty?
608
+ column_size == 0 || row_size == 0
609
+ end
610
+
611
+
612
+ #
613
+ # Returns +true+ is this is an hermitian matrix.
614
+ # Raises an error if matrix is not square.
615
+ #
616
+
617
+ def hermitian?
618
+ Matrix.Raise ErrDimensionMismatch unless square?
619
+ each_with_index(:strict_upper).all? do |e, row, col|
620
+ e == rows[col][row].conj
621
+ end
622
+ end if 42.respond_to?(:conj)
623
+
624
+ #
625
+ # Returns +true+ is this is a lower triangular matrix.
626
+ #
627
+ def lower_triangular?
628
+ each(:strict_upper).all?(&:zero?)
629
+ end
630
+
631
+ #
632
+ # Returns +true+ is this is a normal matrix.
633
+ # Raises an error if matrix is not square.
634
+ #
635
+ def normal?
636
+ Matrix.Raise ErrDimensionMismatch unless square?
637
+ rows.each_with_index do |row_i, i|
638
+ rows.each_with_index do |row_j, j|
639
+ s = 0
640
+ rows.each_with_index do |row_k, k|
641
+ s += row_i[k] * row_j[k].conj - row_k[i].conj * row_k[j]
642
+ end
643
+ return false unless s == 0
644
+ end
645
+ end
646
+ true
647
+ end if 42.respond_to?(:conj)
648
+
649
+ #
650
+ # Returns +true+ is this is an orthogonal matrix
651
+ # Raises an error if matrix is not square.
652
+ #
653
+ def orthogonal?
654
+ Matrix.Raise ErrDimensionMismatch unless square?
655
+ rows.each_with_index do |row, i|
656
+ column_size.times do |j|
657
+ s = 0
658
+ row_size.times do |k|
659
+ s += row[k] * rows[k][j]
660
+ end
661
+ return false unless s == (i == j ? 1 : 0)
662
+ end
663
+ end
664
+ true
665
+ end
666
+
667
+ #
668
+ # Returns +true+ is this is a permutation matrix
669
+ # Raises an error if matrix is not square.
670
+ #
671
+ def permutation?
672
+ Matrix.Raise ErrDimensionMismatch unless square?
673
+ cols = Array.new(column_size)
674
+ rows.each_with_index do |row, i|
675
+ found = false
676
+ row.each_with_index do |e, j|
677
+ if e == 1
678
+ return false if found || cols[j]
679
+ found = cols[j] = true
680
+ elsif e != 0
681
+ return false
682
+ end
683
+ end
684
+ return false unless found
685
+ end
686
+ true
687
+ end
688
+
689
+ #
690
+ # Returns +true+ if all entries of the matrix are real.
691
+ #
692
+ def real?
693
+ all?(&:real?)
694
+ end
695
+
696
+ #
697
+ # Returns +true+ if this is a regular (i.e. non-singular) matrix.
698
+ #
699
+ def regular?
700
+ not singular?
701
+ end
702
+
703
+ #
704
+ # Returns +true+ is this is a singular matrix.
705
+ #
706
+ def singular?
707
+ determinant == 0
708
+ end
709
+
710
+ #
711
+ # Returns +true+ is this is a square matrix.
712
+ #
713
+ def square?
714
+ column_size == row_size
715
+ end
716
+
717
+ #
718
+ # Returns +true+ is this is a symmetric matrix.
719
+ # Raises an error if matrix is not square.
720
+ #
721
+ def symmetric?
722
+ Matrix.Raise ErrDimensionMismatch unless square?
723
+ each_with_index(:strict_upper) do |e, row, col|
724
+ return false if e != rows[col][row]
725
+ end
726
+ true
727
+ end
728
+
729
+ #
730
+ # Returns +true+ is this is a unitary matrix
731
+ # Raises an error if matrix is not square.
732
+ #
733
+ def unitary?
734
+ Matrix.Raise ErrDimensionMismatch unless square?
735
+ rows.each_with_index do |row, i|
736
+ column_size.times do |j|
737
+ s = 0
738
+ row_size.times do |k|
739
+ s += row[k].conj * rows[k][j]
740
+ end
741
+ return false unless s == (i == j ? 1 : 0)
742
+ end
743
+ end
744
+ true
745
+ end if 42.respond_to?(:conj)
746
+
747
+ #
748
+ # Returns +true+ is this is an upper triangular matrix.
749
+ #
750
+ def upper_triangular?
751
+ each(:strict_lower).all?(&:zero?)
752
+ end
753
+
754
+ #
755
+ # Returns +true+ is this is a matrix with only zero elements
756
+ #
757
+ def zero?
758
+ all?(&:zero?)
759
+ end
760
+
761
+ #--
762
+ # OBJECT METHODS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
763
+ #++
764
+
765
+ #
766
+ # Returns +true+ if and only if the two matrices contain equal elements.
767
+ #
768
+ def ==(other)
769
+ return false unless Matrix === other &&
770
+ column_size == other.column_size # necessary for empty matrices
771
+ rows == other.rows
772
+ end
773
+
774
+ def eql?(other)
775
+ return false unless Matrix === other &&
776
+ column_size == other.column_size # necessary for empty matrices
777
+ rows.eql? other.rows
778
+ end
779
+
780
+ #
781
+ # Returns a clone of the matrix, so that the contents of each do not reference
782
+ # identical objects.
783
+ # There should be no good reason to do this since Matrices are immutable.
784
+ #
785
+ def clone
786
+ new_matrix @rows.map(&:dup), column_size
787
+ end
788
+
789
+ #
790
+ # Returns a hash-code for the matrix.
791
+ #
792
+ def hash
793
+ @rows.hash
794
+ end
795
+
796
+ #--
797
+ # ARITHMETIC -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
798
+ #++
799
+
800
+ #
801
+ # Matrix multiplication.
802
+ # Matrix[[2,4], [6,8]] * Matrix.identity(2)
803
+ # => 2 4
804
+ # 6 8
805
+ #
806
+ def *(m) # m is matrix or vector or number
807
+ case(m)
808
+ when Numeric
809
+ rows = @rows.collect {|row|
810
+ row.collect {|e| e * m }
811
+ }
812
+ return new_matrix(rows, column_size)
813
+ when Vector
814
+ m = self.class.column_vector(m)
815
+ r = self * m
816
+ return r.column(0)
817
+ when Matrix
818
+ Matrix.Raise ErrDimensionMismatch if column_size != m.row_size
819
+
820
+ rows = Array.new(row_size) {|i|
821
+ Array.new(m.column_size) {|j|
822
+ (0 ... column_size).inject(0) do |vij, k|
823
+ vij + self[i, k] * m[k, j]
824
+ end
825
+ }
826
+ }
827
+ return new_matrix(rows, m.column_size)
828
+ else
829
+ return apply_through_coercion(m, __method__)
830
+ end
831
+ end
832
+
833
+ #
834
+ # Matrix addition.
835
+ # Matrix.scalar(2,5) + Matrix[[1,0], [-4,7]]
836
+ # => 6 0
837
+ # -4 12
838
+ #
839
+ def +(m)
840
+ case m
841
+ when Numeric
842
+ Matrix.Raise ErrOperationNotDefined, "+", self.class, m.class
843
+ when Vector
844
+ m = self.class.column_vector(m)
845
+ when Matrix
846
+ else
847
+ return apply_through_coercion(m, __method__)
848
+ end
849
+
850
+ Matrix.Raise ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size
851
+
852
+ rows = Array.new(row_size) {|i|
853
+ Array.new(column_size) {|j|
854
+ self[i, j] + m[i, j]
855
+ }
856
+ }
857
+ new_matrix rows, column_size
858
+ end
859
+
860
+ #
861
+ # Matrix subtraction.
862
+ # Matrix[[1,5], [4,2]] - Matrix[[9,3], [-4,1]]
863
+ # => -8 2
864
+ # 8 1
865
+ #
866
+ def -(m)
867
+ case m
868
+ when Numeric
869
+ Matrix.Raise ErrOperationNotDefined, "-", self.class, m.class
870
+ when Vector
871
+ m = self.class.column_vector(m)
872
+ when Matrix
873
+ else
874
+ return apply_through_coercion(m, __method__)
875
+ end
876
+
877
+ Matrix.Raise ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size
878
+
879
+ rows = Array.new(row_size) {|i|
880
+ Array.new(column_size) {|j|
881
+ self[i, j] - m[i, j]
882
+ }
883
+ }
884
+ new_matrix rows, column_size
885
+ end
886
+
887
+ #
888
+ # Matrix division (multiplication by the inverse).
889
+ # Matrix[[7,6], [3,9]] / Matrix[[2,9], [3,1]]
890
+ # => -7 1
891
+ # -3 -6
892
+ #
893
+ def /(other)
894
+ case other
895
+ when Numeric
896
+ rows = @rows.collect {|row|
897
+ row.collect {|e| e / other }
898
+ }
899
+ return new_matrix(rows, column_size)
900
+ when Matrix
901
+ return self * other.inverse
902
+ else
903
+ return apply_through_coercion(other, __method__)
904
+ end
905
+ end
906
+
907
+ #
908
+ # Returns the inverse of the matrix.
909
+ # Matrix[[-1, -1], [0, -1]].inverse
910
+ # => -1 1
911
+ # 0 -1
912
+ #
913
+ def inverse
914
+ Matrix.Raise ErrDimensionMismatch unless square?
915
+ self.class.I(row_size).send(:inverse_from, self)
916
+ end
917
+ alias inv inverse
918
+
919
+ def inverse_from(src) # :nodoc:
920
+ last = row_size - 1
921
+ a = src.to_a
922
+
923
+ 0.upto(last) do |k|
924
+ i = k
925
+ akk = a[k][k].abs
926
+ (k+1).upto(last) do |j|
927
+ v = a[j][k].abs
928
+ if v > akk
929
+ i = j
930
+ akk = v
931
+ end
932
+ end
933
+ Matrix.Raise ErrNotRegular if akk == 0
934
+ if i != k
935
+ a[i], a[k] = a[k], a[i]
936
+ @rows[i], @rows[k] = @rows[k], @rows[i]
937
+ end
938
+ akk = a[k][k]
939
+
940
+ 0.upto(last) do |ii|
941
+ next if ii == k
942
+ q = a[ii][k].quo(akk)
943
+ a[ii][k] = 0
944
+
945
+ (k + 1).upto(last) do |j|
946
+ a[ii][j] -= a[k][j] * q
947
+ end
948
+ 0.upto(last) do |j|
949
+ @rows[ii][j] -= @rows[k][j] * q
950
+ end
951
+ end
952
+
953
+ (k+1).upto(last) do |j|
954
+ a[k][j] = a[k][j].quo(akk)
955
+ end
956
+ 0.upto(last) do |j|
957
+ @rows[k][j] = @rows[k][j].quo(akk)
958
+ end
959
+ end
960
+ self
961
+ end
962
+ private :inverse_from
963
+
964
+ #
965
+ # Matrix exponentiation.
966
+ # Equivalent to multiplying the matrix by itself N times.
967
+ # Non integer exponents will be handled by diagonalizing the matrix.
968
+ #
969
+ # Matrix[[7,6], [3,9]] ** 2
970
+ # => 67 96
971
+ # 48 99
972
+ #
973
+ def ** (other)
974
+ case other
975
+ when Integer
976
+ x = self
977
+ if other <= 0
978
+ x = self.inverse
979
+ return self.class.identity(self.column_size) if other == 0
980
+ other = -other
981
+ end
982
+ z = nil
983
+ loop do
984
+ z = z ? z * x : x if other[0] == 1
985
+ return z if (other >>= 1).zero?
986
+ x *= x
987
+ end
988
+ when Numeric
989
+ v, d, v_inv = eigensystem
990
+ v * self.class.diagonal(*d.each(:diagonal).map{|e| e ** other}) * v_inv
991
+ else
992
+ Matrix.Raise ErrOperationNotDefined, "**", self.class, other.class
993
+ end
994
+ end
995
+
996
+ #--
997
+ # MATRIX FUNCTIONS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
998
+ #++
999
+
1000
+ #
1001
+ # Returns the determinant of the matrix.
1002
+ #
1003
+ # Beware that using Float values can yield erroneous results
1004
+ # because of their lack of precision.
1005
+ # Consider using exact types like Rational or BigDecimal instead.
1006
+ #
1007
+ # Matrix[[7,6], [3,9]].determinant
1008
+ # => 45
1009
+ #
1010
+ def determinant
1011
+ Matrix.Raise ErrDimensionMismatch unless square?
1012
+ m = @rows
1013
+ case row_size
1014
+ # Up to 4x4, give result using Laplacian expansion by minors.
1015
+ # This will typically be faster, as well as giving good results
1016
+ # in case of Floats
1017
+ when 0
1018
+ +1
1019
+ when 1
1020
+ + m[0][0]
1021
+ when 2
1022
+ + m[0][0] * m[1][1] - m[0][1] * m[1][0]
1023
+ when 3
1024
+ m0, m1, m2 = m
1025
+ + m0[0] * m1[1] * m2[2] - m0[0] * m1[2] * m2[1] \
1026
+ - m0[1] * m1[0] * m2[2] + m0[1] * m1[2] * m2[0] \
1027
+ + m0[2] * m1[0] * m2[1] - m0[2] * m1[1] * m2[0]
1028
+ when 4
1029
+ m0, m1, m2, m3 = m
1030
+ + m0[0] * m1[1] * m2[2] * m3[3] - m0[0] * m1[1] * m2[3] * m3[2] \
1031
+ - m0[0] * m1[2] * m2[1] * m3[3] + m0[0] * m1[2] * m2[3] * m3[1] \
1032
+ + m0[0] * m1[3] * m2[1] * m3[2] - m0[0] * m1[3] * m2[2] * m3[1] \
1033
+ - m0[1] * m1[0] * m2[2] * m3[3] + m0[1] * m1[0] * m2[3] * m3[2] \
1034
+ + m0[1] * m1[2] * m2[0] * m3[3] - m0[1] * m1[2] * m2[3] * m3[0] \
1035
+ - m0[1] * m1[3] * m2[0] * m3[2] + m0[1] * m1[3] * m2[2] * m3[0] \
1036
+ + m0[2] * m1[0] * m2[1] * m3[3] - m0[2] * m1[0] * m2[3] * m3[1] \
1037
+ - m0[2] * m1[1] * m2[0] * m3[3] + m0[2] * m1[1] * m2[3] * m3[0] \
1038
+ + m0[2] * m1[3] * m2[0] * m3[1] - m0[2] * m1[3] * m2[1] * m3[0] \
1039
+ - m0[3] * m1[0] * m2[1] * m3[2] + m0[3] * m1[0] * m2[2] * m3[1] \
1040
+ + m0[3] * m1[1] * m2[0] * m3[2] - m0[3] * m1[1] * m2[2] * m3[0] \
1041
+ - m0[3] * m1[2] * m2[0] * m3[1] + m0[3] * m1[2] * m2[1] * m3[0]
1042
+ else
1043
+ # For bigger matrices, use an efficient and general algorithm.
1044
+ # Currently, we use the Gauss-Bareiss algorithm
1045
+ determinant_bareiss
1046
+ end
1047
+ end
1048
+ alias_method :det, :determinant
1049
+
1050
+ #
1051
+ # Private. Use Matrix#determinant
1052
+ #
1053
+ # Returns the determinant of the matrix, using
1054
+ # Bareiss' multistep integer-preserving gaussian elimination.
1055
+ # It has the same computational cost order O(n^3) as standard Gaussian elimination.
1056
+ # Intermediate results are fraction free and of lower complexity.
1057
+ # A matrix of Integers will have thus intermediate results that are also Integers,
1058
+ # with smaller bignums (if any), while a matrix of Float will usually have
1059
+ # intermediate results with better precision.
1060
+ #
1061
+ def determinant_bareiss
1062
+ size = row_size
1063
+ last = size - 1
1064
+ a = to_a
1065
+ no_pivot = Proc.new{ return 0 }
1066
+ sign = +1
1067
+ pivot = 1
1068
+ size.times do |k|
1069
+ previous_pivot = pivot
1070
+ if (pivot = a[k][k]) == 0
1071
+ switch = (k+1 ... size).find(no_pivot) {|row|
1072
+ a[row][k] != 0
1073
+ }
1074
+ a[switch], a[k] = a[k], a[switch]
1075
+ pivot = a[k][k]
1076
+ sign = -sign
1077
+ end
1078
+ (k+1).upto(last) do |i|
1079
+ ai = a[i]
1080
+ (k+1).upto(last) do |j|
1081
+ ai[j] = (pivot * ai[j] - ai[k] * a[k][j]) / previous_pivot
1082
+ end
1083
+ end
1084
+ end
1085
+ sign * pivot
1086
+ end
1087
+ private :determinant_bareiss
1088
+
1089
+ #
1090
+ # deprecated; use Matrix#determinant
1091
+ #
1092
+ def determinant_e
1093
+ warn "#{caller(1)[0]}: warning: Matrix#determinant_e is deprecated; use #determinant"
1094
+ rank
1095
+ end
1096
+ alias det_e determinant_e
1097
+
1098
+ #
1099
+ # Returns the rank of the matrix.
1100
+ # Beware that using Float values can yield erroneous results
1101
+ # because of their lack of precision.
1102
+ # Consider using exact types like Rational or BigDecimal instead.
1103
+ #
1104
+ # Matrix[[7,6], [3,9]].rank
1105
+ # => 2
1106
+ #
1107
+ def rank
1108
+ # We currently use Bareiss' multistep integer-preserving gaussian elimination
1109
+ # (see comments on determinant)
1110
+ a = to_a
1111
+ last_column = column_size - 1
1112
+ last_row = row_size - 1
1113
+ pivot_row = 0
1114
+ previous_pivot = 1
1115
+ 0.upto(last_column) do |k|
1116
+ switch_row = (pivot_row .. last_row).find {|row|
1117
+ a[row][k] != 0
1118
+ }
1119
+ if switch_row
1120
+ a[switch_row], a[pivot_row] = a[pivot_row], a[switch_row] unless pivot_row == switch_row
1121
+ pivot = a[pivot_row][k]
1122
+ (pivot_row+1).upto(last_row) do |i|
1123
+ ai = a[i]
1124
+ (k+1).upto(last_column) do |j|
1125
+ ai[j] = (pivot * ai[j] - ai[k] * a[pivot_row][j]) / previous_pivot
1126
+ end
1127
+ end
1128
+ pivot_row += 1
1129
+ previous_pivot = pivot
1130
+ end
1131
+ end
1132
+ pivot_row
1133
+ end
1134
+
1135
+ #
1136
+ # deprecated; use Matrix#rank
1137
+ #
1138
+ def rank_e
1139
+ warn "#{caller(1)[0]}: warning: Matrix#rank_e is deprecated; use #rank"
1140
+ rank
1141
+ end
1142
+
1143
+ # Returns a matrix with entries rounded to the given precision
1144
+ # (see Float#round)
1145
+ #
1146
+ def round(ndigits=0)
1147
+ map{|e| e.round(ndigits)}
1148
+ end
1149
+
1150
+ #
1151
+ # Returns the trace (sum of diagonal elements) of the matrix.
1152
+ # Matrix[[7,6], [3,9]].trace
1153
+ # => 16
1154
+ #
1155
+ def trace
1156
+ Matrix.Raise ErrDimensionMismatch unless square?
1157
+ (0...column_size).inject(0) do |tr, i|
1158
+ tr + @rows[i][i]
1159
+ end
1160
+ end
1161
+ alias tr trace
1162
+
1163
+ #
1164
+ # Returns the transpose of the matrix.
1165
+ # Matrix[[1,2], [3,4], [5,6]]
1166
+ # => 1 2
1167
+ # 3 4
1168
+ # 5 6
1169
+ # Matrix[[1,2], [3,4], [5,6]].transpose
1170
+ # => 1 3 5
1171
+ # 2 4 6
1172
+ #
1173
+ def transpose
1174
+ return self.class.empty(column_size, 0) if row_size.zero?
1175
+ new_matrix @rows.transpose, row_size
1176
+ end
1177
+ alias t transpose
1178
+
1179
+ #--
1180
+ # DECOMPOSITIONS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1181
+ #++
1182
+
1183
+ #
1184
+ # Returns the Eigensystem of the matrix; see +EigenvalueDecomposition+.
1185
+ # m = Matrix[[1, 2], [3, 4]]
1186
+ # v, d, v_inv = m.eigensystem
1187
+ # d.diagonal? # => true
1188
+ # v.inv == v_inv # => true
1189
+ # (v * d * v_inv).round(5) == m # => true
1190
+ #
1191
+ def eigensystem
1192
+ EigenvalueDecomposition.new(self)
1193
+ end
1194
+ alias eigen eigensystem
1195
+
1196
+ #
1197
+ # Returns the LUP decomposition of the matrix; see +LUPDecomposition+.
1198
+ # a = Matrix[[1, 2], [3, 4]]
1199
+ # l, u, p = a.lup
1200
+ # l.lower_triangular? # => true
1201
+ # u.upper_triangular? # => true
1202
+ # p.permutation? # => true
1203
+ # l * u == a * p # => true
1204
+ # a.lup.solve([2, 5]) # => Vector[(1/1), (1/2)]
1205
+ #
1206
+ def lup
1207
+ LUPDecomposition.new(self)
1208
+ end
1209
+ alias lup_decomposition lup
1210
+
1211
+ if 42.respond_to?(:conj)
1212
+ #--
1213
+ # COMPLEX ARITHMETIC -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
1214
+ #++
1215
+
1216
+ #
1217
+ # Returns the conjugate of the matrix.
1218
+ # Matrix[[Complex(1,2), Complex(0,1), 0], [1, 2, 3]]
1219
+ # => 1+2i i 0
1220
+ # 1 2 3
1221
+ # Matrix[[Complex(1,2), Complex(0,1), 0], [1, 2, 3]].conjugate
1222
+ # => 1-2i -i 0
1223
+ # 1 2 3
1224
+ #
1225
+ def conjugate
1226
+ collect(&:conjugate)
1227
+ end
1228
+ alias conj conjugate
1229
+
1230
+ #
1231
+ # Returns the imaginary part of the matrix.
1232
+ # Matrix[[Complex(1,2), Complex(0,1), 0], [1, 2, 3]]
1233
+ # => 1+2i i 0
1234
+ # 1 2 3
1235
+ # Matrix[[Complex(1,2), Complex(0,1), 0], [1, 2, 3]].imaginary
1236
+ # => 2i i 0
1237
+ # 0 0 0
1238
+ #
1239
+ def imaginary
1240
+ collect(&:imaginary)
1241
+ end
1242
+ alias imag imaginary
1243
+
1244
+ #
1245
+ # Returns the real part of the matrix.
1246
+ # Matrix[[Complex(1,2), Complex(0,1), 0], [1, 2, 3]]
1247
+ # => 1+2i i 0
1248
+ # 1 2 3
1249
+ # Matrix[[Complex(1,2), Complex(0,1), 0], [1, 2, 3]].real
1250
+ # => 1 0 0
1251
+ # 1 2 3
1252
+ #
1253
+ def real
1254
+ collect(&:real)
1255
+ end
1256
+
1257
+ #
1258
+ # Returns an array containing matrices corresponding to the real and imaginary
1259
+ # parts of the matrix
1260
+ #
1261
+ # m.rect == [m.real, m.imag] # ==> true for all matrices m
1262
+ #
1263
+ def rect
1264
+ [real, imag]
1265
+ end
1266
+ alias rectangular rect
1267
+ end
1268
+ #--
1269
+ # CONVERTING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1270
+ #++
1271
+
1272
+ #
1273
+ # The coerce method provides support for Ruby type coercion.
1274
+ # This coercion mechanism is used by Ruby to handle mixed-type
1275
+ # numeric operations: it is intended to find a compatible common
1276
+ # type between the two operands of the operator.
1277
+ # See also Numeric#coerce.
1278
+ #
1279
+ def coerce(other)
1280
+ case other
1281
+ when Numeric
1282
+ return Scalar.new(other), self
1283
+ else
1284
+ raise TypeError, "#{self.class} can't be coerced into #{other.class}"
1285
+ end
1286
+ end
1287
+
1288
+ #
1289
+ # Returns an array of the row vectors of the matrix. See Vector.
1290
+ #
1291
+ def row_vectors
1292
+ Array.new(row_size) {|i|
1293
+ row(i)
1294
+ }
1295
+ end
1296
+
1297
+ #
1298
+ # Returns an array of the column vectors of the matrix. See Vector.
1299
+ #
1300
+ def column_vectors
1301
+ Array.new(column_size) {|i|
1302
+ column(i)
1303
+ }
1304
+ end
1305
+
1306
+ #
1307
+ # Returns an array of arrays that describe the rows of the matrix.
1308
+ #
1309
+ def to_a
1310
+ @rows.collect(&:dup)
1311
+ end
1312
+
1313
+ def elements_to_f
1314
+ warn "#{caller(1)[0]}: warning: Matrix#elements_to_f is deprecated, use map(&:to_f)"
1315
+ map(&:to_f)
1316
+ end
1317
+
1318
+ def elements_to_i
1319
+ warn "#{caller(1)[0]}: warning: Matrix#elements_to_i is deprecated, use map(&:to_i)"
1320
+ map(&:to_i)
1321
+ end
1322
+
1323
+ def elements_to_r
1324
+ warn "#{caller(1)[0]}: warning: Matrix#elements_to_r is deprecated, use map(&:to_r)"
1325
+ map(&:to_r)
1326
+ end
1327
+
1328
+ #--
1329
+ # PRINTING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1330
+ #++
1331
+
1332
+ #
1333
+ # Overrides Object#to_s
1334
+ #
1335
+ def to_s
1336
+ if empty?
1337
+ "#{self.class}.empty(#{row_size}, #{column_size})"
1338
+ else
1339
+ "#{self.class}[" + @rows.collect{|row|
1340
+ "[" + row.collect{|e| e.to_s}.join(", ") + "]"
1341
+ }.join(", ")+"]"
1342
+ end
1343
+ end
1344
+
1345
+ #
1346
+ # Overrides Object#inspect
1347
+ #
1348
+ def inspect
1349
+ if empty?
1350
+ "#{self.class}.empty(#{row_size}, #{column_size})"
1351
+ else
1352
+ "#{self.class}#{@rows.inspect}"
1353
+ end
1354
+ end
1355
+
1356
+ # Private helper modules
1357
+
1358
+ module ConversionHelper # :nodoc:
1359
+ #
1360
+ # Converts the obj to an Array. If copy is set to true
1361
+ # a copy of obj will be made if necessary.
1362
+ #
1363
+ def convert_to_array(obj, copy = false) # :nodoc:
1364
+ case obj
1365
+ when Array
1366
+ copy ? obj.dup : obj
1367
+ when Vector
1368
+ obj.to_a
1369
+ else
1370
+ begin
1371
+ converted = obj.to_ary
1372
+ rescue Exception => e
1373
+ raise TypeError, "can't convert #{obj.class} into an Array (#{e.message})"
1374
+ end
1375
+ raise TypeError, "#{obj.class}#to_ary should return an Array" unless converted.is_a? Array
1376
+ converted
1377
+ end
1378
+ end
1379
+ private :convert_to_array
1380
+ end
1381
+
1382
+ extend ConversionHelper
1383
+
1384
+ module CoercionHelper # :nodoc:
1385
+ #
1386
+ # Applies the operator +oper+ with argument +obj+
1387
+ # through coercion of +obj+
1388
+ #
1389
+ def apply_through_coercion(obj, oper)
1390
+ coercion = obj.coerce(self)
1391
+ raise TypeError unless coercion.is_a?(Array) && coercion.length == 2
1392
+ coercion[0].public_send(oper, coercion[1])
1393
+ rescue
1394
+ raise TypeError, "#{obj.inspect} can't be coerced into #{self.class}"
1395
+ end
1396
+ private :apply_through_coercion
1397
+
1398
+ #
1399
+ # Helper method to coerce a value into a specific class.
1400
+ # Raises a TypeError if the coercion fails or the returned value
1401
+ # is not of the right class.
1402
+ # (from Rubinius)
1403
+ #
1404
+ def self.coerce_to(obj, cls, meth) # :nodoc:
1405
+ return obj if obj.kind_of?(cls)
1406
+
1407
+ begin
1408
+ ret = obj.__send__(meth)
1409
+ rescue Exception => e
1410
+ raise TypeError, "Coercion error: #{obj.inspect}.#{meth} => #{cls} failed:\n" \
1411
+ "(#{e.message})"
1412
+ end
1413
+ raise TypeError, "Coercion error: obj.#{meth} did NOT return a #{cls} (was #{ret.class})" unless ret.kind_of? cls
1414
+ ret
1415
+ end
1416
+
1417
+ def self.coerce_to_int(obj)
1418
+ coerce_to(obj, Integer, :to_int)
1419
+ end
1420
+ end
1421
+
1422
+ include CoercionHelper
1423
+
1424
+ # Private CLASS
1425
+
1426
+ class Scalar < Numeric # :nodoc:
1427
+ include ExceptionForMatrix
1428
+ include CoercionHelper
1429
+
1430
+ def initialize(value)
1431
+ @value = value
1432
+ end
1433
+
1434
+ # ARITHMETIC
1435
+ def +(other)
1436
+ case other
1437
+ when Numeric
1438
+ Scalar.new(@value + other)
1439
+ when Vector, Matrix
1440
+ Scalar.Raise ErrOperationNotDefined, "+", @value.class, other.class
1441
+ else
1442
+ apply_through_coercion(other, __method__)
1443
+ end
1444
+ end
1445
+
1446
+ def -(other)
1447
+ case other
1448
+ when Numeric
1449
+ Scalar.new(@value - other)
1450
+ when Vector, Matrix
1451
+ Scalar.Raise ErrOperationNotDefined, "-", @value.class, other.class
1452
+ else
1453
+ apply_through_coercion(other, __method__)
1454
+ end
1455
+ end
1456
+
1457
+ def *(other)
1458
+ case other
1459
+ when Numeric
1460
+ Scalar.new(@value * other)
1461
+ when Vector, Matrix
1462
+ other.collect{|e| @value * e}
1463
+ else
1464
+ apply_through_coercion(other, __method__)
1465
+ end
1466
+ end
1467
+
1468
+ def / (other)
1469
+ case other
1470
+ when Numeric
1471
+ Scalar.new(@value / other)
1472
+ when Vector
1473
+ Scalar.Raise ErrOperationNotDefined, "/", @value.class, other.class
1474
+ when Matrix
1475
+ self * other.inverse
1476
+ else
1477
+ apply_through_coercion(other, __method__)
1478
+ end
1479
+ end
1480
+
1481
+ def ** (other)
1482
+ case other
1483
+ when Numeric
1484
+ Scalar.new(@value ** other)
1485
+ when Vector
1486
+ Scalar.Raise ErrOperationNotDefined, "**", @value.class, other.class
1487
+ when Matrix
1488
+ #other.powered_by(self)
1489
+ Scalar.Raise ErrOperationNotImplemented, "**", @value.class, other.class
1490
+ else
1491
+ apply_through_coercion(other, __method__)
1492
+ end
1493
+ end
1494
+ end
1495
+
1496
+ end
1497
+
1498
+
1499
+ #
1500
+ # The +Vector+ class represents a mathematical vector, which is useful in its own right, and
1501
+ # also constitutes a row or column of a Matrix.
1502
+ #
1503
+ # == Method Catalogue
1504
+ #
1505
+ # To create a Vector:
1506
+ # * Vector.[](*array)
1507
+ # * Vector.elements(array, copy = true)
1508
+ #
1509
+ # To access elements:
1510
+ # * #[](i)
1511
+ #
1512
+ # To enumerate the elements:
1513
+ # * #each2(v)
1514
+ # * #collect2(v)
1515
+ #
1516
+ # Vector arithmetic:
1517
+ # * #*(x) "is matrix or number"
1518
+ # * #+(v)
1519
+ # * #-(v)
1520
+ #
1521
+ # Vector functions:
1522
+ # * #inner_product(v)
1523
+ # * #collect
1524
+ # * #magnitude
1525
+ # * #map
1526
+ # * #map2(v)
1527
+ # * #norm
1528
+ # * #normalize
1529
+ # * #r
1530
+ # * #size
1531
+ #
1532
+ # Conversion to other data types:
1533
+ # * #covector
1534
+ # * #to_a
1535
+ # * #coerce(other)
1536
+ #
1537
+ # String representations:
1538
+ # * #to_s
1539
+ # * #inspect
1540
+ #
1541
+ class Vector
1542
+ include ExceptionForMatrix
1543
+ include Enumerable
1544
+ include Matrix::CoercionHelper
1545
+ extend Matrix::ConversionHelper
1546
+ #INSTANCE CREATION
1547
+
1548
+ private_class_method :new
1549
+ attr_reader :elements
1550
+ protected :elements
1551
+
1552
+ #
1553
+ # Creates a Vector from a list of elements.
1554
+ # Vector[7, 4, ...]
1555
+ #
1556
+ def Vector.[](*array)
1557
+ new convert_to_array(array, false)
1558
+ end
1559
+
1560
+ #
1561
+ # Creates a vector from an Array. The optional second argument specifies
1562
+ # whether the array itself or a copy is used internally.
1563
+ #
1564
+ def Vector.elements(array, copy = true)
1565
+ new convert_to_array(array, copy)
1566
+ end
1567
+
1568
+ #
1569
+ # Vector.new is private; use Vector[] or Vector.elements to create.
1570
+ #
1571
+ def initialize(array)
1572
+ # No checking is done at this point.
1573
+ @elements = array
1574
+ end
1575
+
1576
+ # ACCESSING
1577
+
1578
+ #
1579
+ # Returns element number +i+ (starting at zero) of the vector.
1580
+ #
1581
+ def [](i)
1582
+ @elements[i]
1583
+ end
1584
+ alias element []
1585
+ alias component []
1586
+
1587
+ def []=(i, v)
1588
+ @elements[i]= v
1589
+ end
1590
+ alias set_element []=
1591
+ alias set_component []=
1592
+ private :[]=, :set_element, :set_component
1593
+
1594
+ #
1595
+ # Returns the number of elements in the vector.
1596
+ #
1597
+ def size
1598
+ @elements.size
1599
+ end
1600
+
1601
+ #--
1602
+ # ENUMERATIONS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1603
+ #++
1604
+
1605
+ #
1606
+ # Iterate over the elements of this vector
1607
+ #
1608
+ def each(&block)
1609
+ return to_enum(:each) unless block_given?
1610
+ @elements.each(&block)
1611
+ self
1612
+ end
1613
+
1614
+ #
1615
+ # Iterate over the elements of this vector and +v+ in conjunction.
1616
+ #
1617
+ def each2(v) # :yield: e1, e2
1618
+ raise TypeError, "Integer is not like Vector" if v.kind_of?(Integer)
1619
+ Vector.Raise ErrDimensionMismatch if size != v.size
1620
+ return to_enum(:each2, v) unless block_given?
1621
+ size.times do |i|
1622
+ yield @elements[i], v[i]
1623
+ end
1624
+ self
1625
+ end
1626
+
1627
+ #
1628
+ # Collects (as in Enumerable#collect) over the elements of this vector and +v+
1629
+ # in conjunction.
1630
+ #
1631
+ def collect2(v) # :yield: e1, e2
1632
+ raise TypeError, "Integer is not like Vector" if v.kind_of?(Integer)
1633
+ Vector.Raise ErrDimensionMismatch if size != v.size
1634
+ return to_enum(:collect2, v) unless block_given?
1635
+ Array.new(size) do |i|
1636
+ yield @elements[i], v[i]
1637
+ end
1638
+ end
1639
+
1640
+ #--
1641
+ # COMPARING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1642
+ #++
1643
+
1644
+ #
1645
+ # Returns +true+ iff the two vectors have the same elements in the same order.
1646
+ #
1647
+ def ==(other)
1648
+ return false unless Vector === other
1649
+ @elements == other.elements
1650
+ end
1651
+
1652
+ def eql?(other)
1653
+ return false unless Vector === other
1654
+ @elements.eql? other.elements
1655
+ end
1656
+
1657
+ #
1658
+ # Return a copy of the vector.
1659
+ #
1660
+ def clone
1661
+ self.class.elements(@elements)
1662
+ end
1663
+
1664
+ #
1665
+ # Return a hash-code for the vector.
1666
+ #
1667
+ def hash
1668
+ @elements.hash
1669
+ end
1670
+
1671
+ #--
1672
+ # ARITHMETIC -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1673
+ #++
1674
+
1675
+ #
1676
+ # Multiplies the vector by +x+, where +x+ is a number or another vector.
1677
+ #
1678
+ def *(x)
1679
+ case x
1680
+ when Numeric
1681
+ els = @elements.collect{|e| e * x}
1682
+ self.class.elements(els, false)
1683
+ when Matrix
1684
+ Matrix.column_vector(self) * x
1685
+ when Vector
1686
+ Vector.Raise ErrOperationNotDefined, "*", self.class, x.class
1687
+ else
1688
+ apply_through_coercion(x, __method__)
1689
+ end
1690
+ end
1691
+
1692
+ #
1693
+ # Vector addition.
1694
+ #
1695
+ def +(v)
1696
+ case v
1697
+ when Vector
1698
+ Vector.Raise ErrDimensionMismatch if size != v.size
1699
+ els = collect2(v) {|v1, v2|
1700
+ v1 + v2
1701
+ }
1702
+ self.class.elements(els, false)
1703
+ when Matrix
1704
+ Matrix.column_vector(self) + v
1705
+ else
1706
+ apply_through_coercion(v, __method__)
1707
+ end
1708
+ end
1709
+
1710
+ #
1711
+ # Vector subtraction.
1712
+ #
1713
+ def -(v)
1714
+ case v
1715
+ when Vector
1716
+ Vector.Raise ErrDimensionMismatch if size != v.size
1717
+ els = collect2(v) {|v1, v2|
1718
+ v1 - v2
1719
+ }
1720
+ self.class.elements(els, false)
1721
+ when Matrix
1722
+ Matrix.column_vector(self) - v
1723
+ else
1724
+ apply_through_coercion(v, __method__)
1725
+ end
1726
+ end
1727
+
1728
+ #
1729
+ # Vector division.
1730
+ #
1731
+ def /(x)
1732
+ case x
1733
+ when Numeric
1734
+ els = @elements.collect{|e| e / x}
1735
+ self.class.elements(els, false)
1736
+ when Matrix, Vector
1737
+ Vector.Raise ErrOperationNotDefined, "/", self.class, x.class
1738
+ else
1739
+ apply_through_coercion(x, __method__)
1740
+ end
1741
+ end
1742
+
1743
+ #--
1744
+ # VECTOR FUNCTIONS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1745
+ #++
1746
+
1747
+ #
1748
+ # Returns the inner product of this vector with the other.
1749
+ # Vector[4,7].inner_product Vector[10,1] => 47
1750
+ #
1751
+ def inner_product(v)
1752
+ Vector.Raise ErrDimensionMismatch if size != v.size
1753
+
1754
+ p = 0
1755
+ each2(v) {|v1, v2|
1756
+ p += v1 * v2
1757
+ }
1758
+ p
1759
+ end
1760
+
1761
+ #
1762
+ # Like Array#collect.
1763
+ #
1764
+ def collect(&block) # :yield: e
1765
+ return to_enum(:collect) unless block_given?
1766
+ els = @elements.collect(&block)
1767
+ self.class.elements(els, false)
1768
+ end
1769
+ alias map collect
1770
+
1771
+ #
1772
+ # Returns the modulus (Pythagorean distance) of the vector.
1773
+ # Vector[5,8,2].r => 9.643650761
1774
+ #
1775
+ def magnitude
1776
+ Math.sqrt(@elements.inject(0) {|v, e| v + e*e})
1777
+ end
1778
+ alias r magnitude
1779
+ alias norm magnitude
1780
+
1781
+ #
1782
+ # Like Vector#collect2, but returns a Vector instead of an Array.
1783
+ #
1784
+ def map2(v, &block) # :yield: e1, e2
1785
+ return to_enum(:map2, v) unless block_given?
1786
+ els = collect2(v, &block)
1787
+ self.class.elements(els, false)
1788
+ end
1789
+
1790
+ class ZeroVectorError < StandardError
1791
+ end
1792
+ #
1793
+ # Returns a new vector with the same direction but with norm 1.
1794
+ # v = Vector[5,8,2].normalize
1795
+ # # => Vector[0.5184758473652127, 0.8295613557843402, 0.20739033894608505]
1796
+ # v.norm => 1.0
1797
+ #
1798
+ def normalize
1799
+ n = magnitude
1800
+ raise ZeroVectorError, "Zero vectors can not be normalized" if n == 0
1801
+ self / n
1802
+ end
1803
+
1804
+ #--
1805
+ # CONVERTING
1806
+ #++
1807
+
1808
+ #
1809
+ # Creates a single-row matrix from this vector.
1810
+ #
1811
+ def covector
1812
+ Matrix.row_vector(self)
1813
+ end
1814
+
1815
+ #
1816
+ # Returns the elements of the vector in an array.
1817
+ #
1818
+ def to_a
1819
+ @elements.dup
1820
+ end
1821
+
1822
+ def elements_to_f
1823
+ warn "#{caller(1)[0]}: warning: Vector#elements_to_f is deprecated"
1824
+ map(&:to_f)
1825
+ end
1826
+
1827
+ def elements_to_i
1828
+ warn "#{caller(1)[0]}: warning: Vector#elements_to_i is deprecated"
1829
+ map(&:to_i)
1830
+ end
1831
+
1832
+ def elements_to_r
1833
+ warn "#{caller(1)[0]}: warning: Vector#elements_to_r is deprecated"
1834
+ map(&:to_r)
1835
+ end
1836
+
1837
+ #
1838
+ # The coerce method provides support for Ruby type coercion.
1839
+ # This coercion mechanism is used by Ruby to handle mixed-type
1840
+ # numeric operations: it is intended to find a compatible common
1841
+ # type between the two operands of the operator.
1842
+ # See also Numeric#coerce.
1843
+ #
1844
+ def coerce(other)
1845
+ case other
1846
+ when Numeric
1847
+ return Matrix::Scalar.new(other), self
1848
+ else
1849
+ raise TypeError, "#{self.class} can't be coerced into #{other.class}"
1850
+ end
1851
+ end
1852
+
1853
+ #--
1854
+ # PRINTING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
1855
+ #++
1856
+
1857
+ #
1858
+ # Overrides Object#to_s
1859
+ #
1860
+ def to_s
1861
+ "Vector[" + @elements.join(", ") + "]"
1862
+ end
1863
+
1864
+ #
1865
+ # Overrides Object#inspect
1866
+ #
1867
+ def inspect
1868
+ "Vector" + @elements.inspect
1869
+ end
1870
+ end
1871
+ end