pcbr 0.0.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.
- checksums.yaml +7 -0
 - data/.rspec +1 -0
 - data/Gemfile +3 -0
 - data/README.md +27 -0
 - data/Rakefile +8 -0
 - data/lib/pcbr.rb +41 -0
 - data/pcbr.gemspec +18 -0
 - data/spec/_spec.rb +55 -0
 - metadata +78 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b49a66a529119ba0d10c495455cd2b8d0791b49c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: eaba59b3069d04b8a0dc6e594b13ea58e2ec923f
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 93360c02ed2e69dcd9346f1c63c0cc81ae9ab646a642a083b52ce02b3ac06a6474b96f4ff0df03521d8774940cdee949fb5c4f2fe5ffa33263d4f78203d8eebf
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 7bfd228ef04e97a3d94f9754b2957c91ea6498eb9b46559335d75c43529e24a5f8d8f275c09e6476491eb0132cca21f374955cc98f6876d18dbb4528e7c81ece
         
     | 
    
        data/.rspec
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --color
         
     | 
    
        data/Gemfile
    ADDED
    
    
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # PCBR (Pairs Comparision Based Rating)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Making ratings is fun. After applying my method several times I've decided to gemify it.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            ### Examples
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            TODO
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ### How it works
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            The first idea of rating items by one-to-one comparision was about QuakeLive players in 2013 or so and it didn't work well. At that time I was thinking about tree data structure. Later in May 2015 I've realised that it's simply about dots in n-dimensional space and sectors.
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            TODO: better desription
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            At the moment it's a "proof of concept". It needs huge optimisations for lookups, maybe using trees.
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            ### Installation
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                $ gem install pcbr
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            ### Testing with RSpec before contributing
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                rspec
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            or
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                rake spec
         
     | 
    
        data/Rakefile
    ADDED
    
    
    
        data/lib/pcbr.rb
    ADDED
    
    | 
         @@ -0,0 +1,41 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class PCBR
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              VERSION = "0.0.1"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              def initialize &block
         
     | 
| 
      
 6 
     | 
    
         
            +
                @table = []
         
     | 
| 
      
 7 
     | 
    
         
            +
                @callback = block || ->_{[*_]}
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              def size
         
     | 
| 
      
 11 
     | 
    
         
            +
                @table.size
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def store key, *vector
         
     | 
| 
      
 15 
     | 
    
         
            +
                vector = vector.empty? ? [key] : vector.first
         
     | 
| 
      
 16 
     | 
    
         
            +
                score = @table.map do |item|
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @callback[vector].zip(@callback[item[1]]).map do |a, b|
         
     | 
| 
      
 18 
     | 
    
         
            +
                    a <=> b
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end.uniq.inject(0, :+).tap do |point|
         
     | 
| 
      
 20 
     | 
    
         
            +
                    item[2] -= point
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end.inject 0, :+
         
     | 
| 
      
 23 
     | 
    
         
            +
                @table.push [key, vector, score]
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              def score key
         
     | 
| 
      
 27 
     | 
    
         
            +
                @table.assoc(key).last
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def sorted
         
     | 
| 
      
 31 
     | 
    
         
            +
                @table.sort_by.with_index{ |item, i| [item.last, i] }.map(&:first)
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              def data
         
     | 
| 
      
 35 
     | 
    
         
            +
                Hash[ @table.map{ |key, vector, score| [key, vector] } ]
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
              def scores
         
     | 
| 
      
 38 
     | 
    
         
            +
                Hash[ @table.map{ |key, vector, score| [key, score] } ]
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
    
        data/pcbr.gemspec
    ADDED
    
    | 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Gem::Specification.new do |spec|
         
     | 
| 
      
 2 
     | 
    
         
            +
              spec.name          = "pcbr"
         
     | 
| 
      
 3 
     | 
    
         
            +
              spec.version       = (require_relative "lib/pcbr"; PCBR::VERSION)
         
     | 
| 
      
 4 
     | 
    
         
            +
              spec.author        = "Victor Maslov"
         
     | 
| 
      
 5 
     | 
    
         
            +
              spec.email         = "nakilon@gmail.com"
         
     | 
| 
      
 6 
     | 
    
         
            +
              spec.summary       = "Pair Comparision Based Rating"
         
     | 
| 
      
 7 
     | 
    
         
            +
              spec.description   = "not public yet"
         
     | 
| 
      
 8 
     | 
    
         
            +
              spec.homepage      = "https://github.com/Nakilon/pcbr"
         
     | 
| 
      
 9 
     | 
    
         
            +
              spec.license       = "MIT"
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              spec.files         = `git ls-files -z`.split("\x0")
         
     | 
| 
      
 12 
     | 
    
         
            +
              spec.test_files    = ["spec/"]
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              spec.add_development_dependency "bundler", "~> 1.12.0"
         
     | 
| 
      
 15 
     | 
    
         
            +
              spec.add_development_dependency "rspec", "~> 3.3.0"
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              spec.required_ruby_version = ">= 2.0.0"
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/_spec.rb
    ADDED
    
    | 
         @@ -0,0 +1,55 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative "../lib/pcbr"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe PCBR do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              example "#size" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                rating = PCBR.new
         
     | 
| 
      
 7 
     | 
    
         
            +
                rating.store 1
         
     | 
| 
      
 8 
     | 
    
         
            +
                rating.store 2
         
     | 
| 
      
 9 
     | 
    
         
            +
                expect(rating.size).to eq(2)
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              example "order, #score[key] and main methods" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                rating = PCBR.new
         
     | 
| 
      
 14 
     | 
    
         
            +
                data = {
         
     | 
| 
      
 15 
     | 
    
         
            +
                  1 => [1, 1],
         
     | 
| 
      
 16 
     | 
    
         
            +
                  2 => [2, 2],
         
     | 
| 
      
 17 
     | 
    
         
            +
                  3 => [0, 0],
         
     | 
| 
      
 18 
     | 
    
         
            +
                  4 => [1, 2],
         
     | 
| 
      
 19 
     | 
    
         
            +
                  6 => [1, 1],
         
     | 
| 
      
 20 
     | 
    
         
            +
                  5 => [0, 2],
         
     | 
| 
      
 21 
     | 
    
         
            +
                }.each do |key, vector|
         
     | 
| 
      
 22 
     | 
    
         
            +
                  rating.store key, vector
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                expectation = {
         
     | 
| 
      
 25 
     | 
    
         
            +
                  3 => -5,
         
     | 
| 
      
 26 
     | 
    
         
            +
                  1 => -1,
         
     | 
| 
      
 27 
     | 
    
         
            +
                  6 => -1,
         
     | 
| 
      
 28 
     | 
    
         
            +
                  5 => -1,
         
     | 
| 
      
 29 
     | 
    
         
            +
                  4 =>  3,
         
     | 
| 
      
 30 
     | 
    
         
            +
                  2 =>  5,
         
     | 
| 
      
 31 
     | 
    
         
            +
                }.each do |item, score|
         
     | 
| 
      
 32 
     | 
    
         
            +
                  expect(rating.score(item)).to eq(score)
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
                expect(rating.sorted).to eq(expectation.keys)
         
     | 
| 
      
 35 
     | 
    
         
            +
                expect(rating.scores).to eq(expectation     )
         
     | 
| 
      
 36 
     | 
    
         
            +
                expect(rating.data  ).to eq(data            )
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              example "&block" do
         
     | 
| 
      
 40 
     | 
    
         
            +
                rating = PCBR.new do |item|
         
     | 
| 
      
 41 
     | 
    
         
            +
                  [item[:goodness], -item[:badness]]
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
                rating.store 1, {goodness: 1, badness: 1}
         
     | 
| 
      
 44 
     | 
    
         
            +
                rating.store 2, {goodness: 1, badness: 2}
         
     | 
| 
      
 45 
     | 
    
         
            +
                expect(rating.sorted).to eq([2, 1])
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              example "scalar key without vector and without &block" do
         
     | 
| 
      
 49 
     | 
    
         
            +
                rating = PCBR.new
         
     | 
| 
      
 50 
     | 
    
         
            +
                rating.store 2
         
     | 
| 
      
 51 
     | 
    
         
            +
                rating.store 1
         
     | 
| 
      
 52 
     | 
    
         
            +
                expect(rating.sorted).to eq([1, 2])
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,78 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: pcbr
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.1
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Victor Maslov
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-06-21 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 13 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 14 
     | 
    
         
            +
              name: bundler
         
     | 
| 
      
 15 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 16 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 17 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 18 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 19 
     | 
    
         
            +
                    version: 1.12.0
         
     | 
| 
      
 20 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 21 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 22 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 23 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 24 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 25 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 26 
     | 
    
         
            +
                    version: 1.12.0
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: rspec
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: 3.3.0
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: 3.3.0
         
     | 
| 
      
 41 
     | 
    
         
            +
            description: not public yet
         
     | 
| 
      
 42 
     | 
    
         
            +
            email: nakilon@gmail.com
         
     | 
| 
      
 43 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 44 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 45 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 46 
     | 
    
         
            +
            files:
         
     | 
| 
      
 47 
     | 
    
         
            +
            - .rspec
         
     | 
| 
      
 48 
     | 
    
         
            +
            - Gemfile
         
     | 
| 
      
 49 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 50 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 51 
     | 
    
         
            +
            - lib/pcbr.rb
         
     | 
| 
      
 52 
     | 
    
         
            +
            - pcbr.gemspec
         
     | 
| 
      
 53 
     | 
    
         
            +
            - spec/_spec.rb
         
     | 
| 
      
 54 
     | 
    
         
            +
            homepage: https://github.com/Nakilon/pcbr
         
     | 
| 
      
 55 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 56 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 57 
     | 
    
         
            +
            metadata: {}
         
     | 
| 
      
 58 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 59 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 60 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 61 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 62 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 63 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 64 
     | 
    
         
            +
              - - '>='
         
     | 
| 
      
 65 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 66 
     | 
    
         
            +
                  version: 2.0.0
         
     | 
| 
      
 67 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 68 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 69 
     | 
    
         
            +
              - - '>='
         
     | 
| 
      
 70 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 71 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 72 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 73 
     | 
    
         
            +
            rubyforge_project: 
         
     | 
| 
      
 74 
     | 
    
         
            +
            rubygems_version: 2.0.14
         
     | 
| 
      
 75 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 76 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 77 
     | 
    
         
            +
            summary: Pair Comparision Based Rating
         
     | 
| 
      
 78 
     | 
    
         
            +
            test_files: []
         
     |