lgrgic_palindrome_detector 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +7 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +31 -0
- data/README.md +39 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lgrgic_palindrome_detector.gemspec +37 -0
- data/lib/lgrgic_palindrome_detector.rb +16 -0
- data/lib/lgrgic_palindrome_detector/version.rb +3 -0
- data/vendor/cache/ansi-1.5.0.gem +0 -0
- data/vendor/cache/bin/rake +27 -0
- data/vendor/cache/builder-3.2.3.gem +0 -0
- data/vendor/cache/cache/ansi-1.5.0.gem +0 -0
- data/vendor/cache/cache/builder-3.2.3.gem +0 -0
- data/vendor/cache/cache/minitest-5.11.3.gem +0 -0
- data/vendor/cache/cache/minitest-reporters-1.2.0.gem +0 -0
- data/vendor/cache/cache/rake-10.5.0.gem +0 -0
- data/vendor/cache/cache/ruby-progressbar-1.10.0.gem +0 -0
- data/vendor/cache/gems/ansi-1.5.0/.index +77 -0
- data/vendor/cache/gems/ansi-1.5.0/.yardopts +8 -0
- data/vendor/cache/gems/ansi-1.5.0/DEMO.md +451 -0
- data/vendor/cache/gems/ansi-1.5.0/HISTORY.md +217 -0
- data/vendor/cache/gems/ansi-1.5.0/LICENSE.txt +23 -0
- data/vendor/cache/gems/ansi-1.5.0/NOTICE.md +170 -0
- data/vendor/cache/gems/ansi-1.5.0/README.md +91 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/01_ansicode.md +65 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/02_core.md +11 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/03_logger.md +30 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/04_progressbar.md +62 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/05_mixin.md +37 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/06_string.md +56 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/07_columns.md +89 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/08_table.md +28 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/09_diff.md +47 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/10_bbcode.md +24 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/11_terminal.md +8 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/applique/ae.rb +1 -0
- data/vendor/cache/gems/ansi-1.5.0/demo/applique/output.rb +5 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi.rb +22 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi.yml +77 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/bbcode.rb +334 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/chain.rb +50 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/chart.rb +100 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/code.rb +349 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/columns.rb +197 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/constants.rb +25 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/core.rb +30 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/diff.rb +215 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/hexdump.rb +122 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/logger.rb +211 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/mixin.rb +121 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/progressbar.rb +292 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/string.rb +254 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/table.rb +179 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/terminal.rb +44 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/terminal/curses.rb +26 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/terminal/stty.rb +62 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/terminal/termios.rb +68 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/terminal/win32.rb +107 -0
- data/vendor/cache/gems/ansi-1.5.0/lib/ansi/version.rb +15 -0
- data/vendor/cache/gems/ansi-1.5.0/test/case_ansicode.rb +43 -0
- data/vendor/cache/gems/ansi-1.5.0/test/case_bbcode.rb +35 -0
- data/vendor/cache/gems/ansi-1.5.0/test/case_mixin.rb +35 -0
- data/vendor/cache/gems/ansi-1.5.0/test/case_progressbar.rb +21 -0
- data/vendor/cache/gems/ansi-1.5.0/test/test_helper.rb +3 -0
- data/vendor/cache/gems/builder-3.2.3/CHANGES +107 -0
- data/vendor/cache/gems/builder-3.2.3/MIT-LICENSE +20 -0
- data/vendor/cache/gems/builder-3.2.3/README.md +258 -0
- data/vendor/cache/gems/builder-3.2.3/Rakefile +195 -0
- data/vendor/cache/gems/builder-3.2.3/doc/jamis.rb +591 -0
- data/vendor/cache/gems/builder-3.2.3/doc/releases/builder-1.2.4.rdoc +31 -0
- data/vendor/cache/gems/builder-3.2.3/doc/releases/builder-2.0.0.rdoc +46 -0
- data/vendor/cache/gems/builder-3.2.3/doc/releases/builder-2.1.1.rdoc +58 -0
- data/vendor/cache/gems/builder-3.2.3/lib/blankslate.rb +137 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder.rb +13 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder/blankslate.rb +23 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder/version.rb +8 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder/xchar.rb +197 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder/xmlbase.rb +199 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder/xmlevents.rb +63 -0
- data/vendor/cache/gems/builder-3.2.3/lib/builder/xmlmarkup.rb +339 -0
- data/vendor/cache/gems/builder-3.2.3/rakelib/publish.rake +20 -0
- data/vendor/cache/gems/builder-3.2.3/rakelib/tags.rake +62 -0
- data/vendor/cache/gems/builder-3.2.3/rakelib/testing.rake +7 -0
- data/vendor/cache/gems/builder-3.2.3/test/helper.rb +12 -0
- data/vendor/cache/gems/builder-3.2.3/test/performance.rb +41 -0
- data/vendor/cache/gems/builder-3.2.3/test/preload.rb +39 -0
- data/vendor/cache/gems/builder-3.2.3/test/test_blankslate.rb +213 -0
- data/vendor/cache/gems/builder-3.2.3/test/test_eventbuilder.rb +150 -0
- data/vendor/cache/gems/builder-3.2.3/test/test_markupbuilder.rb +611 -0
- data/vendor/cache/gems/builder-3.2.3/test/test_method_caching.rb +62 -0
- data/vendor/cache/gems/builder-3.2.3/test/test_namecollision.rb +39 -0
- data/vendor/cache/gems/builder-3.2.3/test/test_xchar.rb +78 -0
- data/vendor/cache/gems/minitest-5.11.3/.autotest +34 -0
- data/vendor/cache/gems/minitest-5.11.3/History.rdoc +1310 -0
- data/vendor/cache/gems/minitest-5.11.3/Manifest.txt +26 -0
- data/vendor/cache/gems/minitest-5.11.3/README.rdoc +746 -0
- data/vendor/cache/gems/minitest-5.11.3/Rakefile +86 -0
- data/vendor/cache/gems/minitest-5.11.3/design_rationale.rb +52 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/hoe/minitest.rb +32 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest.rb +987 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/assertions.rb +693 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/autorun.rb +13 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/benchmark.rb +455 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/expectations.rb +284 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/hell.rb +11 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/mock.rb +240 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/parallel.rb +70 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/pride.rb +4 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/pride_plugin.rb +142 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/spec.rb +331 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/test.rb +220 -0
- data/vendor/cache/gems/minitest-5.11.3/lib/minitest/unit.rb +45 -0
- data/vendor/cache/gems/minitest-5.11.3/test/minitest/metametameta.rb +102 -0
- data/vendor/cache/gems/minitest-5.11.3/test/minitest/test_minitest_benchmark.rb +137 -0
- data/vendor/cache/gems/minitest-5.11.3/test/minitest/test_minitest_mock.rb +874 -0
- data/vendor/cache/gems/minitest-5.11.3/test/minitest/test_minitest_reporter.rb +299 -0
- data/vendor/cache/gems/minitest-5.11.3/test/minitest/test_minitest_spec.rb +987 -0
- data/vendor/cache/gems/minitest-5.11.3/test/minitest/test_minitest_test.rb +2142 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/.gitignore +27 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/.ruby-gemset +1 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/.travis.yml +10 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/.yardopts +6 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/CHANGELOG.md +40 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/Gemfile +2 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/LICENSE +20 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/README.md +115 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/Rakefile +60 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/assets/default-reporter.png +0 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/assets/mean_time_reporter.png +0 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/assets/progress-reporter.png +0 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/assets/spec-reporter.png +0 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/extensible_backtrace_filter.rb +67 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/minitest_reporter_plugin.rb +75 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/old_activesupport_fix.rb +24 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/relative_position.rb +26 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters.rb +89 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/ansi.rb +31 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/base_reporter.rb +117 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/default_reporter.rb +228 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/html_reporter.rb +221 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/junit_reporter.rb +157 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/mean_time_reporter.rb +392 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/progress_reporter.rb +96 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/ruby_mate_reporter.rb +54 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/rubymine_reporter.rb +117 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/spec_reporter.rb +61 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/reporters/version.rb +5 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/lib/minitest/templates/index.html.erb +83 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/minitest-reporters.gemspec +31 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/fixtures/junit_filename_bug_example_test.rb +21 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/fixtures/mean_time_test.rb +8 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/fixtures/progress_detailed_skip_test.rb +8 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/fixtures/progress_test.rb +8 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/fixtures/sample_test.rb +15 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/fixtures/spec_test.rb +13 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/gallery/bad_test.rb +25 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/gallery/good_test.rb +14 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/integration/reporters/junit_reporter_test.rb +12 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/integration/reporters/mean_time_reporter_test.rb +7 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/integration/reporters/progress_reporter_test.rb +34 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/test_helper.rb +22 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/unit/minitest/extensible_backtrace_filter_test.rb +42 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/unit/minitest/mean_time_reporter_unit_test.rb +152 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/unit/minitest/minitest_reporter_plugin_test.rb +14 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/unit/minitest/reporters_test.rb +52 -0
- data/vendor/cache/gems/minitest-reporters-1.2.0/test/unit/minitest/spec_reporter_test.rb +41 -0
- data/vendor/cache/gems/rake-10.5.0/.autotest +7 -0
- data/vendor/cache/gems/rake-10.5.0/.rubocop.yml +27 -0
- data/vendor/cache/gems/rake-10.5.0/.togglerc +7 -0
- data/vendor/cache/gems/rake-10.5.0/CONTRIBUTING.rdoc +38 -0
- data/vendor/cache/gems/rake-10.5.0/History.rdoc +659 -0
- data/vendor/cache/gems/rake-10.5.0/MIT-LICENSE +21 -0
- data/vendor/cache/gems/rake-10.5.0/Manifest.txt +166 -0
- data/vendor/cache/gems/rake-10.5.0/README.rdoc +139 -0
- data/vendor/cache/gems/rake-10.5.0/Rakefile +81 -0
- data/vendor/cache/gems/rake-10.5.0/bin/rake +33 -0
- data/vendor/cache/gems/rake-10.5.0/doc/command_line_usage.rdoc +158 -0
- data/vendor/cache/gems/rake-10.5.0/doc/example/Rakefile1 +38 -0
- data/vendor/cache/gems/rake-10.5.0/doc/example/Rakefile2 +35 -0
- data/vendor/cache/gems/rake-10.5.0/doc/example/a.c +6 -0
- data/vendor/cache/gems/rake-10.5.0/doc/example/b.c +6 -0
- data/vendor/cache/gems/rake-10.5.0/doc/example/main.c +11 -0
- data/vendor/cache/gems/rake-10.5.0/doc/glossary.rdoc +42 -0
- data/vendor/cache/gems/rake-10.5.0/doc/jamis.rb +591 -0
- data/vendor/cache/gems/rake-10.5.0/doc/proto_rake.rdoc +127 -0
- data/vendor/cache/gems/rake-10.5.0/doc/rake.1 +141 -0
- data/vendor/cache/gems/rake-10.5.0/doc/rakefile.rdoc +624 -0
- data/vendor/cache/gems/rake-10.5.0/doc/rational.rdoc +151 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.4.14.rdoc +23 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.4.15.rdoc +35 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.5.0.rdoc +53 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.5.3.rdoc +78 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.5.4.rdoc +46 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.6.0.rdoc +141 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.7.0.rdoc +119 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.7.1.rdoc +59 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.7.2.rdoc +121 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.7.3.rdoc +47 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.0.rdoc +114 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.2.rdoc +165 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.3.rdoc +112 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.4.rdoc +147 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.5.rdoc +53 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.6.rdoc +37 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.8.7.rdoc +55 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.0.rdoc +112 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.1.rdoc +52 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.2.2.rdoc +55 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.2.rdoc +49 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.3.rdoc +102 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.4.rdoc +60 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.5.rdoc +55 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-0.9.6.rdoc +64 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-10.0.0.rdoc +178 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-10.0.1.rdoc +58 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-10.0.2.rdoc +53 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-10.0.3.rdoc +191 -0
- data/vendor/cache/gems/rake-10.5.0/doc/release_notes/rake-10.1.0.rdoc +61 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake.rb +79 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/alt_system.rb +110 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/application.rb +790 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/backtrace.rb +23 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/clean.rb +76 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/cloneable.rb +16 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/.document +1 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/compositepublisher.rb +21 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/ftptools.rb +137 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/publisher.rb +81 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/rubyforgepublisher.rb +18 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/sshpublisher.rb +61 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/contrib/sys.rb +4 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/cpu_counter.rb +125 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/default_loader.rb +14 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/dsl_definition.rb +201 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/early_time.rb +21 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/ext/core.rb +25 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/ext/module.rb +2 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/ext/pathname.rb +25 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/ext/string.rb +175 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/ext/time.rb +18 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/file_creation_task.rb +24 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/file_list.rb +428 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/file_task.rb +46 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/file_utils.rb +128 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/file_utils_ext.rb +144 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/gempackagetask.rb +4 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/invocation_chain.rb +56 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/invocation_exception_mixin.rb +16 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/late_time.rb +17 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/linked_list.rb +103 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/loaders/makefile.rb +53 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/multi_task.rb +13 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/name_space.rb +38 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/packagetask.rb +199 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/pathmap.rb +3 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/phony.rb +15 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/private_reader.rb +20 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/promise.rb +99 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/pseudo_status.rb +29 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/rake_module.rb +38 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/rake_test_loader.rb +22 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/rdoctask.rb +4 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/ruby182_test_unit_fix.rb +29 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/runtest.rb +27 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/scope.rb +42 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/task.rb +383 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/task_argument_error.rb +7 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/task_arguments.rb +98 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/task_manager.rb +307 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/tasklib.rb +24 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/testtask.rb +213 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/thread_history_display.rb +48 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/thread_pool.rb +164 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/trace_output.rb +22 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/version.rb +7 -0
- data/vendor/cache/gems/rake-10.5.0/lib/rake/win32.rb +56 -0
- data/vendor/cache/gems/rake-10.5.0/rakelib/publish.rake +20 -0
- data/vendor/cache/gems/rake-10.5.0/rakelib/test_times.rake +25 -0
- data/vendor/cache/gems/rake-10.5.0/test/file_creation.rb +34 -0
- data/vendor/cache/gems/rake-10.5.0/test/helper.rb +129 -0
- data/vendor/cache/gems/rake-10.5.0/test/support/rakefile_definitions.rb +478 -0
- data/vendor/cache/gems/rake-10.5.0/test/support/ruby_runner.rb +34 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_private_reader.rb +42 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake.rb +40 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_application.rb +643 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_application_options.rb +468 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_backtrace.rb +119 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_clean.rb +61 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_cpu_counter.rb +68 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_definitions.rb +84 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_directory_task.rb +76 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_dsl.rb +40 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_early_time.rb +31 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_extension.rb +59 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_file_creation_task.rb +56 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_file_list.rb +670 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_file_list_path_map.rb +8 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_file_task.rb +197 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_file_utils.rb +314 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_ftp_file.rb +74 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_functional.rb +482 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_invocation_chain.rb +64 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_late_time.rb +18 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_linked_list.rb +84 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_makefile_loader.rb +46 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_multi_task.rb +64 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_name_space.rb +57 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_package_task.rb +79 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_path_map.rb +168 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_path_map_explode.rb +34 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_path_map_partial.rb +18 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_pathname_extensions.rb +15 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_pseudo_status.rb +21 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_rake_test_loader.rb +20 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_reduce_compat.rb +26 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_require.rb +40 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_rules.rb +388 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_scope.rb +44 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task.rb +393 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task_argument_parsing.rb +119 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task_arguments.rb +127 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task_lib.rb +9 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task_manager.rb +178 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task_manager_argument_resolution.rb +19 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_task_with_arguments.rb +172 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_test_task.rb +146 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_thread_pool.rb +145 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_top_level_functions.rb +71 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_rake_win32.rb +72 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_thread_history_display.rb +101 -0
- data/vendor/cache/gems/rake-10.5.0/test/test_trace_output.rb +52 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/LICENSE.txt +19 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/README.md +38 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/Rakefile +2 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar.rb +18 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/base.rb +183 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/calculators/length.rb +100 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/calculators/running_average.rb +9 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/components.rb +5 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/components/bar.rb +102 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/components/percentage.rb +29 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/components/rate.rb +43 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/components/time.rb +107 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/components/title.rb +13 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/errors/invalid_progress_error.rb +4 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/format.rb +3 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/format/formatter.rb +27 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/format/molecule.rb +60 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/format/string.rb +36 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/output.rb +68 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/outputs/null.rb +33 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/outputs/tty.rb +32 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/progress.rb +118 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/refinements.rb +1 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/refinements/enumerator.rb +23 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/throttle.rb +25 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/time.rb +32 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/timer.rb +72 -0
- data/vendor/cache/gems/ruby-progressbar-1.10.0/lib/ruby-progressbar/version.rb +3 -0
- data/vendor/cache/minitest-5.11.3.gem +0 -0
- data/vendor/cache/minitest-reporters-1.2.0.gem +0 -0
- data/vendor/cache/rake-10.5.0.gem +0 -0
- data/vendor/cache/ruby-progressbar-1.10.0.gem +0 -0
- data/vendor/cache/specifications/ansi-1.5.0.gemspec +49 -0
- data/vendor/cache/specifications/builder-3.2.3.gemspec +21 -0
- data/vendor/cache/specifications/minitest-5.11.3.gemspec +39 -0
- data/vendor/cache/specifications/minitest-reporters-1.2.0.gemspec +49 -0
- data/vendor/cache/specifications/rake-10.5.0.gemspec +43 -0
- data/vendor/cache/specifications/ruby-progressbar-1.10.0.gemspec +46 -0
- metadata +460 -0
@@ -0,0 +1,455 @@
|
|
1
|
+
require "minitest/test"
|
2
|
+
require "minitest/spec"
|
3
|
+
|
4
|
+
module Minitest
|
5
|
+
##
|
6
|
+
# Subclass Benchmark to create your own benchmark runs. Methods
|
7
|
+
# starting with "bench_" get executed on a per-class.
|
8
|
+
#
|
9
|
+
# See Minitest::Assertions
|
10
|
+
|
11
|
+
class Benchmark < Test
|
12
|
+
def self.io # :nodoc:
|
13
|
+
@io
|
14
|
+
end
|
15
|
+
|
16
|
+
def io # :nodoc:
|
17
|
+
self.class.io
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.run reporter, options = {} # :nodoc:
|
21
|
+
@io = reporter.io
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.runnable_methods # :nodoc:
|
26
|
+
methods_matching(/^bench_/)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Returns a set of ranges stepped exponentially from +min+ to
|
31
|
+
# +max+ by powers of +base+. Eg:
|
32
|
+
#
|
33
|
+
# bench_exp(2, 16, 2) # => [2, 4, 8, 16]
|
34
|
+
|
35
|
+
def self.bench_exp min, max, base = 10
|
36
|
+
min = (Math.log10(min) / Math.log10(base)).to_i
|
37
|
+
max = (Math.log10(max) / Math.log10(base)).to_i
|
38
|
+
|
39
|
+
(min..max).map { |m| base ** m }.to_a
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Returns a set of ranges stepped linearly from +min+ to +max+ by
|
44
|
+
# +step+. Eg:
|
45
|
+
#
|
46
|
+
# bench_linear(20, 40, 10) # => [20, 30, 40]
|
47
|
+
|
48
|
+
def self.bench_linear min, max, step = 10
|
49
|
+
(min..max).step(step).to_a
|
50
|
+
rescue LocalJumpError # 1.8.6
|
51
|
+
r = []; (min..max).step(step) { |n| r << n }; r
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Specifies the ranges used for benchmarking for that class.
|
56
|
+
# Defaults to exponential growth from 1 to 10k by powers of 10.
|
57
|
+
# Override if you need different ranges for your benchmarks.
|
58
|
+
#
|
59
|
+
# See also: ::bench_exp and ::bench_linear.
|
60
|
+
|
61
|
+
def self.bench_range
|
62
|
+
bench_exp 1, 10_000
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Runs the given +work+, gathering the times of each run. Range
|
67
|
+
# and times are then passed to a given +validation+ proc. Outputs
|
68
|
+
# the benchmark name and times in tab-separated format, making it
|
69
|
+
# easy to paste into a spreadsheet for graphing or further
|
70
|
+
# analysis.
|
71
|
+
#
|
72
|
+
# Ranges are specified by ::bench_range.
|
73
|
+
#
|
74
|
+
# Eg:
|
75
|
+
#
|
76
|
+
# def bench_algorithm
|
77
|
+
# validation = proc { |x, y| ... }
|
78
|
+
# assert_performance validation do |n|
|
79
|
+
# @obj.algorithm(n)
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
|
83
|
+
def assert_performance validation, &work
|
84
|
+
range = self.class.bench_range
|
85
|
+
|
86
|
+
io.print "#{self.name}"
|
87
|
+
|
88
|
+
times = []
|
89
|
+
|
90
|
+
range.each do |x|
|
91
|
+
GC.start
|
92
|
+
t0 = Minitest.clock_time
|
93
|
+
instance_exec(x, &work)
|
94
|
+
t = Minitest.clock_time - t0
|
95
|
+
|
96
|
+
io.print "\t%9.6f" % t
|
97
|
+
times << t
|
98
|
+
end
|
99
|
+
io.puts
|
100
|
+
|
101
|
+
validation[range, times]
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Runs the given +work+ and asserts that the times gathered fit to
|
106
|
+
# match a constant rate (eg, linear slope == 0) within a given
|
107
|
+
# +threshold+. Note: because we're testing for a slope of 0, R^2
|
108
|
+
# is not a good determining factor for the fit, so the threshold
|
109
|
+
# is applied against the slope itself. As such, you probably want
|
110
|
+
# to tighten it from the default.
|
111
|
+
#
|
112
|
+
# See http://www.graphpad.com/curvefit/goodness_of_fit.htm for
|
113
|
+
# more details.
|
114
|
+
#
|
115
|
+
# Fit is calculated by #fit_linear.
|
116
|
+
#
|
117
|
+
# Ranges are specified by ::bench_range.
|
118
|
+
#
|
119
|
+
# Eg:
|
120
|
+
#
|
121
|
+
# def bench_algorithm
|
122
|
+
# assert_performance_constant 0.9999 do |n|
|
123
|
+
# @obj.algorithm(n)
|
124
|
+
# end
|
125
|
+
# end
|
126
|
+
|
127
|
+
def assert_performance_constant threshold = 0.99, &work
|
128
|
+
validation = proc do |range, times|
|
129
|
+
a, b, rr = fit_linear range, times
|
130
|
+
assert_in_delta 0, b, 1 - threshold
|
131
|
+
[a, b, rr]
|
132
|
+
end
|
133
|
+
|
134
|
+
assert_performance validation, &work
|
135
|
+
end
|
136
|
+
|
137
|
+
##
|
138
|
+
# Runs the given +work+ and asserts that the times gathered fit to
|
139
|
+
# match a exponential curve within a given error +threshold+.
|
140
|
+
#
|
141
|
+
# Fit is calculated by #fit_exponential.
|
142
|
+
#
|
143
|
+
# Ranges are specified by ::bench_range.
|
144
|
+
#
|
145
|
+
# Eg:
|
146
|
+
#
|
147
|
+
# def bench_algorithm
|
148
|
+
# assert_performance_exponential 0.9999 do |n|
|
149
|
+
# @obj.algorithm(n)
|
150
|
+
# end
|
151
|
+
# end
|
152
|
+
|
153
|
+
def assert_performance_exponential threshold = 0.99, &work
|
154
|
+
assert_performance validation_for_fit(:exponential, threshold), &work
|
155
|
+
end
|
156
|
+
|
157
|
+
##
|
158
|
+
# Runs the given +work+ and asserts that the times gathered fit to
|
159
|
+
# match a logarithmic curve within a given error +threshold+.
|
160
|
+
#
|
161
|
+
# Fit is calculated by #fit_logarithmic.
|
162
|
+
#
|
163
|
+
# Ranges are specified by ::bench_range.
|
164
|
+
#
|
165
|
+
# Eg:
|
166
|
+
#
|
167
|
+
# def bench_algorithm
|
168
|
+
# assert_performance_logarithmic 0.9999 do |n|
|
169
|
+
# @obj.algorithm(n)
|
170
|
+
# end
|
171
|
+
# end
|
172
|
+
|
173
|
+
def assert_performance_logarithmic threshold = 0.99, &work
|
174
|
+
assert_performance validation_for_fit(:logarithmic, threshold), &work
|
175
|
+
end
|
176
|
+
|
177
|
+
##
|
178
|
+
# Runs the given +work+ and asserts that the times gathered fit to
|
179
|
+
# match a straight line within a given error +threshold+.
|
180
|
+
#
|
181
|
+
# Fit is calculated by #fit_linear.
|
182
|
+
#
|
183
|
+
# Ranges are specified by ::bench_range.
|
184
|
+
#
|
185
|
+
# Eg:
|
186
|
+
#
|
187
|
+
# def bench_algorithm
|
188
|
+
# assert_performance_linear 0.9999 do |n|
|
189
|
+
# @obj.algorithm(n)
|
190
|
+
# end
|
191
|
+
# end
|
192
|
+
|
193
|
+
def assert_performance_linear threshold = 0.99, &work
|
194
|
+
assert_performance validation_for_fit(:linear, threshold), &work
|
195
|
+
end
|
196
|
+
|
197
|
+
##
|
198
|
+
# Runs the given +work+ and asserts that the times gathered curve
|
199
|
+
# fit to match a power curve within a given error +threshold+.
|
200
|
+
#
|
201
|
+
# Fit is calculated by #fit_power.
|
202
|
+
#
|
203
|
+
# Ranges are specified by ::bench_range.
|
204
|
+
#
|
205
|
+
# Eg:
|
206
|
+
#
|
207
|
+
# def bench_algorithm
|
208
|
+
# assert_performance_power 0.9999 do |x|
|
209
|
+
# @obj.algorithm
|
210
|
+
# end
|
211
|
+
# end
|
212
|
+
|
213
|
+
def assert_performance_power threshold = 0.99, &work
|
214
|
+
assert_performance validation_for_fit(:power, threshold), &work
|
215
|
+
end
|
216
|
+
|
217
|
+
##
|
218
|
+
# Takes an array of x/y pairs and calculates the general R^2 value.
|
219
|
+
#
|
220
|
+
# See: http://en.wikipedia.org/wiki/Coefficient_of_determination
|
221
|
+
|
222
|
+
def fit_error xys
|
223
|
+
y_bar = sigma(xys) { |_, y| y } / xys.size.to_f
|
224
|
+
ss_tot = sigma(xys) { |_, y| (y - y_bar) ** 2 }
|
225
|
+
ss_err = sigma(xys) { |x, y| (yield(x) - y) ** 2 }
|
226
|
+
|
227
|
+
1 - (ss_err / ss_tot)
|
228
|
+
end
|
229
|
+
|
230
|
+
##
|
231
|
+
# To fit a functional form: y = ae^(bx).
|
232
|
+
#
|
233
|
+
# Takes x and y values and returns [a, b, r^2].
|
234
|
+
#
|
235
|
+
# See: http://mathworld.wolfram.com/LeastSquaresFittingExponential.html
|
236
|
+
|
237
|
+
def fit_exponential xs, ys
|
238
|
+
n = xs.size
|
239
|
+
xys = xs.zip(ys)
|
240
|
+
sxlny = sigma(xys) { |x, y| x * Math.log(y) }
|
241
|
+
slny = sigma(xys) { |_, y| Math.log(y) }
|
242
|
+
sx2 = sigma(xys) { |x, _| x * x }
|
243
|
+
sx = sigma xs
|
244
|
+
|
245
|
+
c = n * sx2 - sx ** 2
|
246
|
+
a = (slny * sx2 - sx * sxlny) / c
|
247
|
+
b = ( n * sxlny - sx * slny ) / c
|
248
|
+
|
249
|
+
return Math.exp(a), b, fit_error(xys) { |x| Math.exp(a + b * x) }
|
250
|
+
end
|
251
|
+
|
252
|
+
##
|
253
|
+
# To fit a functional form: y = a + b*ln(x).
|
254
|
+
#
|
255
|
+
# Takes x and y values and returns [a, b, r^2].
|
256
|
+
#
|
257
|
+
# See: http://mathworld.wolfram.com/LeastSquaresFittingLogarithmic.html
|
258
|
+
|
259
|
+
def fit_logarithmic xs, ys
|
260
|
+
n = xs.size
|
261
|
+
xys = xs.zip(ys)
|
262
|
+
slnx2 = sigma(xys) { |x, _| Math.log(x) ** 2 }
|
263
|
+
slnx = sigma(xys) { |x, _| Math.log(x) }
|
264
|
+
sylnx = sigma(xys) { |x, y| y * Math.log(x) }
|
265
|
+
sy = sigma(xys) { |_, y| y }
|
266
|
+
|
267
|
+
c = n * slnx2 - slnx ** 2
|
268
|
+
b = ( n * sylnx - sy * slnx ) / c
|
269
|
+
a = (sy - b * slnx) / n
|
270
|
+
|
271
|
+
return a, b, fit_error(xys) { |x| a + b * Math.log(x) }
|
272
|
+
end
|
273
|
+
|
274
|
+
##
|
275
|
+
# Fits the functional form: a + bx.
|
276
|
+
#
|
277
|
+
# Takes x and y values and returns [a, b, r^2].
|
278
|
+
#
|
279
|
+
# See: http://mathworld.wolfram.com/LeastSquaresFitting.html
|
280
|
+
|
281
|
+
def fit_linear xs, ys
|
282
|
+
n = xs.size
|
283
|
+
xys = xs.zip(ys)
|
284
|
+
sx = sigma xs
|
285
|
+
sy = sigma ys
|
286
|
+
sx2 = sigma(xs) { |x| x ** 2 }
|
287
|
+
sxy = sigma(xys) { |x, y| x * y }
|
288
|
+
|
289
|
+
c = n * sx2 - sx**2
|
290
|
+
a = (sy * sx2 - sx * sxy) / c
|
291
|
+
b = ( n * sxy - sx * sy ) / c
|
292
|
+
|
293
|
+
return a, b, fit_error(xys) { |x| a + b * x }
|
294
|
+
end
|
295
|
+
|
296
|
+
##
|
297
|
+
# To fit a functional form: y = ax^b.
|
298
|
+
#
|
299
|
+
# Takes x and y values and returns [a, b, r^2].
|
300
|
+
#
|
301
|
+
# See: http://mathworld.wolfram.com/LeastSquaresFittingPowerLaw.html
|
302
|
+
|
303
|
+
def fit_power xs, ys
|
304
|
+
n = xs.size
|
305
|
+
xys = xs.zip(ys)
|
306
|
+
slnxlny = sigma(xys) { |x, y| Math.log(x) * Math.log(y) }
|
307
|
+
slnx = sigma(xs) { |x | Math.log(x) }
|
308
|
+
slny = sigma(ys) { | y| Math.log(y) }
|
309
|
+
slnx2 = sigma(xs) { |x | Math.log(x) ** 2 }
|
310
|
+
|
311
|
+
b = (n * slnxlny - slnx * slny) / (n * slnx2 - slnx ** 2)
|
312
|
+
a = (slny - b * slnx) / n
|
313
|
+
|
314
|
+
return Math.exp(a), b, fit_error(xys) { |x| (Math.exp(a) * (x ** b)) }
|
315
|
+
end
|
316
|
+
|
317
|
+
##
|
318
|
+
# Enumerates over +enum+ mapping +block+ if given, returning the
|
319
|
+
# sum of the result. Eg:
|
320
|
+
#
|
321
|
+
# sigma([1, 2, 3]) # => 1 + 2 + 3 => 6
|
322
|
+
# sigma([1, 2, 3]) { |n| n ** 2 } # => 1 + 4 + 9 => 14
|
323
|
+
|
324
|
+
def sigma enum, &block
|
325
|
+
enum = enum.map(&block) if block
|
326
|
+
enum.inject { |sum, n| sum + n }
|
327
|
+
end
|
328
|
+
|
329
|
+
##
|
330
|
+
# Returns a proc that calls the specified fit method and asserts
|
331
|
+
# that the error is within a tolerable threshold.
|
332
|
+
|
333
|
+
def validation_for_fit msg, threshold
|
334
|
+
proc do |range, times|
|
335
|
+
a, b, rr = send "fit_#{msg}", range, times
|
336
|
+
assert_operator rr, :>=, threshold
|
337
|
+
[a, b, rr]
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
module Minitest
|
344
|
+
##
|
345
|
+
# The spec version of Minitest::Benchmark.
|
346
|
+
|
347
|
+
class BenchSpec < Benchmark
|
348
|
+
extend Minitest::Spec::DSL
|
349
|
+
|
350
|
+
##
|
351
|
+
# This is used to define a new benchmark method. You usually don't
|
352
|
+
# use this directly and is intended for those needing to write new
|
353
|
+
# performance curve fits (eg: you need a specific polynomial fit).
|
354
|
+
#
|
355
|
+
# See ::bench_performance_linear for an example of how to use this.
|
356
|
+
|
357
|
+
def self.bench name, &block
|
358
|
+
define_method "bench_#{name.gsub(/\W+/, "_")}", &block
|
359
|
+
end
|
360
|
+
|
361
|
+
##
|
362
|
+
# Specifies the ranges used for benchmarking for that class.
|
363
|
+
#
|
364
|
+
# bench_range do
|
365
|
+
# bench_exp(2, 16, 2)
|
366
|
+
# end
|
367
|
+
#
|
368
|
+
# See Minitest::Benchmark#bench_range for more details.
|
369
|
+
|
370
|
+
def self.bench_range &block
|
371
|
+
return super unless block
|
372
|
+
|
373
|
+
meta = (class << self; self; end)
|
374
|
+
meta.send :define_method, "bench_range", &block
|
375
|
+
end
|
376
|
+
|
377
|
+
##
|
378
|
+
# Create a benchmark that verifies that the performance is linear.
|
379
|
+
#
|
380
|
+
# describe "my class Bench" do
|
381
|
+
# bench_performance_linear "fast_algorithm", 0.9999 do |n|
|
382
|
+
# @obj.fast_algorithm(n)
|
383
|
+
# end
|
384
|
+
# end
|
385
|
+
|
386
|
+
def self.bench_performance_linear name, threshold = 0.99, &work
|
387
|
+
bench name do
|
388
|
+
assert_performance_linear threshold, &work
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
##
|
393
|
+
# Create a benchmark that verifies that the performance is constant.
|
394
|
+
#
|
395
|
+
# describe "my class Bench" do
|
396
|
+
# bench_performance_constant "zoom_algorithm!" do |n|
|
397
|
+
# @obj.zoom_algorithm!(n)
|
398
|
+
# end
|
399
|
+
# end
|
400
|
+
|
401
|
+
def self.bench_performance_constant name, threshold = 0.99, &work
|
402
|
+
bench name do
|
403
|
+
assert_performance_constant threshold, &work
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
##
|
408
|
+
# Create a benchmark that verifies that the performance is exponential.
|
409
|
+
#
|
410
|
+
# describe "my class Bench" do
|
411
|
+
# bench_performance_exponential "algorithm" do |n|
|
412
|
+
# @obj.algorithm(n)
|
413
|
+
# end
|
414
|
+
# end
|
415
|
+
|
416
|
+
def self.bench_performance_exponential name, threshold = 0.99, &work
|
417
|
+
bench name do
|
418
|
+
assert_performance_exponential threshold, &work
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
|
423
|
+
##
|
424
|
+
# Create a benchmark that verifies that the performance is logarithmic.
|
425
|
+
#
|
426
|
+
# describe "my class Bench" do
|
427
|
+
# bench_performance_logarithmic "algorithm" do |n|
|
428
|
+
# @obj.algorithm(n)
|
429
|
+
# end
|
430
|
+
# end
|
431
|
+
|
432
|
+
def self.bench_performance_logarithmic name, threshold = 0.99, &work
|
433
|
+
bench name do
|
434
|
+
assert_performance_logarithmic threshold, &work
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
##
|
439
|
+
# Create a benchmark that verifies that the performance is power.
|
440
|
+
#
|
441
|
+
# describe "my class Bench" do
|
442
|
+
# bench_performance_power "algorithm" do |n|
|
443
|
+
# @obj.algorithm(n)
|
444
|
+
# end
|
445
|
+
# end
|
446
|
+
|
447
|
+
def self.bench_performance_power name, threshold = 0.99, &work
|
448
|
+
bench name do
|
449
|
+
assert_performance_power threshold, &work
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
Minitest::Spec.register_spec_type(/Bench(mark)?$/, Minitest::BenchSpec)
|
455
|
+
end
|