|
|
|
@ -1,7 +1,7 @@ |
|
|
|
package net.pokeranalytics.android.calculus |
|
|
|
package net.pokeranalytics.android.calculus |
|
|
|
|
|
|
|
|
|
|
|
import net.pokeranalytics.android.calculus.Stat.* |
|
|
|
import net.pokeranalytics.android.calculus.Stat.* |
|
|
|
import net.pokeranalytics.android.model.realm.SessionGroup |
|
|
|
import net.pokeranalytics.android.model.realm.SessionSet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Calculator { |
|
|
|
class Calculator { |
|
|
|
@ -40,20 +40,20 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
|
|
companion object { |
|
|
|
companion object { |
|
|
|
|
|
|
|
|
|
|
|
fun computePreAggregation(groups: List<SessionGroup>, options: Options): List<ComputedGroup> { |
|
|
|
fun computePreAggregation(sets: List<SessionSet>, options: Options): List<ComputedGroup> { |
|
|
|
return listOf() |
|
|
|
return listOf() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Computes all stats for list of Session group |
|
|
|
// Computes all stats for list of Session sessionGroup |
|
|
|
fun computeGroups(groups: List<ComputableSessions>, options: Options): List<ComputedGroup> { |
|
|
|
fun computeGroups(groups: List<SessionGroup>, options: Options): List<ComputedGroup> { |
|
|
|
|
|
|
|
|
|
|
|
var computedGroups: MutableList<ComputedGroup> = mutableListOf() |
|
|
|
var computedGroups: MutableList<ComputedGroup> = mutableListOf() |
|
|
|
groups.forEach { group -> |
|
|
|
groups.forEach { group -> |
|
|
|
// Computes actual group stats |
|
|
|
// Computes actual sessionGroup stats |
|
|
|
val results: ComputedResults = Calculator.compute(group, options = options) |
|
|
|
val results: ComputedResults = Calculator.compute(group, options = options) |
|
|
|
|
|
|
|
|
|
|
|
// Computes the compared group if existing |
|
|
|
// Computes the compared sessionGroup if existing |
|
|
|
val comparedGroup = group.comparedGroup |
|
|
|
val comparedGroup = group.comparedSessions |
|
|
|
if (comparedGroup != null) { |
|
|
|
if (comparedGroup != null) { |
|
|
|
val comparedResults = Calculator.compute(comparedGroup, options = options) |
|
|
|
val comparedResults = Calculator.compute(comparedGroup, options = options) |
|
|
|
group.comparedComputedGroup = ComputedGroup(comparedGroup, comparedResults) |
|
|
|
group.comparedComputedGroup = ComputedGroup(comparedGroup, comparedResults) |
|
|
|
@ -68,11 +68,11 @@ class Calculator { |
|
|
|
return computedGroups |
|
|
|
return computedGroups |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Computes stats for a SessionGroup |
|
|
|
// Computes stats for a SessionSet |
|
|
|
fun compute(group: ComputableSessions, options: Options) : ComputedResults { |
|
|
|
fun compute(sessionGroup: SessionGroup, options: Options) : ComputedResults { |
|
|
|
|
|
|
|
|
|
|
|
val sessions: List<SessionInterface> = group.sessionGroup |
|
|
|
val sessions: List<SessionInterface> = sessionGroup.sessions |
|
|
|
val sessionGroups: Set<SessionGroup> = setOf() // @todo get unique list of serie |
|
|
|
val sessionSets: Set<SessionSet> = setOf() // @todo get unique list of serie |
|
|
|
var results: ComputedResults = ComputedResults() |
|
|
|
var results: ComputedResults = ComputedResults() |
|
|
|
|
|
|
|
|
|
|
|
var sum: Double = 0.0 |
|
|
|
var sum: Double = 0.0 |
|
|
|
@ -82,28 +82,28 @@ class Calculator { |
|
|
|
var winningSessionCount: Int = 0 |
|
|
|
var winningSessionCount: Int = 0 |
|
|
|
var totalBuyin: Double = 0.0 |
|
|
|
var totalBuyin: Double = 0.0 |
|
|
|
|
|
|
|
|
|
|
|
// @todo add all stats |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Compute for each session |
|
|
|
// Compute for each session |
|
|
|
var index: Int = 0 |
|
|
|
var index: Int = 0 |
|
|
|
sessions.forEach { s -> |
|
|
|
sessions.forEach { s -> |
|
|
|
index++; |
|
|
|
index++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sum += s.value |
|
|
|
|
|
|
|
bbSum += s.bbNetResult |
|
|
|
bbSessionCount += s.bigBlindSessionCount |
|
|
|
bbSessionCount += s.bigBlindSessionCount |
|
|
|
if (s.value >= 0) { |
|
|
|
if (s.value >= 0) { |
|
|
|
winningSessionCount++ |
|
|
|
winningSessionCount++ |
|
|
|
} |
|
|
|
} |
|
|
|
totalBuyin += s.buyin |
|
|
|
totalBuyin += s.buyin |
|
|
|
|
|
|
|
totalHands += s.estimatedHands |
|
|
|
|
|
|
|
|
|
|
|
if (options.evolutionValues != Options.EvolutionValues.NONE) { |
|
|
|
if (options.evolutionValues == Options.EvolutionValues.STANDARD) { |
|
|
|
|
|
|
|
|
|
|
|
sum += s.value |
|
|
|
|
|
|
|
totalHands += s.estimatedHands |
|
|
|
|
|
|
|
bbSum += s.bbNetResult |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
results.addEvolutionValue(sum, NETRESULT) |
|
|
|
results.addEvolutionValue(sum / index, AVERAGE) |
|
|
|
results.addEvolutionValue(sum / index, AVERAGE) |
|
|
|
results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES) |
|
|
|
results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES) |
|
|
|
results.addEvolutionValue(bbSum / bbSessionCount, AVERAGE_NET_BB) |
|
|
|
results.addEvolutionValue(bbSum / bbSessionCount, AVERAGE_NET_BB) |
|
|
|
|
|
|
|
results.addEvolutionValue(Stat.netBBPer100Hands(bbSum, totalHands), NET_BB_PER_100_HANDS) |
|
|
|
results.addEvolutionValue((winningSessionCount / index).toDouble(), WIN_RATIO) |
|
|
|
results.addEvolutionValue((winningSessionCount / index).toDouble(), WIN_RATIO) |
|
|
|
results.addEvolutionValue(totalBuyin / index, AVERAGE_BUYIN) |
|
|
|
results.addEvolutionValue(totalBuyin / index, AVERAGE_BUYIN) |
|
|
|
results.addEvolutionValue(Stat.returnOnInvestment(sum, totalBuyin), ROI) |
|
|
|
results.addEvolutionValue(Stat.returnOnInvestment(sum, totalBuyin), ROI) |
|
|
|
@ -115,25 +115,25 @@ class Calculator { |
|
|
|
var duration: Double = 0.0 |
|
|
|
var duration: Double = 0.0 |
|
|
|
var hourlyRate: Double = 0.0; var hourlyRateBB: Double = 0.0 |
|
|
|
var hourlyRate: Double = 0.0; var hourlyRateBB: Double = 0.0 |
|
|
|
|
|
|
|
|
|
|
|
index = 0; sum = 0.0; totalHands = 0.0; bbSum = 0.0; |
|
|
|
var gIndex = 0; var gSum = 0.0; var gTotalHands = 0.0; var gBBSum = 0.0; |
|
|
|
sessionGroups.forEach { group -> |
|
|
|
sessionSets.forEach { group -> |
|
|
|
index++ |
|
|
|
gIndex++ |
|
|
|
duration += group.duration |
|
|
|
duration += group.duration |
|
|
|
sum += group.netResult |
|
|
|
gSum += group.netResult |
|
|
|
totalHands += group.estimatedHands |
|
|
|
gTotalHands += group.estimatedHands |
|
|
|
bbSum += group.bbNetResult |
|
|
|
gBBSum += group.bbNetResult |
|
|
|
|
|
|
|
|
|
|
|
hourlyRate = sum / duration * 3600.0 |
|
|
|
hourlyRate = gSum / duration * 3600.0 |
|
|
|
hourlyRateBB = bbSum / duration * 3600.0 |
|
|
|
hourlyRateBB = gBBSum / duration * 3600.0 |
|
|
|
|
|
|
|
|
|
|
|
if (options.evolutionValues != Options.EvolutionValues.NONE) { |
|
|
|
if (options.evolutionValues == Options.EvolutionValues.DATED) { |
|
|
|
results.addEvolutionValue(sum, duration, NETRESULT) |
|
|
|
results.addEvolutionValue(gSum, duration, NETRESULT) |
|
|
|
results.addEvolutionValue(sum / duration * 3600.0, duration, HOURLY_RATE) |
|
|
|
results.addEvolutionValue(gSum / duration * 3600.0, duration, HOURLY_RATE) |
|
|
|
results.addEvolutionValue(Stat.netBBPer100Hands(bbSum, totalHands), duration, NET_BB_PER_100_HANDS) |
|
|
|
results.addEvolutionValue(Stat.netBBPer100Hands(gBBSum, gTotalHands), duration, NET_BB_PER_100_HANDS) |
|
|
|
results.addEvolutionValue(hourlyRate, duration, HOURLY_RATE) |
|
|
|
results.addEvolutionValue(hourlyRate, duration, HOURLY_RATE) |
|
|
|
results.addEvolutionValue(index.toDouble(), duration, NUMBER_OF_GROUPS) |
|
|
|
results.addEvolutionValue(gIndex.toDouble(), duration, NUMBER_OF_GROUPS) |
|
|
|
results.addEvolutionValue(group.duration, duration, DURATION) |
|
|
|
results.addEvolutionValue(group.duration, duration, DURATION) |
|
|
|
results.addEvolutionValue(duration / index, duration, AVERAGE_DURATION) |
|
|
|
results.addEvolutionValue(duration / gIndex, duration, AVERAGE_DURATION) |
|
|
|
results.addEvolutionValue(hourlyRateBB, duration, HOURLY_RATE_BB) |
|
|
|
results.addEvolutionValue(hourlyRateBB, duration, HOURLY_RATE_BB) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -146,7 +146,7 @@ class Calculator { |
|
|
|
ComputedStat(HOURLY_RATE, hourlyRate), |
|
|
|
ComputedStat(HOURLY_RATE, hourlyRate), |
|
|
|
ComputedStat(AVERAGE, average), |
|
|
|
ComputedStat(AVERAGE, average), |
|
|
|
ComputedStat(DURATION, duration), |
|
|
|
ComputedStat(DURATION, duration), |
|
|
|
ComputedStat(NUMBER_OF_GROUPS, sessionGroups.size.toDouble()), |
|
|
|
ComputedStat(NUMBER_OF_GROUPS, sessionSets.size.toDouble()), |
|
|
|
ComputedStat(NUMBER_OF_GAMES, sessions.size.toDouble()), |
|
|
|
ComputedStat(NUMBER_OF_GAMES, sessions.size.toDouble()), |
|
|
|
ComputedStat(AVERAGE_DURATION, (duration / 3600.0) / sessions.size), |
|
|
|
ComputedStat(AVERAGE_DURATION, (duration / 3600.0) / sessions.size), |
|
|
|
ComputedStat(NET_BB_PER_100_HANDS, Stat.netBBPer100Hands(bbSum, totalHands)), |
|
|
|
ComputedStat(NET_BB_PER_100_HANDS, Stat.netBBPer100Hands(bbSum, totalHands)), |
|
|
|
@ -154,7 +154,8 @@ class Calculator { |
|
|
|
ComputedStat(AVERAGE_NET_BB, bbSum / bbSessionCount), |
|
|
|
ComputedStat(AVERAGE_NET_BB, bbSum / bbSessionCount), |
|
|
|
ComputedStat(WIN_RATIO, (winningSessionCount / sessions.size).toDouble()), |
|
|
|
ComputedStat(WIN_RATIO, (winningSessionCount / sessions.size).toDouble()), |
|
|
|
ComputedStat(AVERAGE_BUYIN, totalBuyin / sessions.size), |
|
|
|
ComputedStat(AVERAGE_BUYIN, totalBuyin / sessions.size), |
|
|
|
ComputedStat(ROI, Stat.returnOnInvestment(sum, totalBuyin)) |
|
|
|
ComputedStat(ROI, Stat.returnOnInvestment(sum, totalBuyin)), |
|
|
|
|
|
|
|
ComputedStat(HANDS_PLAYED, totalHands) |
|
|
|
|
|
|
|
|
|
|
|
)) |
|
|
|
)) |
|
|
|
|
|
|
|
|
|
|
|
@ -169,10 +170,10 @@ class Calculator { |
|
|
|
val standardDeviation: Double = Math.sqrt(stdSum / sessions.size) |
|
|
|
val standardDeviation: Double = Math.sqrt(stdSum / sessions.size) |
|
|
|
|
|
|
|
|
|
|
|
var hourlyStdSum: Double = 0.0 |
|
|
|
var hourlyStdSum: Double = 0.0 |
|
|
|
sessionGroups.forEach { sg -> |
|
|
|
sessionSets.forEach { sg -> |
|
|
|
hourlyStdSum += Math.pow(sg.hourlyRate - hourlyRate, 2.0) |
|
|
|
hourlyStdSum += Math.pow(sg.hourlyRate - hourlyRate, 2.0) |
|
|
|
} |
|
|
|
} |
|
|
|
val hourlyStandardDeviation: Double = Math.sqrt(hourlyStdSum / sessionGroups.size) |
|
|
|
val hourlyStandardDeviation: Double = Math.sqrt(hourlyStdSum / sessionSets.size) |
|
|
|
|
|
|
|
|
|
|
|
results.addStats(setOf( |
|
|
|
results.addStats(setOf( |
|
|
|
ComputedStat(STANDARD_DEVIATION, standardDeviation), |
|
|
|
ComputedStat(STANDARD_DEVIATION, standardDeviation), |
|
|
|
|