diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9106b2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/.bundle/ +/.yardoc +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..4e51084 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,29 @@ +AllCops: + TargetRubyVersion: 2.4 + +Style/StringLiterals: + EnforcedStyle: double_quotes + +Metrics/LineLength: + Max: 160 + +Gemspec/OrderedDependencies: + Enabled: false + +Lint/AmbiguousBlockAssociation: + Enabled: false + +Metrics/AbcSize: + Enabled: false + +Style/IfUnlessModifier: + Enabled: false + +Style/FrozenStringLiteralComment: + Enabled: false + +Style/Documentation: + Enabled: false + +Style/ClassAndModuleChildren: + Enabled: false diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3d1d206 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +--- +sudo: false +language: ruby +cache: bundler +rvm: + - 2.6.1 +before_install: gem install bundler -v 2.0.1 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..acd68bf --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "rebornix.ruby", + "misogi.ruby-rubocop", + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c543043 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug console", + "type": "Ruby", + "request": "attach", + "remoteHost": "127.0.0.1", + "remotePort": "1234", + "remoteWorkspaceRoot": "${workspaceRoot}", + "cwd": "${workspaceRoot}", + "preLaunchTask": "debug-console", + }, + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ae922ee --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "editor.formatOnSave": false, + "editor.tabSize": 2, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "ruby.lintDebounceTime": 500, + "ruby.lint": { + "rubocop": true + }, +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..424bc09 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,30 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "debug-console", + "type": "shell", + "command": "rdebug-ide --host 0.0.0.0 --port 1234 --dispatcher-port 1234 -- bin/console", + "isBackground": true, + "problemMatcher": [ + { + "pattern": [ + { + "regexp": ".", + "file": 1, + "location": 2, + "message": 3 + } + ], + "background": { + "activeOnStart": true, + "beginsPattern": ".", + "endsPattern": "^.*Fast Debugger.*$", + } + } + ] + } + ] +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..2c16b28 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at 14026234@usherbrooke.ca. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..47e1f4d --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +source "https://rubygems.org" + +# Specify your gem's dependencies in genetic-algorithm-resolver.gemspec +gemspec + diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..9203824 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,29 @@ +PATH + remote: . + specs: + genetic-algorithm-resolver (0.1.0) + +GEM + remote: https://rubygems.org/ + specs: + debase (0.2.4.1) + debase-ruby_core_source (>= 0.10.2) + debase-ruby_core_source (0.10.6) + minitest (5.11.3) + rake (12.3.3) + ruby-debug-ide (0.7.0) + rake (>= 0.8.1) + +PLATFORMS + ruby + +DEPENDENCIES + bundler (~> 2.0) + debase (~> 0.2) + genetic-algorithm-resolver! + minitest (~> 5.0) + rake (~> 12.3.2) + ruby-debug-ide (~> 0.7) + +BUNDLED WITH + 2.0.1 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..502d033 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Eric Matte + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md index 688c40c..e4008ff 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,63 @@ -# ruby-genetic-algorithm-resolver -A Ruby gem to solve optimisation problems using genetic Algorithm +# Genetic::Algorithm::Resolver + +A Ruby gem to solve optimisation problems using genetic Algorithm, inspired by the process of natural selection. + +--- + +Here is a great article on the subject: [Introduction to Genetic Algorithms](https://towardsdatascience.com/introduction-to-genetic-algorithms-including-example-code-e396e98d8bf3) + +## Installation + +Add this line to your application's Gemfile: + +```ruby +gem 'genetic-algorithm-resolver', git: "git@github.com:ericmatte/genetic-algorithm-resolver.git" +``` + +And then execute: + + $ bundle + +Or install it yourself as: + + $ gem install genetic-algorithm-resolver + +## Usage + +TODO: Write usage instructions here + +## Development + +### Setup + + $ bin/setup + +### Test + + $ rake test + +### Interactive prompt +Allow you to experiment with the code + + $ bin/console + +### Debugging using VS-Code + +Just start a debug session using the `debug-console` configuration in `launch.json`. +This will launch a ruby console on the project, and attaches VS-Code debugger to it. + +--- + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/ericmatte/genetic-algorithm-resolver. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## License + +The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). + +## Code of Conduct + +Everyone interacting in the Genetic::Algorithm::Resolver project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/ericmatte/genetic-algorithm-resolver/blob/master/CODE_OF_CONDUCT.md). diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..d433a1e --- /dev/null +++ b/Rakefile @@ -0,0 +1,10 @@ +require "bundler/gem_tasks" +require "rake/testtask" + +Rake::TestTask.new(:test) do |t| + t.libs << "test" + t.libs << "lib" + t.test_files = FileList["test/**/*_test.rb"] +end + +task :default => :test diff --git a/bin/console b/bin/console new file mode 100755 index 0000000..bc5676b --- /dev/null +++ b/bin/console @@ -0,0 +1,30 @@ +#!/usr/bin/env ruby + +require "bundler/setup" +# require "genetic" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +# (If you use this, don't forget to add pry to your Gemfile!) +# require "pry" +# Pry.start + +def reload!(print = true) + puts "Reloading ..." if print + # Main project directory. + root_dir = File.expand_path("..", __dir__) + # Directories within the project that should be reloaded. + reload_dirs = %w{lib} + # Loop through and reload every file in all relevant project directories. + reload_dirs.each do |dir| + Dir.glob("#{root_dir}/#{dir}/**/*.rb").each { |f| load(f) } + end + # Return true when complete. + true +end + +reload!(false) + +require "irb" +IRB.start(__FILE__) diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000..dce67d8 --- /dev/null +++ b/bin/setup @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install + +# Do any other automated setup that you need to do here diff --git a/genetic-algorithm-resolver.gemspec b/genetic-algorithm-resolver.gemspec new file mode 100644 index 0000000..e5b256a --- /dev/null +++ b/genetic-algorithm-resolver.gemspec @@ -0,0 +1,44 @@ + +lib = File.expand_path("../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) +require "genetic/algorithm/version" + +Gem::Specification.new do |spec| + spec.name = "genetic-algorithm-resolver" + spec.version = Genetic::Algorithm::VERSION + spec.authors = ["Eric Matte"] + spec.email = ["ericmatte.inbox@gmail.com"] + + spec.summary = "A Ruby gem to solve optimisation problems using genetic Algorithm" + spec.homepage = "https://github.com/ericmatte/genetic-algorithm-resolver" + spec.license = "MIT" + + # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' + # to allow pushing to a single host or delete this section to allow pushing to any host. + if spec.respond_to?(:metadata) + # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'" + + spec.metadata["homepage_uri"] = spec.homepage + spec.metadata["source_code_uri"] = "https://github.com/ericmatte/genetic-algorithm-resolver" + else + raise "RubyGems 2.0 or newer is required to protect against " \ + "public gem pushes." + end + + # Specify which files should be added to the gem when it is released. + # The `git ls-files -z` loads the files in the RubyGem that have been added into git. + spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do + `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + end + spec.bindir = "exe" + spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + spec.add_development_dependency "bundler", "~> 2.0" + spec.add_development_dependency "rake", "~> 12.3.2" + spec.add_development_dependency "minitest", "~> 5.0" + + # Debugging + spec.add_development_dependency "debase", "~> 0.2" + spec.add_development_dependency "ruby-debug-ide", "~> 0.7" +end diff --git a/lib/genetic.rb b/lib/genetic.rb new file mode 100644 index 0000000..5b87f9e --- /dev/null +++ b/lib/genetic.rb @@ -0,0 +1,2 @@ +module Genetic +end diff --git a/lib/genetic/algorithm.rb b/lib/genetic/algorithm.rb new file mode 100644 index 0000000..a6433f2 --- /dev/null +++ b/lib/genetic/algorithm.rb @@ -0,0 +1,4 @@ +module Genetic + module Algorithm + end +end diff --git a/lib/genetic/algorithm/resolver.rb b/lib/genetic/algorithm/resolver.rb new file mode 100644 index 0000000..55eefb5 --- /dev/null +++ b/lib/genetic/algorithm/resolver.rb @@ -0,0 +1,15 @@ +module Genetic + module Algorithm + module Resolver + class Error < StandardError; end + # Your code goes here... + + class Ai + def tester + a = 12 + 3 + a + end + end + end + end +end diff --git a/lib/genetic/algorithm/version.rb b/lib/genetic/algorithm/version.rb new file mode 100644 index 0000000..dfc2382 --- /dev/null +++ b/lib/genetic/algorithm/version.rb @@ -0,0 +1,5 @@ +module Genetic + module Algorithm + VERSION = "0.1.0".freeze + end +end diff --git a/test/genetic/algorithm/resolver_test.rb b/test/genetic/algorithm/resolver_test.rb new file mode 100644 index 0000000..b867b82 --- /dev/null +++ b/test/genetic/algorithm/resolver_test.rb @@ -0,0 +1,11 @@ +require "test_helper" + +class Genetic::Algorithm::ResolverTest < Minitest::Test + def test_that_it_has_a_version_number + refute_nil ::Genetic::Algorithm::Resolver::VERSION + end + + def test_it_does_something_useful + assert false + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..2a557ce --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,4 @@ +$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__) +require "genetic/algorithm/resolver" + +require "minitest/autorun"