|
|
|
|
@ -1,7 +1,7 @@ |
|
|
|
|
package net.pokeranalytics.android.calculus |
|
|
|
|
|
|
|
|
|
import net.pokeranalytics.android.calculus.Stat.* |
|
|
|
|
import net.pokeranalytics.android.calculus.interfaces.Computable |
|
|
|
|
import net.pokeranalytics.android.model.realm.ComputableResult |
|
|
|
|
import net.pokeranalytics.android.model.realm.SessionSet |
|
|
|
|
import timber.log.Timber |
|
|
|
|
import java.util.* |
|
|
|
|
@ -96,14 +96,9 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
// fun compute(sessionGroup: ComputableGroup, options: Options): ComputedResults { |
|
|
|
|
// |
|
|
|
|
// var sum: Double = 0.0 |
|
|
|
|
// val computables: List<SessionInterface> = sessionGroup.computables |
|
|
|
|
// var sum: Double = sessionGroup.computables.sum("ratedNet").toDouble() |
|
|
|
|
// val results: ComputedResults = ComputedResults(sessionGroup) |
|
|
|
|
// |
|
|
|
|
// computables.forEach { s -> |
|
|
|
|
// sum += s.ratedNet |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// results.addStats( |
|
|
|
|
// setOf( |
|
|
|
|
// ComputedStat(NETRESULT, sum) |
|
|
|
|
@ -121,48 +116,52 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
Timber.d(">>>> Start computing group ${computableGroup.name}, ${computableGroup.computables.size} computables") |
|
|
|
|
|
|
|
|
|
val computables: List<Computable> = computableGroup.computables |
|
|
|
|
val sessionSets = computableGroup.computables.mapNotNull { it.sessionSet }.toHashSet() |
|
|
|
|
val computables = computableGroup.computables |
|
|
|
|
|
|
|
|
|
val results: ComputedResults = ComputedResults(computableGroup) |
|
|
|
|
|
|
|
|
|
var sum: Double = 0.0 |
|
|
|
|
var totalHands: Double = 0.0 |
|
|
|
|
var bbSum: Double = 0.0 |
|
|
|
|
var bbSessionCount: Int = 0 |
|
|
|
|
var winningSessionCount: Int = 0 // computables.filter { it.value >= 0.0 }.size |
|
|
|
|
var totalBuyin = 0.0 |
|
|
|
|
var sum: Double = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble() |
|
|
|
|
var totalHands: Double = computables.sum(ComputableResult.Field.ESTIMATED_HANDS.identifier).toDouble() |
|
|
|
|
var bbSum: Double = computables.sum(ComputableResult.Field.BB_NET.identifier).toDouble() |
|
|
|
|
var bbSessionCount: Int = computables.sum(ComputableResult.Field.HAS_BIG_BLIND.identifier).toInt() |
|
|
|
|
var winningSessionCount: Int = computables.sum(ComputableResult.Field.IS_POSITIVE.identifier).toInt() |
|
|
|
|
var totalBuyin = computables.sum(ComputableResult.Field.RATED_BUYIN.identifier).toDouble() |
|
|
|
|
|
|
|
|
|
// Compute for each session |
|
|
|
|
var index: Int = 0 |
|
|
|
|
computables.forEach { s -> |
|
|
|
|
index++; |
|
|
|
|
|
|
|
|
|
// val result = s.result!! // ok to crash to see problems |
|
|
|
|
|
|
|
|
|
sum += s.ratedNet |
|
|
|
|
bbSum += s.bbNetResult |
|
|
|
|
bbSessionCount += s.hasBigBlind |
|
|
|
|
winningSessionCount += s.isPositive |
|
|
|
|
totalBuyin += s.ratedBuyin |
|
|
|
|
totalHands += s.estimatedHands |
|
|
|
|
|
|
|
|
|
when (options.evolutionValues) { |
|
|
|
|
Options.EvolutionValues.STANDARD -> { |
|
|
|
|
|
|
|
|
|
results.addEvolutionValue(sum, NETRESULT) |
|
|
|
|
results.addEvolutionValue(sum / index, AVERAGE) |
|
|
|
|
var index: Int = 0 |
|
|
|
|
var tSum = 0.0 |
|
|
|
|
var tBBSum = 0.0 |
|
|
|
|
var tBBSessionCount = 0 |
|
|
|
|
var tWinningSessionCount = 0 |
|
|
|
|
var tBuyinSum = 0.0 |
|
|
|
|
var tHands = 0.0 |
|
|
|
|
|
|
|
|
|
computables.forEach { s -> |
|
|
|
|
index++; |
|
|
|
|
tSum += s.ratedNet |
|
|
|
|
tBBSum += s.bbNetResult |
|
|
|
|
tBBSessionCount += s.hasBigBlind |
|
|
|
|
tWinningSessionCount += s.isPositive |
|
|
|
|
tBuyinSum += s.ratedBuyin |
|
|
|
|
tHands += s.estimatedHands |
|
|
|
|
|
|
|
|
|
results.addEvolutionValue(tSum, NETRESULT) |
|
|
|
|
results.addEvolutionValue(tSum / index, AVERAGE) |
|
|
|
|
results.addEvolutionValue(index.toDouble(), NUMBER_OF_GAMES) |
|
|
|
|
results.addEvolutionValue(bbSum / bbSessionCount, AVERAGE_NET_BB) |
|
|
|
|
results.addEvolutionValue((winningSessionCount / index).toDouble(), WIN_RATIO) |
|
|
|
|
results.addEvolutionValue(totalBuyin / index, AVERAGE_BUYIN) |
|
|
|
|
results.addEvolutionValue(tBBSum / tBBSessionCount, AVERAGE_NET_BB) |
|
|
|
|
results.addEvolutionValue((tWinningSessionCount / index).toDouble(), WIN_RATIO) |
|
|
|
|
results.addEvolutionValue(tBuyinSum / index, AVERAGE_BUYIN) |
|
|
|
|
|
|
|
|
|
val netBB100 = Stat.netBBPer100Hands(bbSum, totalHands) |
|
|
|
|
val netBB100 = Stat.netBBPer100Hands(tBBSum, tHands) |
|
|
|
|
if (netBB100 != null) { |
|
|
|
|
results.addEvolutionValue(netBB100, NET_BB_PER_100_HANDS) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val roi = Stat.returnOnInvestment(sum, totalBuyin) |
|
|
|
|
val roi = Stat.returnOnInvestment(tSum, tBuyinSum) |
|
|
|
|
if (roi != null) { |
|
|
|
|
results.addEvolutionValue(roi, ROI) |
|
|
|
|
} |
|
|
|
|
@ -171,44 +170,55 @@ class Calculator { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val sessionSets = computableGroup.sets |
|
|
|
|
|
|
|
|
|
// Compute for each serie |
|
|
|
|
var duration = 0.0 |
|
|
|
|
var hourlyRate = 0.0 |
|
|
|
|
var hourlyRateBB = 0.0 |
|
|
|
|
|
|
|
|
|
var gIndex = 0; |
|
|
|
|
var gSum = 0.0; |
|
|
|
|
var gTotalHands = 0.0; |
|
|
|
|
var gBBSum = 0.0; |
|
|
|
|
sessionSets.forEach { sessionSet -> |
|
|
|
|
gIndex++ |
|
|
|
|
duration += sessionSet.hourlyDuration |
|
|
|
|
gSum += sessionSet.ratedNet |
|
|
|
|
gTotalHands += sessionSet.estimatedHands |
|
|
|
|
gBBSum += sessionSet.bbNetResult |
|
|
|
|
var gHourlyDuration = sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours) |
|
|
|
|
|
|
|
|
|
hourlyRate = gSum / duration |
|
|
|
|
hourlyRateBB = gBBSum / duration |
|
|
|
|
var gSum = sessionSets.sum(SessionSet.Field.RATED_NET.identifier).toDouble() |
|
|
|
|
var gTotalHands = sessionSets.sum(SessionSet.Field.ESTIMATED_HANDS.identifier).toDouble() |
|
|
|
|
var gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() |
|
|
|
|
|
|
|
|
|
var hourlyRate = gSum / gHourlyDuration |
|
|
|
|
// var hourlyRateBB = gBBSum / gDuration |
|
|
|
|
|
|
|
|
|
when (options.evolutionValues) { |
|
|
|
|
Options.EvolutionValues.DATED -> { |
|
|
|
|
results.addEvolutionValue(gSum, duration, NETRESULT) |
|
|
|
|
results.addEvolutionValue(gSum / duration, duration, HOURLY_RATE) |
|
|
|
|
results.addEvolutionValue(hourlyRate, duration, HOURLY_RATE) |
|
|
|
|
results.addEvolutionValue(gIndex.toDouble(), duration, NUMBER_OF_SETS) |
|
|
|
|
results.addEvolutionValue(sessionSet.netDuration.toDouble(), duration, DURATION) |
|
|
|
|
results.addEvolutionValue(duration / gIndex, duration, AVERAGE_DURATION) |
|
|
|
|
results.addEvolutionValue(hourlyRateBB, duration, HOURLY_RATE_BB) |
|
|
|
|
|
|
|
|
|
var tHourlyDuration = 0.0 |
|
|
|
|
var tIndex = 0 |
|
|
|
|
var tSum = 0.0 |
|
|
|
|
var tTotalHands = 0.0 |
|
|
|
|
var tBBSum = 0.0 |
|
|
|
|
var tHourlyRate = 0.0 |
|
|
|
|
var tHourlyRateBB = 0.0 |
|
|
|
|
|
|
|
|
|
sessionSets.forEach { sessionSet -> |
|
|
|
|
tIndex++ |
|
|
|
|
tHourlyDuration += sessionSet.hourlyDuration |
|
|
|
|
tSum += sessionSet.ratedNet |
|
|
|
|
tTotalHands += sessionSet.estimatedHands |
|
|
|
|
tBBSum += sessionSet.bbNetResult |
|
|
|
|
|
|
|
|
|
tHourlyRate = gSum / tHourlyDuration |
|
|
|
|
tHourlyRateBB = gBBSum / tHourlyDuration |
|
|
|
|
|
|
|
|
|
results.addEvolutionValue(tSum, tHourlyDuration, NETRESULT) |
|
|
|
|
results.addEvolutionValue(tSum / tHourlyDuration, tHourlyDuration, HOURLY_RATE) |
|
|
|
|
results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE) |
|
|
|
|
results.addEvolutionValue(tIndex.toDouble(), tHourlyDuration, NUMBER_OF_SETS) |
|
|
|
|
results.addEvolutionValue(sessionSet.netDuration.toDouble(), tHourlyDuration, DURATION) |
|
|
|
|
results.addEvolutionValue(tHourlyDuration / tIndex, tHourlyDuration, AVERAGE_DURATION) |
|
|
|
|
results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB) |
|
|
|
|
|
|
|
|
|
val netBB100 = Stat.netBBPer100Hands(gBBSum, gTotalHands) |
|
|
|
|
if (netBB100 != null) { |
|
|
|
|
results.addEvolutionValue(netBB100, duration, NET_BB_PER_100_HANDS) |
|
|
|
|
results.addEvolutionValue(netBB100, tHourlyDuration, NET_BB_PER_100_HANDS) |
|
|
|
|
} else { //@todo maybe not |
|
|
|
|
results.addEvolutionValue(0.0, duration, NET_BB_PER_100_HANDS) |
|
|
|
|
results.addEvolutionValue(0.0, tHourlyDuration, NET_BB_PER_100_HANDS) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var average = 0.0 |
|
|
|
|
@ -227,7 +237,7 @@ class Calculator { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (sessionSets.size > 0) { |
|
|
|
|
val avgDuration = duration / sessionSets.size |
|
|
|
|
val avgDuration = gHourlyDuration / sessionSets.size |
|
|
|
|
results.addStats( |
|
|
|
|
setOf( |
|
|
|
|
ComputedStat(HOURLY_RATE, hourlyRate), |
|
|
|
|
@ -240,11 +250,11 @@ class Calculator { |
|
|
|
|
results.addStats( |
|
|
|
|
setOf( |
|
|
|
|
ComputedStat(NETRESULT, sum), |
|
|
|
|
ComputedStat(DURATION, duration), |
|
|
|
|
ComputedStat(DURATION, gHourlyDuration), |
|
|
|
|
ComputedStat(NUMBER_OF_SETS, sessionSets.size.toDouble()), |
|
|
|
|
ComputedStat(NUMBER_OF_GAMES, computables.size.toDouble()), |
|
|
|
|
ComputedStat(HOURLY_RATE_BB, bbSum / duration), |
|
|
|
|
ComputedStat(AVERAGE_NET_BB, bbSum / bbSessionCount), |
|
|
|
|
ComputedStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration), |
|
|
|
|
ComputedStat(AVERAGE_NET_BB, gBBSum / bbSessionCount), |
|
|
|
|
ComputedStat(HANDS_PLAYED, totalHands) |
|
|
|
|
|
|
|
|
|
) |
|
|
|
|
|