Skip to content

Commit c3f4eb8

Browse files
author
Frankie Robertson
committed
Add sequential next item strategies
1 parent 920cd88 commit c3f4eb8

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/next_item_rules/NextItemRules.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export ExpectationBasedItemCriterion, AbilityVarianceStateCriterion, init_thread
3939
export NextItemRule, ItemStrategyNextItemRule
4040
export UrryItemCriterion, InformationItemCriterion
4141
export RandomNextItemRule
42+
export PiecewiseNextItemRule, MemoryNextItemRule, FixedFirstItemNextItemRule
4243
export ExhaustiveSearch
4344
export catr_next_item_aliases
4445
export preallocate
@@ -60,6 +61,7 @@ include("./prelude/preallocate.jl")
6061

6162
# Selection strategies
6263
include("./strategies/random.jl")
64+
include("./strategies/sequential.jl")
6365
include("./strategies/exhaustive.jl")
6466

6567
# Combinators
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""
2+
$(TYPEDEF)
3+
$(TYPEDFIELDS)
4+
5+
This is the most basic rule for choosing the next item in a CAT. It simply
6+
picks a random item from the set of items that have not yet been
7+
administered.
8+
"""
9+
@kwdef struct PiecewiseNextItemRule{BreaksT, RulesT} <: NextItemRule
10+
# Tuple of Ints
11+
breaks::BreaksT
12+
# Types of NextItemRules
13+
rules::RulesT
14+
end
15+
16+
#tuple_len(::NTuple{N, Any}) where {N} = Val{N}()
17+
18+
function current_rule(rule::PiecewiseNextItemRule, responses::TrackedResponses)
19+
for brk in 1:length(rule.breaks)
20+
if length(responses) < rule.breaks[brk]
21+
return rule.rules[brk]
22+
end
23+
end
24+
return rule.rules[end]
25+
end
26+
27+
function best_item(rule::PiecewiseNextItemRule, responses::TrackedResponses, items)
28+
return best_item(current_rule(rule, responses), responses, items)
29+
end
30+
31+
function compute_criteria(rule::PiecewiseNextItemRule, responses::TrackedResponses)
32+
return compute_criteria(current_rule(rule, responses), responses)
33+
end
34+
35+
"""
36+
"""
37+
@kwdef struct MemoryNextItemRule{MemoryT} <: NextItemRule
38+
item_idxs::MemoryT
39+
end
40+
41+
function best_item(rule::MemoryNextItemRule, responses::TrackedResponses, _items)
42+
return rule.item_idxs[length(responses) + 1]
43+
# XXX: A few problems with this:
44+
# 1. Could run out of `item_idxs`
45+
# 2. Could return an item not in `items`
46+
# TODO: Add some basic error checking -- can only panic
47+
end
48+
49+
function FixedFirstItemNextItemRule(item_idx::Int, rule::NextItemRule)
50+
PiecewiseNextItemRule((1,), (MemoryNextItemRule((item_idx,)), rule))
51+
end

0 commit comments

Comments
 (0)