dates 1.0.2 → 1.0.4
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.
- data/README.mdown +24 -0
- data/bin/dates +1 -1
- data/lib/date_ideas.rb +48 -15
- data/lib/dates.rb +2 -0
- data/lib/version.rb +1 -1
- metadata +7 -7
data/README.mdown
CHANGED
@@ -21,6 +21,30 @@ To run it, the simplest way is just to provide it with an ideas file and nothing
|
|
21
21
|
$ dates ideas.rb
|
22
22
|
watch _serenity_: (intellectual: 5, athletic: 0, adventure: 2, romantic: 4)
|
23
23
|
|
24
|
+
### Ideas
|
25
|
+
|
26
|
+
Dates need an ideas file to work. An ideas file looks like this:
|
27
|
+
|
28
|
+
DateIdeas.new do
|
29
|
+
|
30
|
+
date "watch _movie title_" do
|
31
|
+
kind :adventure => 2, :romantic => 4, :intellectual => 6, :athletic => 0
|
32
|
+
requires :weather => 0, :hours => 2
|
33
|
+
outcome 6
|
34
|
+
end
|
35
|
+
|
36
|
+
date "read a book" do
|
37
|
+
kind :romantic => 3, :adventure => 6, :athletic => 3, :intellectual => 5
|
38
|
+
requires :weather => 5, :hours => 2
|
39
|
+
end
|
40
|
+
|
41
|
+
date "go adventuring" do
|
42
|
+
kind :adventure => 5, :romantic => 7, :intellectual => 5, :athletic => 1
|
43
|
+
requires :weather => 8, :hours => 3
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
24
48
|
### Commands
|
25
49
|
|
26
50
|
The `choose` command picks a date, and it takes two options:
|
data/bin/dates
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require File.dirname(__FILE__) + '/../lib/dates'
|
4
4
|
|
5
5
|
SUB_COMMANDS = %w(list choose)
|
6
|
-
VERSION_STR = "dates
|
6
|
+
VERSION_STR = "dates #{Dates::VERSION}-beta, max & daphne."
|
7
7
|
global_opts = Trollop::options do
|
8
8
|
version VERSION_STR
|
9
9
|
banner <<-EOS
|
data/lib/date_ideas.rb
CHANGED
@@ -42,7 +42,7 @@ class DateIdeas
|
|
42
42
|
elsif f.complete? and f.score < 6.0
|
43
43
|
str << " #{f.to_s}".red
|
44
44
|
else
|
45
|
-
raise
|
45
|
+
raise "We should never reach this."
|
46
46
|
end
|
47
47
|
end
|
48
48
|
str
|
@@ -60,10 +60,12 @@ class DateIdeas
|
|
60
60
|
@date_ideas.reject { |idea| idea.stub? or idea.complete? }
|
61
61
|
end
|
62
62
|
|
63
|
-
def extract_features(idea_list)
|
64
|
-
keys
|
65
|
-
acc
|
66
|
-
|
63
|
+
def extract_features(idea_list, keys = [])
|
64
|
+
if keys.empty?
|
65
|
+
keys = idea_list.reduce([]) { |acc, idea|
|
66
|
+
acc << idea.attributes.keys
|
67
|
+
}.flatten.uniq
|
68
|
+
end
|
67
69
|
features = idea_list.map { |idea|
|
68
70
|
attributes = idea.attributes.map { |key, val|
|
69
71
|
[keys.index(key), val]
|
@@ -73,24 +75,55 @@ class DateIdeas
|
|
73
75
|
[keys, features]
|
74
76
|
end
|
75
77
|
|
76
|
-
def fitted_model
|
77
|
-
dimensions, examples = complete_features
|
78
|
-
|
79
|
-
|
78
|
+
def fitted_model(keys = [])
|
79
|
+
dimensions, examples = complete_features(keys)
|
80
|
+
# need regularization (elastic net?) before adding these terms
|
81
|
+
#terms = Matrix.rows examples.map { |example|
|
82
|
+
# example[0] + example[0].permutation(2).to_a.map { |term| term.reduce(1) {|acc,k| acc*k } }
|
83
|
+
#}
|
84
|
+
terms = Matrix.rows examples.map { |example| example[0] }
|
85
|
+
outcomes = Matrix.column_vector(examples.map { |example| example[1] })
|
86
|
+
if (terms.t * terms).det == 0
|
87
|
+
raise "The determinant is zero. There's likely no useful information here."
|
88
|
+
end
|
89
|
+
betas = ((terms.t * terms).inv * terms.t * outcomes).t.to_a.flatten.map { |e|
|
90
|
+
e.to_f.round(4)
|
91
|
+
}
|
92
|
+
[keys, betas]
|
93
|
+
end
|
94
|
+
|
95
|
+
def estimate_outcomes(model = nil)
|
96
|
+
if model.nil?
|
97
|
+
keys, betas = fitted_model
|
98
|
+
else
|
99
|
+
keys, betas = model
|
100
|
+
end
|
101
|
+
keys, features = incomplete_features(keys)
|
102
|
+
features.map { |idea|
|
103
|
+
val = 0
|
104
|
+
idea[0].each_with_index { |attribute, i|
|
105
|
+
val += betas[i] * attribute
|
106
|
+
}
|
107
|
+
val
|
80
108
|
}
|
81
109
|
end
|
82
110
|
|
83
|
-
def complete_features
|
84
|
-
extract_features(complete)
|
111
|
+
def complete_features(keys = [])
|
112
|
+
extract_features(complete, keys)
|
85
113
|
end
|
86
114
|
|
87
|
-
def incomplete_features
|
88
|
-
extract_features(incomplete)
|
115
|
+
def incomplete_features(keys = [])
|
116
|
+
extract_features(incomplete, keys)
|
89
117
|
end
|
90
118
|
|
91
119
|
def choose(weather, time)
|
92
|
-
fitted_model
|
93
|
-
|
120
|
+
keys, betas = fitted_model
|
121
|
+
jitter = betas.inject{|sum,x| sum + x }
|
122
|
+
outcomes = estimate_outcomes([keys, betas]).each_with_index.map {|k,i|
|
123
|
+
[k,i]
|
124
|
+
}.sort_by {|k| -k[0] + rand(jitter)}
|
125
|
+
best = outcomes.first[1]
|
126
|
+
incomplete[best]
|
94
127
|
end
|
95
128
|
|
96
129
|
end
|
data/lib/dates.rb
CHANGED
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-15 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: statsample
|
16
|
-
requirement: &
|
16
|
+
requirement: &70180995201540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70180995201540
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: colorize
|
27
|
-
requirement: &
|
27
|
+
requirement: &70180995201020 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70180995201020
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: trollop
|
38
|
-
requirement: &
|
38
|
+
requirement: &70180995200600 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70180995200600
|
47
47
|
description: Dates keeps track of things you two have been meaning to do, and learns
|
48
48
|
to make good suggestions as you teach it.
|
49
49
|
email: maxhodak@gmail.com
|