jpalardy-forgetful 0.0.6 → 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.
- data/bin/forgetful +1 -1
- data/forgetful.gemspec +5 -5
- data/lib/csv_ext/reminder.rb +4 -6
- data/lib/forgetful.rb +1 -3
- data/lib/reminder.rb +7 -23
- data/lib/supermemo.rb +34 -0
- data/test/test_reminder.rb +39 -68
- data/test/test_reminder_csv.rb +22 -28
- data/test/test_supermemo.rb +85 -0
- metadata +6 -2
data/bin/forgetful
CHANGED
@@ -50,7 +50,7 @@ def process_file(filename)
|
|
50
50
|
#--------------------- quiz ----------------------
|
51
51
|
reminders = Reminder.read_csv(filename)
|
52
52
|
|
53
|
-
dues, not_dues = reminders.partition {|reminder| reminder.
|
53
|
+
dues, not_dues = reminders.partition {|reminder| reminder.due_on <= Date.today}
|
54
54
|
|
55
55
|
puts "### QUIZ: #{filename}"
|
56
56
|
gradeds = quiz(dues.sort_by { rand })
|
data/forgetful.gemspec
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{forgetful}
|
3
|
-
s.version = "0.0
|
3
|
+
s.version = "0.1.0"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Jonathan Palardy"]
|
7
|
-
s.date = %q{2008-11-
|
7
|
+
s.date = %q{2008-11-21}
|
8
8
|
s.default_executable = %q{forgetful}
|
9
9
|
s.description = %q{A minimal command-line implementation of the SuperMemo 2 algorithm.}
|
10
10
|
s.email = %q{jonathan.palardy@gmail.com}
|
11
11
|
s.executables = ["forgetful"]
|
12
|
-
s.extra_rdoc_files = ["bin/forgetful", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "README.rdoc"]
|
13
|
-
s.files = ["bin/forgetful", "examples/katakana_romanji.csv", "examples/romanji_katakana.csv", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "Manifest", "MIT-LICENSE", "README.rdoc", "test/test_reminder.rb", "test/test_reminder_csv.rb", "forgetful.gemspec"]
|
12
|
+
s.extra_rdoc_files = ["bin/forgetful", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "lib/supermemo.rb", "README.rdoc"]
|
13
|
+
s.files = ["bin/forgetful", "examples/katakana_romanji.csv", "examples/romanji_katakana.csv", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "lib/supermemo.rb", "Manifest", "MIT-LICENSE", "README.rdoc", "test/test_reminder.rb", "test/test_reminder_csv.rb", "test/test_supermemo.rb", "forgetful.gemspec"]
|
14
14
|
s.homepage = %q{http://github.com/jpalardy/forgetful}
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Forgetful", "--main", "README.rdoc"]
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = %q{forgetful}
|
18
18
|
s.rubygems_version = %q{1.2.0}
|
19
19
|
s.summary = %q{A minimal command-line implementation of the SuperMemo 2 algorithm.}
|
20
|
-
s.test_files = ["test/test_reminder.rb", "test/test_reminder_csv.rb"]
|
20
|
+
s.test_files = ["test/test_reminder.rb", "test/test_reminder_csv.rb", "test/test_supermemo.rb"]
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
data/lib/csv_ext/reminder.rb
CHANGED
@@ -13,11 +13,9 @@ class Reminder
|
|
13
13
|
def self.parse_csv(io)
|
14
14
|
converters = [lambda {|question| question},
|
15
15
|
lambda {|answer| answer},
|
16
|
-
lambda {|
|
17
|
-
lambda {|
|
18
|
-
|
19
|
-
lambda {|interval| interval.to_i},
|
20
|
-
lambda {|q| q.nil? ? q : q.to_i}]
|
16
|
+
lambda {|due_on| Date.parse(due_on)},
|
17
|
+
lambda {|history| history.scan(/./).collect {|x| x.to_i}}
|
18
|
+
]
|
21
19
|
|
22
20
|
FasterCSV.parse(io, :skip_blanks => true).collect do |list|
|
23
21
|
list = list.zip(converters).collect {|col, converter| converter[col]}
|
@@ -36,7 +34,7 @@ class Reminder
|
|
36
34
|
def self.generate_csv(reminders)
|
37
35
|
FasterCSV.generate do |csv|
|
38
36
|
reminders.each do |reminder|
|
39
|
-
if reminder.
|
37
|
+
if reminder.history.empty?
|
40
38
|
csv << reminder.to_a.first(3)
|
41
39
|
else
|
42
40
|
csv << reminder.to_a
|
data/lib/forgetful.rb
CHANGED
data/lib/reminder.rb
CHANGED
@@ -1,36 +1,20 @@
|
|
1
1
|
|
2
2
|
class Reminder
|
3
|
-
attr_reader :question, :answer, :
|
3
|
+
attr_reader :question, :answer, :due_on, :history
|
4
4
|
|
5
|
-
def initialize(question, answer,
|
5
|
+
def initialize(question, answer, due_on=Date.today, history=[])
|
6
6
|
@question = question
|
7
7
|
@answer = answer
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@i = i
|
11
|
-
@interval = interval
|
12
|
-
@q = q
|
8
|
+
@due_on = due_on
|
9
|
+
@history = history.dup.freeze
|
13
10
|
end
|
14
11
|
|
15
12
|
def next(q)
|
16
|
-
|
17
|
-
i = 0
|
18
|
-
interval = 1
|
19
|
-
else
|
20
|
-
i = self.i + 1
|
21
|
-
interval = {0 => 1, 1 => 6}.fetch(self.i, self.interval * self.ef).round
|
22
|
-
end
|
23
|
-
|
24
|
-
execute_on = Date.today + interval
|
25
|
-
|
26
|
-
ef = self.ef + (0.1 - (5-q) * (0.08 + (5-q) * 0.02))
|
27
|
-
ef = [ef, 1.3].max
|
28
|
-
|
29
|
-
Reminder.new(self.question, self.answer, execute_on, ef, i, interval, q)
|
13
|
+
Reminder.new(self.question, self.answer, SuperMemo::next_date(Date.today, self.history + [q]), self.history + [q])
|
30
14
|
end
|
31
15
|
|
32
16
|
def to_a
|
33
|
-
[self.question, self.answer, self.
|
17
|
+
[self.question, self.answer, self.due_on, self.history]
|
34
18
|
end
|
35
19
|
|
36
20
|
def <=>(other)
|
@@ -38,7 +22,7 @@ class Reminder
|
|
38
22
|
end
|
39
23
|
|
40
24
|
def review?
|
41
|
-
|
25
|
+
(self.history.last || 0) < 4
|
42
26
|
end
|
43
27
|
|
44
28
|
end
|
data/lib/supermemo.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
module SuperMemo
|
3
|
+
|
4
|
+
def self.next_ef(q, ef)
|
5
|
+
return [ef + (0.1 - (5-q) * (0.08 + (5-q) * 0.02)), 1.3].max
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.next_i(q, i)
|
9
|
+
return q < 3 ? 0 : i+1
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.next_interval(q, ef, i, interval)
|
13
|
+
return q < 3 ? 1 : {0 => 1, 1 => 6}.fetch(i, interval * ef).round
|
14
|
+
end
|
15
|
+
|
16
|
+
#-------------------------------------------------
|
17
|
+
|
18
|
+
# [] -> 2.5, 0, 0
|
19
|
+
# [5,5,5] -> 2.8, 3, 16
|
20
|
+
def self.traverse(qs, ef=2.5, i=0, interval=0)
|
21
|
+
return [ef, i, interval] if qs.empty?
|
22
|
+
|
23
|
+
q = qs.first
|
24
|
+
return traverse(qs[1..-1], next_ef(q, ef), next_i(q, i), next_interval(q, ef, i, interval))
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.next_date(date, qs)
|
28
|
+
ef, i, interval = traverse(qs)
|
29
|
+
return date + interval
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
data/test/test_reminder.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
require 'test/unit'
|
3
3
|
require "#{File.dirname(__FILE__)}/../lib/forgetful"
|
4
4
|
|
5
|
-
|
6
5
|
class TestReminder < Test::Unit::TestCase
|
7
6
|
|
8
7
|
def assert_raise_message(error, re)
|
@@ -14,10 +13,6 @@ class TestReminder < Test::Unit::TestCase
|
|
14
13
|
|
15
14
|
#-------------------------------------------------
|
16
15
|
|
17
|
-
def assert_equal_inspect(expected, actual)
|
18
|
-
assert_equal expected.inspect, actual.inspect
|
19
|
-
end
|
20
|
-
|
21
16
|
def setup
|
22
17
|
@carbon_question = Reminder.new 'carbon', '6'
|
23
18
|
end
|
@@ -41,88 +36,64 @@ class TestReminder < Test::Unit::TestCase
|
|
41
36
|
def test_minimum
|
42
37
|
assert_equal 'carbon', @carbon_question.question
|
43
38
|
assert_equal '6', @carbon_question.answer
|
44
|
-
assert_equal Date.today, @carbon_question.
|
45
|
-
assert_equal
|
46
|
-
assert_equal 0, @carbon_question.i
|
47
|
-
assert_equal 0, @carbon_question.interval
|
48
|
-
assert_equal nil, @carbon_question.q
|
39
|
+
assert_equal Date.today, @carbon_question.due_on
|
40
|
+
assert_equal [], @carbon_question.history
|
49
41
|
end
|
50
42
|
|
51
43
|
def test_minium_array
|
52
|
-
assert_equal ['carbon', '6', Date.today,
|
44
|
+
assert_equal ['carbon', '6', Date.today, []], @carbon_question.to_a
|
53
45
|
end
|
54
46
|
|
55
47
|
#-------------------------------------------------
|
56
48
|
|
57
|
-
def
|
58
|
-
|
59
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 0, 1, 1], @carbon_question.next(1).to_a
|
60
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 0, 1, 2], @carbon_question.next(2).to_a
|
61
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.36, 1, 1, 3], @carbon_question.next(3).to_a
|
62
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.5, 1, 1, 4], @carbon_question.next(4).to_a
|
63
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.6, 1, 1, 5], @carbon_question.next(5).to_a
|
64
|
-
end
|
49
|
+
def test_history_cannot_be_changed
|
50
|
+
history = [5,4,2]
|
65
51
|
|
66
|
-
|
67
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 0], @carbon_question.next(0).next(0).to_a
|
68
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 1], @carbon_question.next(0).next(1).to_a
|
69
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.38, 0, 1, 2], @carbon_question.next(0).next(2).to_a
|
70
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.56, 1, 1, 3], @carbon_question.next(0).next(3).to_a
|
71
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 1, 1, 4], @carbon_question.next(0).next(4).to_a
|
72
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.8, 1, 1, 5], @carbon_question.next(0).next(5).to_a
|
73
|
-
end
|
52
|
+
reminder = Reminder.new('carbon','6',Date.today, history)
|
74
53
|
|
75
|
-
|
76
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 0], @carbon_question.next(1).next(0).to_a
|
77
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.42, 0, 1, 1], @carbon_question.next(1).next(1).to_a
|
78
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.64, 0, 1, 2], @carbon_question.next(1).next(2).to_a
|
79
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.82, 1, 1, 3], @carbon_question.next(1).next(3).to_a
|
80
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 1, 1, 4], @carbon_question.next(1).next(4).to_a
|
81
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.06, 1, 1, 5], @carbon_question.next(1).next(5).to_a
|
82
|
-
end
|
54
|
+
assert_equal [5,4,2], reminder.history
|
83
55
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 1, 1, 4], @carbon_question.next(2).next(4).to_a
|
90
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.28, 1, 1, 5], @carbon_question.next(2).next(5).to_a
|
91
|
-
end
|
56
|
+
assert_raise_message TypeError, /can't modify frozen array/ do
|
57
|
+
@carbon_question.history.push(5)
|
58
|
+
end
|
59
|
+
|
60
|
+
history.push(5)
|
92
61
|
|
93
|
-
|
94
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.56, 0, 1, 0], @carbon_question.next(3).next(0).to_a
|
95
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 1.82, 0, 1, 1], @carbon_question.next(3).next(1).to_a
|
96
|
-
assert_equal_inspect ['carbon', '6', Date.today+1, 2.04, 0, 1, 2], @carbon_question.next(3).next(2).to_a
|
97
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.22, 2, 6, 3], @carbon_question.next(3).next(3).to_a
|
98
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.36, 2, 6, 4], @carbon_question.next(3).next(4).to_a
|
99
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.46, 2, 6, 5], @carbon_question.next(3).next(5).to_a
|
62
|
+
assert_equal [], @carbon_question.history
|
100
63
|
end
|
101
64
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.5, 2, 6, 4], @carbon_question.next(4).next(4).to_a
|
108
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.6, 2, 6, 5], @carbon_question.next(4).next(5).to_a
|
65
|
+
#-------------------------------------------------
|
66
|
+
|
67
|
+
def test_next_clamped
|
68
|
+
assert_equal ['carbon', '6', Date.today+1, [1]], @carbon_question.next(1).to_a
|
69
|
+
assert_equal ['carbon', '6', Date.today+1, [4]], @carbon_question.next(4).to_a
|
109
70
|
end
|
110
71
|
|
111
|
-
def
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.6, 2, 6, 4], @carbon_question.next(5).next(4).to_a
|
117
|
-
assert_equal_inspect ['carbon', '6', Date.today+6, 2.7, 2, 6, 5], @carbon_question.next(5).next(5).to_a
|
72
|
+
def test_next_unclamped
|
73
|
+
reminder = Reminder.new('carbon', '6', Date.today, [5,5])
|
74
|
+
|
75
|
+
assert_equal ['carbon', '6', Date.today+1, [5,5,1]], reminder.next(1).to_a
|
76
|
+
assert_equal ['carbon', '6', Date.today+16, [5,5,4]], reminder.next(4).to_a
|
118
77
|
end
|
119
78
|
|
120
79
|
#-------------------------------------------------
|
121
80
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
81
|
+
def test_review
|
82
|
+
assert_equal true, @carbon_question.review?
|
83
|
+
assert_equal true, @carbon_question.next(0).review?
|
84
|
+
assert_equal true, @carbon_question.next(1).review?
|
85
|
+
assert_equal true, @carbon_question.next(2).review?
|
86
|
+
assert_equal true, @carbon_question.next(3).review?
|
87
|
+
assert_equal false, @carbon_question.next(4).review?
|
88
|
+
assert_equal false, @carbon_question.next(5).review?
|
89
|
+
|
90
|
+
assert_equal true, @carbon_question.next(5).next(0).review?
|
91
|
+
assert_equal true, @carbon_question.next(5).next(1).review?
|
92
|
+
assert_equal true, @carbon_question.next(5).next(2).review?
|
93
|
+
assert_equal true, @carbon_question.next(5).next(3).review?
|
94
|
+
assert_equal false, @carbon_question.next(5).next(4).review?
|
95
|
+
assert_equal false, @carbon_question.next(5).next(5).review?
|
126
96
|
end
|
127
97
|
|
128
98
|
end
|
99
|
+
|
data/test/test_reminder_csv.rb
CHANGED
@@ -2,15 +2,8 @@
|
|
2
2
|
require 'test/unit'
|
3
3
|
require "#{File.dirname(__FILE__)}/../lib/forgetful"
|
4
4
|
|
5
|
-
|
6
5
|
class TestReminderCSV < Test::Unit::TestCase
|
7
6
|
|
8
|
-
def assert_equal_inspect(expected, actual)
|
9
|
-
assert_equal expected.inspect, actual.inspect
|
10
|
-
end
|
11
|
-
|
12
|
-
#-------------------------------------------------
|
13
|
-
|
14
7
|
def test_parse_csv_bare
|
15
8
|
csv = <<END
|
16
9
|
carbon,6
|
@@ -22,9 +15,9 @@ END
|
|
22
15
|
|
23
16
|
assert_equal 3, reminders.length
|
24
17
|
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
assert_equal ['carbon', '6',Date.today, []], reminders[0].to_a
|
19
|
+
assert_equal ['nitrogen','7',Date.today, []], reminders[1].to_a
|
20
|
+
assert_equal ['oxygen', '8',Date.today, []], reminders[2].to_a
|
28
21
|
end
|
29
22
|
|
30
23
|
def test_parse_csv_with_dates
|
@@ -38,35 +31,35 @@ END
|
|
38
31
|
|
39
32
|
assert_equal 3, reminders.length
|
40
33
|
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
assert_equal ['carbon', '6',Date.parse('2008-11-11'), []], reminders[0].to_a
|
35
|
+
assert_equal ['nitrogen','7',Date.parse('2008-11-11'), []], reminders[1].to_a
|
36
|
+
assert_equal ['oxygen', '8',Date.parse('2008-11-11'), []], reminders[2].to_a
|
44
37
|
end
|
45
38
|
|
46
39
|
def test_parse_csv_full
|
47
40
|
csv = <<END
|
48
|
-
carbon,6,2008-11-11,
|
49
|
-
nitrogen,7,2008-11-11,
|
50
|
-
oxygen,8,2008-11-11,
|
41
|
+
carbon,6,2008-11-11,5
|
42
|
+
nitrogen,7,2008-11-11,535
|
43
|
+
oxygen,8,2008-11-11,5042
|
51
44
|
END
|
52
45
|
|
53
46
|
reminders = Reminder.parse_csv(csv)
|
54
47
|
|
55
48
|
assert_equal 3, reminders.length
|
56
49
|
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
assert_equal ['carbon', '6',Date.parse('2008-11-11'), [5]], reminders[0].to_a
|
51
|
+
assert_equal ['nitrogen','7',Date.parse('2008-11-11'), [5,3,5]], reminders[1].to_a
|
52
|
+
assert_equal ['oxygen', '8',Date.parse('2008-11-11'), [5,0,4,2]], reminders[2].to_a
|
60
53
|
end
|
61
54
|
|
62
55
|
def test_parse_csv_full_with_spaces
|
63
56
|
csv = <<END
|
64
57
|
|
65
|
-
carbon,6,2008-11-11,
|
58
|
+
carbon,6,2008-11-11,035
|
66
59
|
|
67
60
|
|
68
|
-
nitrogen,7,2008-11-11,
|
69
|
-
oxygen,8,2008-11-11,
|
61
|
+
nitrogen,7,2008-11-11,55555
|
62
|
+
oxygen,8,2008-11-11,1
|
70
63
|
|
71
64
|
END
|
72
65
|
|
@@ -74,9 +67,9 @@ END
|
|
74
67
|
|
75
68
|
assert_equal 3, reminders.length
|
76
69
|
|
77
|
-
|
78
|
-
|
79
|
-
|
70
|
+
assert_equal ['carbon', '6',Date.parse('2008-11-11'), [0,3,5]], reminders[0].to_a
|
71
|
+
assert_equal ['nitrogen','7',Date.parse('2008-11-11'), [5,5,5,5,5]], reminders[1].to_a
|
72
|
+
assert_equal ['oxygen', '8',Date.parse('2008-11-11'), [1]], reminders[2].to_a
|
80
73
|
end
|
81
74
|
|
82
75
|
############################################################
|
@@ -91,9 +84,9 @@ END
|
|
91
84
|
|
92
85
|
expected =<<END
|
93
86
|
carbon,6,#{Date.today}
|
94
|
-
nitrogen,7,#{(Date.today+16)},
|
95
|
-
oxygen,8,#{(Date.today+1)},
|
96
|
-
fluorine,9,#{(Date.today+1)},
|
87
|
+
nitrogen,7,#{(Date.today+16)},555
|
88
|
+
oxygen,8,#{(Date.today+1)},111
|
89
|
+
fluorine,9,#{(Date.today+1)},1515
|
97
90
|
neon,10,#{(Date.today+5)}
|
98
91
|
END
|
99
92
|
|
@@ -101,3 +94,4 @@ END
|
|
101
94
|
end
|
102
95
|
|
103
96
|
end
|
97
|
+
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
require "#{File.dirname(__FILE__)}/../lib/forgetful"
|
4
|
+
|
5
|
+
class TestReminder < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_next_i
|
8
|
+
qs = [5,4,3,2,1,0]
|
9
|
+
results = [4,4,4,0,0,0]
|
10
|
+
|
11
|
+
qs.zip(results).each do |q,result|
|
12
|
+
assert_equal result, SuperMemo::next_i(q, 3), "next_i for q=#{q} when i=3"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_next_interval_normal
|
17
|
+
qs = [5,4,3,2,1,0]
|
18
|
+
results = [16,16,16,1,1,1]
|
19
|
+
|
20
|
+
qs.zip(results).each do |q,result|
|
21
|
+
assert_equal result, SuperMemo::next_interval(q, 2.7, 2, 6), "next_interval for q=#{q}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_next_interval_for_i0
|
26
|
+
qs = [5,4,3,2,1,0]
|
27
|
+
results = [1,1,1,1,1,1]
|
28
|
+
|
29
|
+
qs.zip(results).each do |q,result|
|
30
|
+
assert_equal result, SuperMemo::next_interval(q, 2.5, 0, 0), "next_interval for q=#{q}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_next_interval_for_i1
|
35
|
+
qs = [5,4,3,2,1,0]
|
36
|
+
results = [6,6,6,1,1,1]
|
37
|
+
|
38
|
+
qs.zip(results).each do |q,result|
|
39
|
+
assert_equal result, SuperMemo::next_interval(q, 2.5, 1, 1), "next_interval for q=#{q}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_next_interval_for_changing_efs
|
44
|
+
efs = [1.3, 2.0, 2.5, 2.6, 2.7]
|
45
|
+
results = [8,12,15,16,16]
|
46
|
+
|
47
|
+
efs.zip(results).each do |ef,result|
|
48
|
+
assert_equal result, SuperMemo::next_interval(5, ef, 2, 6), "next_interval for ef=#{ef}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_next_ef_normal
|
53
|
+
qs = [5,4,3,2,1,0]
|
54
|
+
results = [2.6,2.5,2.36,2.18,1.96,1.7]
|
55
|
+
|
56
|
+
qs.zip(results).each do |q,result|
|
57
|
+
assert_in_delta result, SuperMemo::next_ef(q, 2.5), 0.00001, "next_ef for q=#{q}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_next_ef_minimum
|
62
|
+
qs = [5,4,3,2,1,0]
|
63
|
+
results = [1.4,1.3,1.3,1.3,1.3,1.3]
|
64
|
+
|
65
|
+
qs.zip(results).each do |q,result|
|
66
|
+
assert_in_delta result, SuperMemo::next_ef(q, 1.3), 0.00001, "next_ef for q=#{q}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
#-------------------------------------------------
|
71
|
+
|
72
|
+
def assert_equal_inspect(expected, actual)
|
73
|
+
assert_equal expected.inspect, actual.inspect
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_traverse
|
77
|
+
assert_equal_inspect [2.5, 0, 0], SuperMemo::traverse([])
|
78
|
+
assert_equal_inspect [2.6, 1, 1], SuperMemo::traverse([5])
|
79
|
+
assert_equal_inspect [2.7, 2, 6], SuperMemo::traverse([5,5])
|
80
|
+
assert_equal_inspect [2.8, 3, 16], SuperMemo::traverse([5,5,5])
|
81
|
+
assert_equal_inspect [2.9, 4, 45], SuperMemo::traverse([5,5,5,5])
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jpalardy-forgetful
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Palardy
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-11-
|
12
|
+
date: 2008-11-21 00:00:00 -08:00
|
13
13
|
default_executable: forgetful
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -35,6 +35,7 @@ extra_rdoc_files:
|
|
35
35
|
- lib/csv_ext/reminder.rb
|
36
36
|
- lib/forgetful.rb
|
37
37
|
- lib/reminder.rb
|
38
|
+
- lib/supermemo.rb
|
38
39
|
- README.rdoc
|
39
40
|
files:
|
40
41
|
- bin/forgetful
|
@@ -43,11 +44,13 @@ files:
|
|
43
44
|
- lib/csv_ext/reminder.rb
|
44
45
|
- lib/forgetful.rb
|
45
46
|
- lib/reminder.rb
|
47
|
+
- lib/supermemo.rb
|
46
48
|
- Manifest
|
47
49
|
- MIT-LICENSE
|
48
50
|
- README.rdoc
|
49
51
|
- test/test_reminder.rb
|
50
52
|
- test/test_reminder_csv.rb
|
53
|
+
- test/test_supermemo.rb
|
51
54
|
- forgetful.gemspec
|
52
55
|
has_rdoc: false
|
53
56
|
homepage: http://github.com/jpalardy/forgetful
|
@@ -83,3 +86,4 @@ summary: A minimal command-line implementation of the SuperMemo 2 algorithm.
|
|
83
86
|
test_files:
|
84
87
|
- test/test_reminder.rb
|
85
88
|
- test/test_reminder_csv.rb
|
89
|
+
- test/test_supermemo.rb
|