Module:IteratedProbability: Difference between revisions

From Caves of Qud Wiki
Jump to navigation Jump to search
(Created page with "local IP = { INFINITY = 1 / 0, } local function isNatural(value) return math.floor(value) == value and value >= 0 end local function isProbability(value) return...")
 
(fix errors in assertion predicates)
 
Line 4: Line 4:


local function isNatural(value)
local function isNatural(value)
     return math.floor(value) == value and value >= 0
     return type(value) == 'number'
      and math.floor(value) == value
      and value >= 0
end
end


local function isProbability(value)
local function isProbability(value)
     return 0 <= value and value <= 1
     return type(value) == 'number'
      and 0 <= value
      and value <= 1
end
end



Latest revision as of 16:12, 26 August 2019

This module is maintained on GitHub.


local IP = {
    INFINITY = 1 / 0,
}

local function isNatural(value)
    return type(value) == 'number'
       and math.floor(value) == value
       and value >= 0
end

local function isProbability(value)
    return type(value) == 'number'
       and 0 <= value
       and value <= 1
end

function IP.eachTry(baseProbability)
    assert(isProbability(baseProbability), 'baseProbability is not a probability')

    local count, sumSoFar = 0, 0

    return function ()
        local currentCount, currentSumSoFar = count, sumSoFar
        count = currentCount + 1
        sumSoFar = currentSumSoFar + baseProbability * (1 - baseProbability) ^ currentCount
        return currentCount, currentSumSoFar
    end
end

function IP.tryFor(count, baseProbability)
    assert(isNatural(count), 'count is not a natural number')

    for currentCount, iteratedProbability in IP.eachTry(baseProbability) do
        if currentCount >= count then
            return iteratedProbability
        end
    end
end

function IP.tryUntil(targetProbability, baseProbability)
    assert(isProbability(targetProbability), 'targetProbability is not a probability')

    if targetProbability == 1 and baseProbability < 1 then
        return IP.INFINITY
    end

    for count, iteratedProbability in IP.eachTry(baseProbability) do
        if iteratedProbability >= targetProbability then
            return count
        end
    end
end

return IP