rkneufeld-fuzzy-realty 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/VERSION.yml +1 -1
  2. data/lib/rulebase.rb +59 -55
  3. data/lib/scores_table.rb +16 -15
  4. metadata +1 -1
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 5
4
- :patch: 0
4
+ :patch: 1
data/lib/rulebase.rb CHANGED
@@ -1,62 +1,66 @@
1
1
  require 'scores_table.rb'
2
2
  module FuzzyRealty
3
- RULES = {
4
- # Not yet implemented
5
- #:bathrooms => ,
6
- #:bedrooms => ,
7
- #:garage => ,
8
- #:deck => ,
3
+ RULES = lambda do
4
+ rules = {
5
+ # Not yet implemented
6
+ #:bathrooms => ,
7
+ #:bedrooms => ,
8
+ #:garage => ,
9
+ #:deck => ,
9
10
 
10
- # Price is match when desired is 90-105% of actual. Otherwise give a
11
- # reduced factor.
12
- :price =>
13
- lambda do |listing,desired|
14
- puts "Called price" if $debug
15
- actual = listing.price.to_f
16
- result = if (desired*0.90..desired*1.05) === actual
17
- 1.0
18
- else
19
- 1 - ((desired - actual) / actual).abs
20
- end
21
- puts result if $debug
22
- result
23
- end,
11
+ # Price is match when desired is 90-105% of actual. Otherwise give a
12
+ # reduced factor.
13
+ :price =>
14
+ lambda do |listing,desired|
15
+ puts "Called price" if $debug
16
+ actual = listing.price.to_f
17
+ result = if (desired*0.90..desired*1.05) === actual
18
+ 1.0
19
+ else
20
+ 1 - ((desired - actual) / actual).abs
21
+ end
22
+ puts result if $debug
23
+ result
24
+ end,
24
25
 
25
- # Location calc. does lookup to find score for desired and actual
26
- ## Currently just return 1 if exact, 0 otherwise
27
- :location =>
28
- lambda do |listing,desired|
29
- puts "Called location" if $debug
30
- # Perform a quick lookup (i.e. FuzzyRealty::LOCN[:A][:A] => 1.0)
31
- puts FuzzyRealty::LOCN[desired.to_sym][listing.location.to_sym] if $debug
32
- FuzzyRealty::LOCN[desired.to_sym][listing.location.to_sym]
33
- end,
26
+ # Location calc. does lookup to find score for desired and actual
27
+ ## Currently just return 1 if exact, 0 otherwise
28
+ :location =>
29
+ lambda do |listing,desired|
30
+ puts "Called location" if $debug
31
+ # Perform a quick lookup (i.e. FuzzyRealty::LOCN[:A][:A] => 1.0)
32
+ puts FuzzyRealty::LOCN[desired.to_sym][listing.location.to_sym] if $debug
33
+ FuzzyRealty::LOCN[desired.to_sym][listing.location.to_sym]
34
+ end,
34
35
 
35
- :sqft =>
36
- lambda do |listing,desired|
37
- puts "Called sqft" if $debug
38
- actual = listing.sqft
39
- result = if (actual + 50) >= desired
40
- 1.0
41
- elsif (actual + 150) >= desired
42
- 0.8
43
- elsif (actual + 300) >= desired
44
- 0.5
45
- else
46
- 0.0
47
- end
48
- puts result if $debug
49
- result
50
- end,
51
- # Style's follow lookup table similar to Location
36
+ :sqft =>
37
+ lambda do |listing,desired|
38
+ puts "Called sqft" if $debug
39
+ actual = listing.sqft
40
+ result = if (actual + 50) >= desired
41
+ 1.0
42
+ elsif (actual + 150) >= desired
43
+ 0.8
44
+ elsif (actual + 300) >= desired
45
+ 0.5
46
+ else
47
+ 0.0
48
+ end
49
+ puts result if $debug
50
+ result
51
+ end,
52
+ # Style's follow lookup table similar to Location
52
53
 
53
- :style =>
54
- lambda do |listing,desired|
55
- puts "Called style" if $debug
56
- desired = FuzzyRealty::STYLE[:Symbol][desired]
57
- actual = FuzzyRealty::STYLE[:Symbol][listing.style]
58
- puts FuzzyRealty::STYLE[desired][actual] if $debug
59
- FuzzyRealty::STYLE[desired][actual]
60
- end
61
- }
54
+ :style =>
55
+ lambda do |listing,desired|
56
+ puts "Called style" if $debug
57
+ desired = FuzzyRealty::STYLE[:Symbol][desired]
58
+ actual = FuzzyRealty::STYLE[:Symbol][listing.style]
59
+ puts FuzzyRealty::STYLE[desired][actual] if $debug
60
+ FuzzyRealty::STYLE[desired][actual]
61
+ end
62
+ }
63
+ rules.default = lambda {|a,b| raise "Invalid type used in rule lookup"}
64
+ rules
65
+ end.call
62
66
  end
data/lib/scores_table.rb CHANGED
@@ -10,12 +10,12 @@ module FuzzyRealty
10
10
  # B 0.75 1.00 0.4 0.1
11
11
  # C 0.2 0.4 1.0 0.6
12
12
  # D 0.0 0.1 0.6 1.0
13
- LOCN = {
14
- :A => {:A => 1.0, :B => 0.75, :C => 0.2, :D => 0.0},
15
- :B => {:A => 0.75, :B => 1.0, :C => 0.4, :D => 0.1},
16
- :C => {:A => 0.2, :B => 0.4, :C => 1.0, :D => 0.6},
17
- :D => {:A => 0.0, :B => 0.1, :C => 0.6, :D => 1.0}
18
- }
13
+ LOCN = Hash.new(0).merge({
14
+ :A => {:A => 1.0, :B => 0.75, :C => 0.2, :D => 0.0},
15
+ :B => {:A => 0.75, :B => 1.0, :C => 0.4, :D => 0.1},
16
+ :C => {:A => 0.2, :B => 0.4, :C => 1.0, :D => 0.6},
17
+ :D => {:A => 0.0, :B => 0.1, :C => 0.6, :D => 1.0}
18
+ })
19
19
 
20
20
  # Table for lookup of score of desired and actual styles
21
21
  # - Arbitrary values provied by my wife, at present the leanings aren't quite right
@@ -27,13 +27,14 @@ module FuzzyRealty
27
27
  #| Tw | 0.0 | 0.6 | 1 | 0.5 | 0.0 |
28
28
  #| Bi | 0.75 | 0.6 | 0.8 | 1 | 0.0 |
29
29
  #| Co | 0.7 | 0.0 | 0.0 | 0.0 | 1 |
30
- STYLE = {
31
- :Symbol => {"Bungalow" => :Bu, "Bi-level" => :Bi, "Split-level" => :Sp,
32
- "Two-story" => :Tw, "Condominium" => :Co},
33
- :Bu => { :Bu => 1, :Sp => 0.4, :Tw => 0.8, :Bi => 0.65, :Co => 0.1 },
34
- :Sp => { :Bu => 0.5, :Sp => 1.0, :Tw => 0.7, :Bi => 0.95, :Co => 0.2 },
35
- :Tw => { :Bu => 0.0, :Sp => 0.6, :Tw => 1.0, :Bi => 0.5, :Co => 0.0 },
36
- :Bi => { :Bu => 0.75,:Sp => 0.6, :Tw => 0.8, :Bi => 1.0, :Co => 0.0 },
37
- :Co => { :Bu => 0.7, :Sp => 0.0, :Tw => 0.0, :Bi => 0.0, :Co => 1.0 }
38
- }
30
+ STYLE = Hash.new(0).merge({
31
+ :Symbol => {"Bungalow" => :Bu, "Bi-level" => :Bi, "Split-level" => :Sp,
32
+ "Two-story" => :Tw, "Condominium" => :Co},
33
+ :Bu => { :Bu => 1, :Sp => 0.4, :Tw => 0.8, :Bi => 0.65, :Co => 0.1 },
34
+ :Sp => { :Bu => 0.5, :Sp => 1.0, :Tw => 0.7, :Bi => 0.95, :Co => 0.2 },
35
+ :Tw => { :Bu => 0.0, :Sp => 0.6, :Tw => 1.0, :Bi => 0.5, :Co => 0.0 },
36
+ :Bi => { :Bu => 0.75,:Sp => 0.6, :Tw => 0.8, :Bi => 1.0, :Co => 0.0 },
37
+ :Co => { :Bu => 0.7, :Sp => 0.0, :Tw => 0.0, :Bi => 0.0, :Co => 1.0 }
38
+ })
39
+
39
40
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rkneufeld-fuzzy-realty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Neufeld