Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ attic/
/full/Project.toml
.CondaPkg/
LocalPreferences.toml
/.claude/settings.local.json
12 changes: 10 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ version = "0.4.0"
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
AutoHashEquals = "15f4f7f2-30c1-5605-9d31-71845cf9641f"
ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
DataAPI = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
Expand All @@ -23,8 +24,11 @@ LogarithmicNumbers = "aa2f6b4e-9042-5d33-9679-40d3a6b85899"
MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
Mmap = "a63ad114-7e13-5084-954f-fe012c677804"
PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
PrettyPrinting = "54e16d92-306c-5ea0-a30b-337be88ac337"
PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
PsychometricsBazaarBase = "b0d9cada-d963-45e9-a4c6-4746243987f1"
QuickHeaps = "30b38841-0f52-47f8-a5f8-18d5d4064379"
RDataGet = "a115732e-4334-4ecb-8ea3-f683e7f66d4d"
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
Expand All @@ -44,13 +48,14 @@ Accessors = "^0.1.12"
Aqua = "0.8"
AutoHashEquals = "2"
ConstructionBase = "^1.2"
DataAPI = "1.16.0"
DataFrames = "1.6.1"
Distributions = "^0.25.88"
DocStringExtensions = " ^0.9"
EffectSizes = "^1.0.1"
ElasticArrays = "1.2.12"
FillArrays = "0.13, 1.5.0"
FittedItemBanks = "^0.7.2"
FittedItemBanks = "^0.7.3"
ForwardDiff = "1"
HypothesisTests = "^0.10.12, ^0.11.0"
Interpolations = "^0.14, ^0.15"
Expand All @@ -62,8 +67,11 @@ MacroTools = "^0.5.6"
Mmap = "^1.11"
Optim = "1.7.3"
PrecompileTools = "1.2.1"
PsychometricsBazaarBase = "^0.8.4"
PrettyPrinting = "0.4.2"
PrettyTables = "3"
PsychometricsBazaarBase = "^0.8.6"
QuickHeaps = "0.2.2"
RDataGet = "0.1.0"
Random = "^1.11"
Reexport = "1"
Setfield = "^1"
Expand Down
10 changes: 8 additions & 2 deletions src/Aggregators/Aggregators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ using FittedItemBanks: AbstractItemBank, ContinuousDomain,
using ..Responses
using ..Responses: concrete_response_type, function_xs, function_ys, Responses
using ..ConfigBase
import PsychometricsBazaarBase: power_summary
using PsychometricsBazaarBase.ConfigTools: @requiresome, @returnsome,
find1_instance, find1_type,
find1_type_sloppy
Expand Down Expand Up @@ -52,6 +53,7 @@ export FunctionOptimizer, FunctionIntegrator
export DistributionAbilityEstimator
export variance, variance_given_mean, mean_1d
export RiemannEnumerationIntegrator
export get_integrator
# export EnumerationOptimizer

# Basic types
Expand Down Expand Up @@ -200,6 +202,10 @@ struct FunctionIntegrator{IntegratorT <: Integrator} <: AbilityIntegrator
integrator::IntegratorT
end

function get_integrator(integrator::FunctionIntegrator)
return integrator.integrator
end

function (integrator::FunctionIntegrator{IntegratorT})(f::F,
ncomp,
lh_function::LHF) where {F, LHF, IntegratorT}
Expand All @@ -210,8 +216,8 @@ function (integrator::FunctionIntegrator{IntegratorT})(f::F,
integrator.integrator(FunctionProduct(f, lh_function), ncomp)
end

function show(io::IO, ::MIME"text/plain", responses::FunctionIntegrator)
show(io, MIME("text/plain"), responses.integrator)
function power_summary(io::IO, responses::FunctionIntegrator)
power_summary(io, responses.integrator)
end

# Defaults
Expand Down
18 changes: 9 additions & 9 deletions src/Aggregators/ability_estimator.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ function pdf(::LikelihoodAbilityEstimator,
AbilityLikelihood(tracked_responses)
end

function show(io::IO, ::MIME"text/plain", ability_estimator::LikelihoodAbilityEstimator)
function power_summary(io::IO, ability_estimator::LikelihoodAbilityEstimator)
println(io, "Ability likelihood distribution")
end

Expand Down Expand Up @@ -61,11 +61,11 @@ function multiple_response_types_guard(tracked_responses)
return false
end

function show(io::IO, ::MIME"text/plain", ability_estimator::PosteriorAbilityEstimator)
function power_summary(io::IO, ability_estimator::PosteriorAbilityEstimator)
println(io, "Ability posterior distribution")
indent_io = indent(io, 2)
print(indent_io, "Prior: ")
show(indent_io, MIME("text/plain"), ability_estimator.prior)
power_summary(indent_io, ability_estimator.prior)
println(io)
end

Expand Down Expand Up @@ -224,11 +224,11 @@ function ModeAbilityEstimator(bits...)
ModeAbilityEstimator(dist_est, optimizer)
end

function show(io::IO, ::MIME"text/plain", ability_estimator::ModeAbilityEstimator)
function power_summary(io::IO, ability_estimator::ModeAbilityEstimator)
println(io, "Estimate ability using its mode")
indent_io = indent(io, 2)
show(indent_io, MIME("text/plain"), ability_estimator.dist_est)
show(indent_io, MIME("text/plain"), ability_estimator.optim)
power_summary(indent_io, ability_estimator.dist_est)
power_summary(indent_io, ability_estimator.optim)
end

struct MeanAbilityEstimator{
Expand All @@ -246,12 +246,12 @@ function MeanAbilityEstimator(bits...)
MeanAbilityEstimator(dist_est, integrator)
end

function show(io::IO, ::MIME"text/plain", ability_estimator::MeanAbilityEstimator)
function power_summary(io::IO, ability_estimator::MeanAbilityEstimator)
println(io, "Estimate ability using its mean")
indent_io = indent(io, 2)
show(indent_io, MIME("text/plain"), ability_estimator.dist_est)
power_summary(indent_io, ability_estimator.dist_est)
print(indent_io, "Integrator: ")
show(indent_io, MIME("text/plain"), ability_estimator.integrator)
power_summary(indent_io, ability_estimator.integrator)
end

function distribution_estimator(dist_est::DistributionAbilityEstimator)::DistributionAbilityEstimator
Expand Down
2 changes: 1 addition & 1 deletion src/Aggregators/optimizers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ function (optim::FunctionOptimizer)(f::F,
optim.optim(comp_f)
end

function show(io::IO, ::MIME"text/plain", optim::FunctionOptimizer)
function power_summary(io::IO, optim::FunctionOptimizer)
indent_io = indent(io, 2)
if optim.optim isa Optimizers.OneDimOptimOptimizer || optim.optim isa Optimizers.MultiDimOptimOptimizer || optim.optim isa Optimizers.NativeOneDimOptimOptimizer
inner = optim.optim
Expand Down
4 changes: 4 additions & 0 deletions src/Aggregators/tracked.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ struct TrackedLikelihoodIntegrator{IntegratorT <: Integrator} <: AbilityIntegrat
tracker::GriddedAbilityTracker
end

function get_integrator(integrator::TrackedLikelihoodIntegrator)
return integrator.integrator
end

function (integrator::TrackedLikelihoodIntegrator{IntegratorT})(f::F,
ncomp) where {F, IntegratorT}
integrator.integrator(FunctionArgProduct(f), integrator.tracker.cur_ability, ncomp)
Expand Down
2 changes: 2 additions & 0 deletions src/ConfigBase.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ $(TYPEDEF)
"""
abstract type CatConfigBase end

show(io::IO, ::MIME"text/plain", obj::CatConfigBase) = power_summary(io, obj)

function walk(f, x::CatConfigBase, lens = identity)
f(x, lens)
for fieldname in fieldnames(typeof(x))
Expand Down
3 changes: 2 additions & 1 deletion src/NextItemRules/NextItemRules.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ using Random: AbstractRNG, Xoshiro

using ..Responses: BareResponses
using ..ConfigBase
import PsychometricsBazaarBase: power_summary
using PsychometricsBazaarBase.ConfigTools: @requiresome, @returnsome,
find1_instance, find1_type
using PsychometricsBazaarBase.Integrators: Integrator, intval
Expand Down Expand Up @@ -56,7 +57,7 @@ export PointResponseExpectation, DistributionResponseExpectation
export MatrixScalarizer, DeterminantScalarizer, TraceScalarizer
export AbilityCovarianceStateMultiCriterion, StateMultiCriterion, ItemMultiCriterion
export InformationMatrixCriteria
export ScalarizedStateCriteron, ScalarizedItemCriteron
export ScalarizedStateCriterion, ScalarizedItemCriterion
export DRuleItemCriterion, TRuleItemCriterion

# Prelude
Expand Down
10 changes: 5 additions & 5 deletions src/NextItemRules/combinators/expectation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ function Aggregators.response_expectation(
item_idx)
end

function show(io::IO, ::MIME"text/plain", point_response_expectation::PointResponseExpectation)
function power_summary(io::IO, point_response_expectation::PointResponseExpectation)
println(io, "Expected response at point ability estimate")
indent_io = indent(io, 2)
show(indent_io, MIME("text/plain"), point_response_expectation.ability_estimator)
power_summary(indent_io, point_response_expectation.ability_estimator)
end

struct DistributionResponseExpectation{
Expand Down Expand Up @@ -131,9 +131,9 @@ function compute_criterion(
res
end

function show(io::IO, ::MIME"text/plain", item_criterion::ExpectationBasedItemCriterion)
function power_summary(io::IO, item_criterion::ExpectationBasedItemCriterion)
println(io, "Optimize an state/item/item-category criterion based on an expected response")
indent_io = indent(io, 2)
show(indent_io, MIME"text/plain"(), item_criterion.response_expectation)
show(indent_io, MIME"text/plain"(), item_criterion.criterion)
power_summary(indent_io, item_criterion.response_expectation)
power_summary(indent_io, item_criterion.criterion)
end
6 changes: 3 additions & 3 deletions src/NextItemRules/combinators/scalarizers.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@ scalarize(::DeterminantScalarizer, mat) = det(mat)
struct TraceScalarizer <: MatrixScalarizer end
scalarize(::TraceScalarizer, mat) = tr(mat)

struct ScalarizedItemCriteron{
struct ScalarizedItemCriterion{
ItemMultiCriterionT <: ItemMultiCriterion,
MatrixScalarizerT <: MatrixScalarizer
} <: ItemCriterion
criteria::ItemMultiCriterionT
scalarizer::MatrixScalarizerT
end

struct ScalarizedStateCriteron{
struct ScalarizedStateCriterion{
StateMultiCriterionT <: StateMultiCriterion,
MatrixScalarizerT <: MatrixScalarizer
} <: StateCriterion
criteria::StateMultiCriterionT
scalarizer::MatrixScalarizerT
end

function compute_criterion(ssc::Union{ScalarizedItemCriteron, ScalarizedStateCriteron},
function compute_criterion(ssc::Union{ScalarizedItemCriterion, ScalarizedStateCriterion},
tracked_responses::TrackedResponses, item_idx...)
res = scalarize(
ssc.scalarizer,
Expand Down
12 changes: 6 additions & 6 deletions src/NextItemRules/criteria/pointwise/information.jl
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ function compute_criterion_vec(
-actual
end

function show(io::IO, ::MIME"text/plain", ::ObservedInformationPointwiseItemCategoryCriterion)
function power_summary(io::IO, ::ObservedInformationPointwiseItemCategoryCriterion)
println(io, "Observed pointwise item-category information")
end

Expand Down Expand Up @@ -51,7 +51,7 @@ function compute_criterion_vec(
end


function show(io::IO, ::MIME"text/plain", ::RawEmpiricalInformationPointwiseItemCategoryCriterion)
function power_summary(io::IO, ::RawEmpiricalInformationPointwiseItemCategoryCriterion)
println(io, "Raw empirical pointwise item-category information")
end

Expand Down Expand Up @@ -104,7 +104,7 @@ function compute_criterion_vec(
-actual
end

function show(io::IO, ::MIME"text/plain", ::EmpiricalInformationPointwiseItemCategoryCriterion)
function power_summary(io::IO, ::EmpiricalInformationPointwiseItemCategoryCriterion)
println(io, "Empirical pointwise item-category information")
end

Expand All @@ -131,7 +131,7 @@ function compute_criterion(
sum(compute_criterion_vec(tii.pcic, ir, ability))
end

function show(io::IO, ::MIME"text/plain", rule::TotalItemInformation)
function power_summary(io::IO, rule::TotalItemInformation)
if rule.pcic isa ObservedInformationPointwiseItemCategoryCriterion
println(io, "Observed pointwise item information")
elseif rule.pcic isa RawEmpiricalInformationPointwiseItemCategoryCriterion
Expand All @@ -140,6 +140,6 @@ function show(io::IO, ::MIME"text/plain", rule::TotalItemInformation)
println(io, "Empirical pointwise item information")
else
print(io, "Total ")
show(io, MIME("text/plain"), rule.pcic)
power_summary(io, rule.pcic)
end
end
end
10 changes: 6 additions & 4 deletions src/NextItemRules/criteria/state/ability_variance.jl
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,13 @@ function compute_criterion(
denom)
end

function show(io::IO, ::MIME"text/plain", criterion::AbilityVariance)
println(io, "Minimise variance of ability estimate")
function power_summary(io::IO, criterion::AbilityVariance; skip_first_line=false)
if !skip_first_line
println(io, "Minimise variance of ability estimate")
end
indent_io = indent(io, 2)
show(indent_io, MIME("text/plain"), criterion.dist_est)
show(indent_io, MIME("text/plain"), criterion.integrator)
power_summary(indent_io, criterion.dist_est)
power_summary(indent_io, criterion.integrator)
end

struct AbilityCovarianceStateMultiCriterion{
Expand Down
4 changes: 2 additions & 2 deletions src/NextItemRules/porcelain/porcelain.jl
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
function DRuleItemCriterion(ability_estimator)
ScalarizedItemCriteron(
ScalarizedItemCriterion(
InformationMatrixCriteria(ability_estimator),
DeterminantScalarizer())
end

function TRuleItemCriterion(ability_estimator)
ScalarizedItemCriteron(
ScalarizedItemCriterion(
InformationMatrixCriteria(ability_estimator),
TraceScalarizer())
end
6 changes: 3 additions & 3 deletions src/NextItemRules/prelude/next_item_rule.jl
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,11 @@ function best_item(rule::NextItemRule, tracked_responses::TrackedResponses)
best_item(rule, tracked_responses, tracked_responses.item_bank)
end

function Base.show(io::IO, ::MIME"text/plain", rule::ItemCriterionRule)
function power_summary(io::IO, rule::ItemCriterionRule)
println(io, "Pick optimal item criterion according to strategy")
indent_io = indent(io, 2)
show(indent_io, MIME"text/plain"(), rule.strategy)
show(indent_io, MIME"text/plain"(), rule.criterion)
power_summary(indent_io, rule.strategy)
power_summary(indent_io, rule.criterion)
end

# Default implementation
Expand Down
6 changes: 3 additions & 3 deletions src/NextItemRules/strategies/balance.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ function GreedyForcedContentBalancer(targets::AbstractVector, groups, bits...)
GreedyForcedContentBalancer(targets, groups, NextItemRule(bits...))
end

function show(io::IO, ::MIME"text/plain", rule::GreedyForcedContentBalancer)
function power_summary(io::IO, rule::GreedyForcedContentBalancer)
indent_io = indent(io, 2)
println(io, "Greedy + forced content balancing")
println(indent_io, "Target ratio: " * join(rule.targets, ", "))
show(indent_io, MIME("text/plain"), rule.inner_rule)
power_summary(indent_io, rule.inner_rule)
end

function next_item_bank(targets, groups, responses, items)
Expand Down Expand Up @@ -86,4 +86,4 @@ function compute_criteria(
expanded = fill(Inf, length(items))
expanded[matching_indicator] .= criteria
return expanded
end
end
4 changes: 2 additions & 2 deletions src/NextItemRules/strategies/pointwise.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ function best_item(rule::PointwiseNextItemRule, responses::TrackedResponses, ite
return idx
end

function show(io::IO, ::MIME"text/plain", rule::PointwiseNextItemRule)
function power_summary(io::IO, rule::PointwiseNextItemRule)
println(io, "Optimize a pointwise criterion at specified points")
indent_io = indent(io, 2)
points_desc = join(rule.points, ", ")
println(indent_io, "Points: $points_desc")
show(indent_io, MIME("text/plain"), rule.criterion)
power_summary(indent_io, rule.criterion)
end


Expand Down
4 changes: 2 additions & 2 deletions src/NextItemRules/strategies/randomesque.jl
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,6 @@ function best_item(
randomesque(rule.strategy.rng, rule.criterion, responses, items, rule.strategy.k)[1]
end

function show(io::IO, ::MIME"text/plain", rule::RandomesqueStrategy)
function power_summary(io::IO, rule::RandomesqueStrategy)
println(io, "Randomesque strategy with k = $(rule.k)")
end
end
Loading
Loading