|
|
|
@ -6,10 +6,10 @@ import net.pokeranalytics.android.calculus.Stat.* |
|
|
|
import net.pokeranalytics.android.exceptions.PAIllegalStateException |
|
|
|
import net.pokeranalytics.android.exceptions.PAIllegalStateException |
|
|
|
import net.pokeranalytics.android.model.Criteria |
|
|
|
import net.pokeranalytics.android.model.Criteria |
|
|
|
import net.pokeranalytics.android.model.combined |
|
|
|
import net.pokeranalytics.android.model.combined |
|
|
|
import net.pokeranalytics.android.model.extensions.hourlyDuration |
|
|
|
|
|
|
|
import net.pokeranalytics.android.model.filter.Query |
|
|
|
import net.pokeranalytics.android.model.filter.Query |
|
|
|
import net.pokeranalytics.android.model.filter.filter |
|
|
|
import net.pokeranalytics.android.model.filter.filter |
|
|
|
import net.pokeranalytics.android.model.realm.* |
|
|
|
import net.pokeranalytics.android.model.realm.* |
|
|
|
|
|
|
|
import net.pokeranalytics.android.model.utils.SessionInterval |
|
|
|
import net.pokeranalytics.android.util.extensions.startOfDay |
|
|
|
import net.pokeranalytics.android.util.extensions.startOfDay |
|
|
|
import timber.log.Timber |
|
|
|
import timber.log.Timber |
|
|
|
import java.util.* |
|
|
|
import java.util.* |
|
|
|
@ -45,8 +45,18 @@ class Calculator { |
|
|
|
filter: Filter? = null, |
|
|
|
filter: Filter? = null, |
|
|
|
aggregationType: AggregationType? = null, |
|
|
|
aggregationType: AggregationType? = null, |
|
|
|
userGenerated: Boolean = false, |
|
|
|
userGenerated: Boolean = false, |
|
|
|
reportSetupId: String? = null) : |
|
|
|
reportSetupId: String? = null |
|
|
|
this(progressValues, stats, criterias, filter?.query ?: Query(), filter?.id, aggregationType, userGenerated, reportSetupId) |
|
|
|
) : |
|
|
|
|
|
|
|
this( |
|
|
|
|
|
|
|
progressValues, |
|
|
|
|
|
|
|
stats, |
|
|
|
|
|
|
|
criterias, |
|
|
|
|
|
|
|
filter?.query ?: Query(), |
|
|
|
|
|
|
|
filter?.id, |
|
|
|
|
|
|
|
aggregationType, |
|
|
|
|
|
|
|
userGenerated, |
|
|
|
|
|
|
|
reportSetupId |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Specifies whether progress values should be added and their kind |
|
|
|
* Specifies whether progress values should be added and their kind |
|
|
|
@ -111,6 +121,7 @@ class Calculator { |
|
|
|
get() { |
|
|
|
get() { |
|
|
|
return this.stats.contains(LOCATIONS_PLAYED) |
|
|
|
return this.stats.contains(LOCATIONS_PLAYED) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Whether the number of days played should be computed |
|
|
|
* Whether the number of days played should be computed |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@ -118,6 +129,7 @@ class Calculator { |
|
|
|
get() { |
|
|
|
get() { |
|
|
|
return this.stats.contains(DAYS_PLAYED) |
|
|
|
return this.stats.contains(DAYS_PLAYED) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Whether progress values should be managed at the group level |
|
|
|
* Whether progress values should be managed at the group level |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@ -167,7 +179,11 @@ class Calculator { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return when (aggregationType) { |
|
|
|
return when (aggregationType) { |
|
|
|
AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups(realm, listOf(group), options) |
|
|
|
AggregationType.SESSION, AggregationType.DURATION -> this.computeGroups( |
|
|
|
|
|
|
|
realm, |
|
|
|
|
|
|
|
listOf(group), |
|
|
|
|
|
|
|
options |
|
|
|
|
|
|
|
) |
|
|
|
AggregationType.MONTH, AggregationType.YEAR -> { |
|
|
|
AggregationType.MONTH, AggregationType.YEAR -> { |
|
|
|
this.computeStats(realm, options) |
|
|
|
this.computeStats(realm, options) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -198,7 +214,11 @@ class Calculator { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Computes all statIds for list of Session sessionGroup |
|
|
|
* Computes all statIds for list of Session sessionGroup |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
fun computeGroups(realm: Realm, groups: List<ComputableGroup>, options: Options = Options()): Report { |
|
|
|
fun computeGroups( |
|
|
|
|
|
|
|
realm: Realm, |
|
|
|
|
|
|
|
groups: List<ComputableGroup>, |
|
|
|
|
|
|
|
options: Options = Options() |
|
|
|
|
|
|
|
): Report { |
|
|
|
|
|
|
|
|
|
|
|
val report = Report(options) |
|
|
|
val report = Report(options) |
|
|
|
for (group in groups) { |
|
|
|
for (group in groups) { |
|
|
|
@ -236,9 +256,14 @@ class Calculator { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* Computes statIds for a SessionSet |
|
|
|
* Computes statIds for a SessionSet |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
fun compute(realm: Realm, computableGroup: ComputableGroup, options: Options = Options()): ComputedResults { |
|
|
|
fun compute( |
|
|
|
|
|
|
|
realm: Realm, |
|
|
|
|
|
|
|
computableGroup: ComputableGroup, |
|
|
|
|
|
|
|
options: Options = Options() |
|
|
|
|
|
|
|
): ComputedResults { |
|
|
|
|
|
|
|
|
|
|
|
val results = ComputedResults(computableGroup, options.shouldManageMultiGroupProgressValues) |
|
|
|
val results = |
|
|
|
|
|
|
|
ComputedResults(computableGroup, options.shouldManageMultiGroupProgressValues) |
|
|
|
|
|
|
|
|
|
|
|
val computables = computableGroup.computables(realm, options.shouldSortValues) |
|
|
|
val computables = computableGroup.computables(realm, options.shouldSortValues) |
|
|
|
|
|
|
|
|
|
|
|
@ -252,32 +277,39 @@ class Calculator { |
|
|
|
// Timber.d("$$$ buyin = ${it.ratedBuyin} $$$ net result = ${it.ratedNet}") |
|
|
|
// Timber.d("$$$ buyin = ${it.ratedBuyin} $$$ net result = ${it.ratedNet}") |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
val d1 = Date() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var ratedNet = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble() |
|
|
|
var ratedNet = computables.sum(ComputableResult.Field.RATED_NET.identifier).toDouble() |
|
|
|
if (options.includedTransactions.isNotEmpty()) { |
|
|
|
if (options.includedTransactions.isNotEmpty()) { |
|
|
|
for (transactionType in options.includedTransactions) { |
|
|
|
for (transactionType in options.includedTransactions) { |
|
|
|
val transactions = computableGroup.transactions(realm, transactionType, options.shouldSortValues) |
|
|
|
val transactions = computableGroup.transactions( |
|
|
|
val transactionRatedAmount = transactions.sum(Transaction.Field.RATED_AMOUNT.identifier).toDouble() |
|
|
|
realm, |
|
|
|
|
|
|
|
transactionType, |
|
|
|
|
|
|
|
options.shouldSortValues |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
val transactionRatedAmount = |
|
|
|
|
|
|
|
transactions.sum(Transaction.Field.RATED_AMOUNT.identifier).toDouble() |
|
|
|
ratedNet += transactionRatedAmount |
|
|
|
ratedNet += transactionRatedAmount |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
results.addStat(NET_RESULT, ratedNet) |
|
|
|
results.addStat(NET_RESULT, ratedNet) |
|
|
|
|
|
|
|
|
|
|
|
val totalHands = computables.sum(ComputableResult.Field.ESTIMATED_HANDS.identifier).toDouble() |
|
|
|
val totalHands = |
|
|
|
|
|
|
|
computables.sum(ComputableResult.Field.ESTIMATED_HANDS.identifier).toDouble() |
|
|
|
results.addStat(HANDS_PLAYED, totalHands) |
|
|
|
results.addStat(HANDS_PLAYED, totalHands) |
|
|
|
|
|
|
|
|
|
|
|
val bbSum = computables.sum(ComputableResult.Field.BB_NET.identifier).toDouble() |
|
|
|
val bbSum = computables.sum(ComputableResult.Field.BB_NET.identifier).toDouble() |
|
|
|
results.addStat(BB_NET_RESULT, bbSum) |
|
|
|
results.addStat(BB_NET_RESULT, bbSum) |
|
|
|
|
|
|
|
|
|
|
|
val bbSessionCount = computables.sum(ComputableResult.Field.HAS_BIG_BLIND.identifier).toInt() |
|
|
|
val bbSessionCount = |
|
|
|
|
|
|
|
computables.sum(ComputableResult.Field.HAS_BIG_BLIND.identifier).toInt() |
|
|
|
results.addStat(BB_SESSION_COUNT, bbSessionCount.toDouble()) |
|
|
|
results.addStat(BB_SESSION_COUNT, bbSessionCount.toDouble()) |
|
|
|
|
|
|
|
|
|
|
|
val winningSessionCount = computables.sum(ComputableResult.Field.IS_POSITIVE.identifier).toInt() |
|
|
|
val winningSessionCount = |
|
|
|
|
|
|
|
computables.sum(ComputableResult.Field.IS_POSITIVE.identifier).toInt() |
|
|
|
results.addStat(WINNING_SESSION_COUNT, winningSessionCount.toDouble()) |
|
|
|
results.addStat(WINNING_SESSION_COUNT, winningSessionCount.toDouble()) |
|
|
|
|
|
|
|
|
|
|
|
val totalBuyin = computables.sum(ComputableResult.Field.RATED_BUYIN.identifier).toDouble() |
|
|
|
val totalBuyin = |
|
|
|
|
|
|
|
computables.sum(ComputableResult.Field.RATED_BUYIN.identifier).toDouble() |
|
|
|
results.addStat(TOTAL_BUYIN, totalBuyin) |
|
|
|
results.addStat(TOTAL_BUYIN, totalBuyin) |
|
|
|
|
|
|
|
|
|
|
|
val totalTips = computables.sum(ComputableResult.Field.RATED_TIPS.identifier).toDouble() |
|
|
|
val totalTips = computables.sum(ComputableResult.Field.RATED_TIPS.identifier).toDouble() |
|
|
|
@ -285,12 +317,14 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
|
|
// Timber.d("########## totalBuyin = ${totalBuyin} ### sum = ${sum}") |
|
|
|
// Timber.d("########## totalBuyin = ${totalBuyin} ### sum = ${sum}") |
|
|
|
|
|
|
|
|
|
|
|
val maxNetResult = computables.max(ComputableResult.Field.RATED_NET.identifier)?.toDouble() |
|
|
|
val maxNetResult = |
|
|
|
|
|
|
|
computables.max(ComputableResult.Field.RATED_NET.identifier)?.toDouble() |
|
|
|
maxNetResult?.let { |
|
|
|
maxNetResult?.let { |
|
|
|
results.addStat(MAXIMUM_NET_RESULT, it) |
|
|
|
results.addStat(MAXIMUM_NET_RESULT, it) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val minNetResult = computables.min(ComputableResult.Field.RATED_NET.identifier)?.toDouble() |
|
|
|
val minNetResult = |
|
|
|
|
|
|
|
computables.min(ComputableResult.Field.RATED_NET.identifier)?.toDouble() |
|
|
|
minNetResult?.let { |
|
|
|
minNetResult?.let { |
|
|
|
results.addStat(MINIMUM_NET_RESULT, it) |
|
|
|
results.addStat(MINIMUM_NET_RESULT, it) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -310,7 +344,10 @@ class Calculator { |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
if (options.computeLocationsPlayed) { |
|
|
|
if (options.computeLocationsPlayed) { |
|
|
|
results.addStat(LOCATIONS_PLAYED, computables.distinctBy { it.session?.location?.id }.size.toDouble()) |
|
|
|
results.addStat( |
|
|
|
|
|
|
|
LOCATIONS_PLAYED, |
|
|
|
|
|
|
|
computables.distinctBy { it.session?.location?.id }.size.toDouble() |
|
|
|
|
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var average = 0.0 // also used for standard deviation later |
|
|
|
var average = 0.0 // also used for standard deviation later |
|
|
|
@ -334,7 +371,6 @@ class Calculator { |
|
|
|
averageBB = bbSum / bbSessionCount |
|
|
|
averageBB = bbSum / bbSessionCount |
|
|
|
results.addStat(AVERAGE_NET_BB, averageBB) |
|
|
|
results.addStat(AVERAGE_NET_BB, averageBB) |
|
|
|
} |
|
|
|
} |
|
|
|
val d2 = Date() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val shouldIterateOverComputables = |
|
|
|
val shouldIterateOverComputables = |
|
|
|
(options.progressValues == Options.ProgressValues.STANDARD || options.computeLongestStreak) |
|
|
|
(options.progressValues == Options.ProgressValues.STANDARD || options.computeLongestStreak) |
|
|
|
@ -381,11 +417,20 @@ class Calculator { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val session = |
|
|
|
val session = |
|
|
|
computable.session ?: throw PAIllegalStateException("Computing lone ComputableResult") |
|
|
|
computable.session |
|
|
|
|
|
|
|
?: throw PAIllegalStateException("Computing lone ComputableResult") |
|
|
|
results.addEvolutionValue(tSum, stat = NET_RESULT, data = session) |
|
|
|
results.addEvolutionValue(tSum, stat = NET_RESULT, data = session) |
|
|
|
results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) |
|
|
|
results.addEvolutionValue(tSum / index, stat = AVERAGE, data = session) |
|
|
|
results.addEvolutionValue(index.toDouble(), stat = NUMBER_OF_GAMES, data = session) |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue(tBBSum / tBBSessionCount, stat = AVERAGE_NET_BB, data = session) |
|
|
|
index.toDouble(), |
|
|
|
|
|
|
|
stat = NUMBER_OF_GAMES, |
|
|
|
|
|
|
|
data = session |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
tBBSum / tBBSessionCount, |
|
|
|
|
|
|
|
stat = AVERAGE_NET_BB, |
|
|
|
|
|
|
|
data = session |
|
|
|
|
|
|
|
) |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue( |
|
|
|
(tWinningSessionCount.toDouble() / index.toDouble()), |
|
|
|
(tWinningSessionCount.toDouble() / index.toDouble()), |
|
|
|
stat = WIN_RATIO, |
|
|
|
stat = WIN_RATIO, |
|
|
|
@ -394,12 +439,25 @@ class Calculator { |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue( |
|
|
|
tITMCount.toDouble() / index.toDouble(), |
|
|
|
tITMCount.toDouble() / index.toDouble(), |
|
|
|
stat = TOURNAMENT_ITM_RATIO, |
|
|
|
stat = TOURNAMENT_ITM_RATIO, |
|
|
|
data = session) |
|
|
|
data = session |
|
|
|
results.addEvolutionValue(tBuyinSum / index, stat = AVERAGE_BUYIN, data = session) |
|
|
|
) |
|
|
|
results.addEvolutionValue(computable.ratedNet, stat = STANDARD_DEVIATION, data = session) |
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
tBuyinSum / index, |
|
|
|
|
|
|
|
stat = AVERAGE_BUYIN, |
|
|
|
|
|
|
|
data = session |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
computable.ratedNet, |
|
|
|
|
|
|
|
stat = STANDARD_DEVIATION, |
|
|
|
|
|
|
|
data = session |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> |
|
|
|
Stat.netBBPer100Hands(tBBSum, tHands)?.let { netBB100 -> |
|
|
|
results.addEvolutionValue(netBB100, stat = NET_BB_PER_100_HANDS, data = session) |
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
netBB100, |
|
|
|
|
|
|
|
stat = NET_BB_PER_100_HANDS, |
|
|
|
|
|
|
|
data = session |
|
|
|
|
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Stat.returnOnInvestment(tSum, tBuyinSum)?.let { roi -> |
|
|
|
Stat.returnOnInvestment(tSum, tBuyinSum)?.let { roi -> |
|
|
|
@ -415,32 +473,34 @@ class Calculator { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// loseStreak is negative and we want it positive |
|
|
|
// loseStreak is negative and we want it positive |
|
|
|
results.addStat(LONGEST_STREAKS, longestWinStreak.toDouble(), -longestLoseStreak.toDouble()) |
|
|
|
results.addStat( |
|
|
|
|
|
|
|
LONGEST_STREAKS, |
|
|
|
|
|
|
|
longestWinStreak.toDouble(), |
|
|
|
|
|
|
|
-longestLoseStreak.toDouble() |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val d3 = Date() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val sessionSets = computableGroup.sessionSets(realm, options.shouldSortValues) |
|
|
|
val sessionSets = computableGroup.sessionSets(realm, options.shouldSortValues) |
|
|
|
results.addStat(NUMBER_OF_SETS, sessionSets.size.toDouble()) |
|
|
|
results.addStat(NUMBER_OF_SETS, sessionSets.size.toDouble()) |
|
|
|
|
|
|
|
|
|
|
|
var gHourlyDuration: Double? = null |
|
|
|
// var gHourlyDuration: Double? = null |
|
|
|
var gBBSum: Double? = null |
|
|
|
//// var gBBSum: Double? = null |
|
|
|
var maxDuration: Double? = null |
|
|
|
var maxDuration: Double? = null |
|
|
|
|
|
|
|
|
|
|
|
if (computableGroup.conditions.isEmpty()) { // SessionSets are fine |
|
|
|
if (computableGroup.conditions.isEmpty()) { // SessionSets are fine |
|
|
|
gHourlyDuration = |
|
|
|
// gHourlyDuration = |
|
|
|
sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours) |
|
|
|
// sessionSets.sum(SessionSet.Field.NET_DURATION.identifier).toDouble() / 3600000 // (milliseconds to hours) |
|
|
|
gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() |
|
|
|
// gBBSum = sessionSets.sum(SessionSet.Field.BB_NET.identifier).toDouble() |
|
|
|
|
|
|
|
|
|
|
|
sessionSets.max(SessionSet.Field.NET_DURATION.identifier)?.let { |
|
|
|
sessionSets.max(SessionSet.Field.NET_DURATION.identifier)?.let { |
|
|
|
maxDuration = it.toDouble() / 3600000 |
|
|
|
maxDuration = it.toDouble() / 3600000 |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val shouldIterateOverSets = computableGroup.conditions.isNotEmpty() |
|
|
|
val shouldIterateOverSets = options.progressValues != Options.ProgressValues.NONE |
|
|
|
|| options.progressValues != Options.ProgressValues.NONE |
|
|
|
|
|
|
|
|| options.computeDaysPlayed |
|
|
|
|| options.computeDaysPlayed |
|
|
|
|
|
|
|
// || computableGroup.conditions.isNotEmpty() |
|
|
|
|
|
|
|
|
|
|
|
// Session Set |
|
|
|
// Session Set |
|
|
|
if (shouldIterateOverSets) { |
|
|
|
if (shouldIterateOverSets) { |
|
|
|
@ -464,7 +524,7 @@ class Calculator { |
|
|
|
tBBSum += setStats.bbSum |
|
|
|
tBBSum += setStats.bbSum |
|
|
|
tHourlyDuration += setStats.hourlyDuration |
|
|
|
tHourlyDuration += setStats.hourlyDuration |
|
|
|
tTotalHands += setStats.estimatedHands |
|
|
|
tTotalHands += setStats.estimatedHands |
|
|
|
tMaxDuration = max(tMaxDuration, setStats.hourlyDuration) |
|
|
|
tMaxDuration = max(tMaxDuration, setStats.hourlyDuration.toDouble()) |
|
|
|
|
|
|
|
|
|
|
|
tHourlyRate = tRatedNetSum / tHourlyDuration |
|
|
|
tHourlyRate = tRatedNetSum / tHourlyDuration |
|
|
|
tHourlyRateBB = tBBSum / tHourlyDuration |
|
|
|
tHourlyRateBB = tBBSum / tHourlyDuration |
|
|
|
@ -472,8 +532,16 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
|
|
when (options.progressValues) { |
|
|
|
when (options.progressValues) { |
|
|
|
Options.ProgressValues.STANDARD -> { |
|
|
|
Options.ProgressValues.STANDARD -> { |
|
|
|
results.addEvolutionValue(tHourlyRate, stat = HOURLY_RATE, data = sessionSet) |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue(tIndex.toDouble(), stat = NUMBER_OF_SETS, data = sessionSet) |
|
|
|
tHourlyRate, |
|
|
|
|
|
|
|
stat = HOURLY_RATE, |
|
|
|
|
|
|
|
data = sessionSet |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
tIndex.toDouble(), |
|
|
|
|
|
|
|
stat = NUMBER_OF_SETS, |
|
|
|
|
|
|
|
data = sessionSet |
|
|
|
|
|
|
|
) |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue( |
|
|
|
sessionSet.hourlyDuration, |
|
|
|
sessionSet.hourlyDuration, |
|
|
|
tHourlyDuration, |
|
|
|
tHourlyDuration, |
|
|
|
@ -485,12 +553,26 @@ class Calculator { |
|
|
|
stat = AVERAGE_HOURLY_DURATION, |
|
|
|
stat = AVERAGE_HOURLY_DURATION, |
|
|
|
data = sessionSet |
|
|
|
data = sessionSet |
|
|
|
) |
|
|
|
) |
|
|
|
results.addEvolutionValue(tHourlyRateBB, stat = HOURLY_RATE_BB, data = sessionSet) |
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
tHourlyRateBB, |
|
|
|
|
|
|
|
stat = HOURLY_RATE_BB, |
|
|
|
|
|
|
|
data = sessionSet |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
Options.ProgressValues.TIMED -> { |
|
|
|
Options.ProgressValues.TIMED -> { |
|
|
|
results.addEvolutionValue(tRatedNetSum, tHourlyDuration, NET_RESULT, sessionSet) |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue(tHourlyRate, tHourlyDuration, HOURLY_RATE, sessionSet) |
|
|
|
tRatedNetSum, |
|
|
|
|
|
|
|
tHourlyDuration, |
|
|
|
|
|
|
|
NET_RESULT, |
|
|
|
|
|
|
|
sessionSet |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
tHourlyRate, |
|
|
|
|
|
|
|
tHourlyDuration, |
|
|
|
|
|
|
|
HOURLY_RATE, |
|
|
|
|
|
|
|
sessionSet |
|
|
|
|
|
|
|
) |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue( |
|
|
|
tIndex.toDouble(), |
|
|
|
tIndex.toDouble(), |
|
|
|
tHourlyDuration, |
|
|
|
tHourlyDuration, |
|
|
|
@ -509,7 +591,12 @@ class Calculator { |
|
|
|
AVERAGE_HOURLY_DURATION, |
|
|
|
AVERAGE_HOURLY_DURATION, |
|
|
|
sessionSet |
|
|
|
sessionSet |
|
|
|
) |
|
|
|
) |
|
|
|
results.addEvolutionValue(tHourlyRateBB, tHourlyDuration, HOURLY_RATE_BB, sessionSet) |
|
|
|
results.addEvolutionValue( |
|
|
|
|
|
|
|
tHourlyRateBB, |
|
|
|
|
|
|
|
tHourlyDuration, |
|
|
|
|
|
|
|
HOURLY_RATE_BB, |
|
|
|
|
|
|
|
sessionSet |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
Stat.netBBPer100Hands(tBBSum, tTotalHands)?.let { netBB100 -> |
|
|
|
Stat.netBBPer100Hands(tBBSum, tTotalHands)?.let { netBB100 -> |
|
|
|
results.addEvolutionValue( |
|
|
|
results.addEvolutionValue( |
|
|
|
@ -529,32 +616,44 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
gHourlyDuration = tHourlyDuration |
|
|
|
// gHourlyDuration = tHourlyDuration |
|
|
|
gBBSum = tBBSum |
|
|
|
// gBBSum = tBBSum |
|
|
|
maxDuration = tMaxDuration |
|
|
|
maxDuration = tMaxDuration |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
val d4 = Date() |
|
|
|
// var hourlyRate = 0.0 |
|
|
|
|
|
|
|
// if (gHourlyDuration != null) { |
|
|
|
|
|
|
|
// |
|
|
|
|
|
|
|
// hourlyRate = ratedNet / gHourlyDuration |
|
|
|
|
|
|
|
// if (sessionSets.size > 0) { |
|
|
|
|
|
|
|
// val avgDuration = gHourlyDuration / sessionSets.size |
|
|
|
|
|
|
|
// results.addStat(HOURLY_RATE, hourlyRate) |
|
|
|
|
|
|
|
// results.addStat(AVERAGE_HOURLY_DURATION, avgDuration) |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// results.addStat(HOURLY_DURATION, gHourlyDuration) |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val timeIntervals = computableGroup.timeIntervals(realm) |
|
|
|
|
|
|
|
val duration = timeIntervals.sum("duration").toDouble() |
|
|
|
|
|
|
|
val breakDuration = sessionSets.sum("breakDuration").toDouble() |
|
|
|
|
|
|
|
|
|
|
|
var hourlyRate = 0.0 |
|
|
|
val netHourlyDuration = (duration - breakDuration) / 3600000 |
|
|
|
if (gHourlyDuration != null) { |
|
|
|
val hourlyRate = ratedNet / netHourlyDuration |
|
|
|
|
|
|
|
|
|
|
|
hourlyRate = ratedNet / gHourlyDuration |
|
|
|
|
|
|
|
if (sessionSets.size > 0) { |
|
|
|
|
|
|
|
val avgDuration = gHourlyDuration / sessionSets.size |
|
|
|
|
|
|
|
results.addStat(HOURLY_RATE, hourlyRate) |
|
|
|
results.addStat(HOURLY_RATE, hourlyRate) |
|
|
|
results.addStat(AVERAGE_HOURLY_DURATION, avgDuration) |
|
|
|
results.addStat(AVERAGE_HOURLY_DURATION, netHourlyDuration / sessionSets.size) |
|
|
|
} |
|
|
|
results.addStat(HOURLY_DURATION, netHourlyDuration) |
|
|
|
results.addStat(HOURLY_DURATION, gHourlyDuration) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (gBBSum != null) { |
|
|
|
results.addStat(HOURLY_RATE_BB, bbSum / netHourlyDuration) |
|
|
|
if (gHourlyDuration != null) { |
|
|
|
results.addStat(AVERAGE_NET_BB, bbSum / bbSessionCount) |
|
|
|
results.addStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration) |
|
|
|
|
|
|
|
} |
|
|
|
// if (gBBSum != null) { |
|
|
|
results.addStat(AVERAGE_NET_BB, gBBSum / bbSessionCount) |
|
|
|
// if (gHourlyDuration != null) { |
|
|
|
} |
|
|
|
// results.addStat(HOURLY_RATE_BB, gBBSum / gHourlyDuration) |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// results.addStat(AVERAGE_NET_BB, gBBSum / bbSessionCount) |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
maxDuration?.let { maxd -> |
|
|
|
maxDuration?.let { maxd -> |
|
|
|
results.addStat(MAXIMUM_DURATION, maxd) // (milliseconds to hours) |
|
|
|
results.addStat(MAXIMUM_DURATION, maxd) // (milliseconds to hours) |
|
|
|
@ -568,45 +667,31 @@ class Calculator { |
|
|
|
// Session |
|
|
|
// Session |
|
|
|
var stdSum = 0.0 |
|
|
|
var stdSum = 0.0 |
|
|
|
var stdBBSum = 0.0 |
|
|
|
var stdBBSum = 0.0 |
|
|
|
var stdBBper100HandsSum = 0.0 |
|
|
|
var stdBBPer100HandsSum = 0.0 |
|
|
|
for (computable in computables) { |
|
|
|
for (computable in computables) { |
|
|
|
stdSum += (computable.ratedNet - average).pow(2.0) |
|
|
|
stdSum += (computable.ratedNet - average).pow(2.0) |
|
|
|
stdBBSum += (computable.bbNet - averageBB).pow(2.0) |
|
|
|
stdBBSum += (computable.bbNet - averageBB).pow(2.0) |
|
|
|
stdBBper100HandsSum += (computable.bbPer100Hands - bbPer100Hands).pow(2.0) |
|
|
|
stdBBPer100HandsSum += (computable.bbPer100Hands - bbPer100Hands).pow(2.0) |
|
|
|
} |
|
|
|
} |
|
|
|
val standardDeviation = sqrt(stdSum / computables.size) |
|
|
|
val standardDeviation = sqrt(stdSum / computables.size) |
|
|
|
val standardDeviationBB = sqrt(stdBBSum / computables.size) |
|
|
|
val standardDeviationBB = sqrt(stdBBSum / computables.size) |
|
|
|
val standardDeviationBBper100Hands = sqrt(stdBBper100HandsSum / computables.size) |
|
|
|
val standardDeviationBBper100Hands = sqrt(stdBBPer100HandsSum / computables.size) |
|
|
|
|
|
|
|
|
|
|
|
results.addStat(STANDARD_DEVIATION, standardDeviation) |
|
|
|
results.addStat(STANDARD_DEVIATION, standardDeviation) |
|
|
|
results.addStat(STANDARD_DEVIATION_BB, standardDeviationBB) |
|
|
|
results.addStat(STANDARD_DEVIATION_BB, standardDeviationBB) |
|
|
|
results.addStat(STANDARD_DEVIATION_BB_PER_100_HANDS, standardDeviationBBper100Hands) |
|
|
|
results.addStat(STANDARD_DEVIATION_BB_PER_100_HANDS, standardDeviationBBper100Hands) |
|
|
|
|
|
|
|
|
|
|
|
// Session Set |
|
|
|
// Session Set |
|
|
|
if (gHourlyDuration != null) { |
|
|
|
|
|
|
|
var hourlyStdSum = 0.0 |
|
|
|
var hourlyStdSum = 0.0 |
|
|
|
for (set in sessionSets) { |
|
|
|
for (set in sessionSets) { |
|
|
|
val ssStats = SSStats(set, computableGroup.query) |
|
|
|
val ssStats = SSStats(set, computableGroup.query) |
|
|
|
val sHourlyRate = ssStats.hourlyRate |
|
|
|
val setHourlyRate = ssStats.hourlyRate |
|
|
|
hourlyStdSum += (sHourlyRate - hourlyRate).pow(2.0) |
|
|
|
hourlyStdSum += (setHourlyRate - hourlyRate).pow(2.0) |
|
|
|
} |
|
|
|
} |
|
|
|
val hourlyStandardDeviation = sqrt(hourlyStdSum / sessionSets.size) |
|
|
|
val hourlyStandardDeviation = sqrt(hourlyStdSum / sessionSets.size) |
|
|
|
|
|
|
|
|
|
|
|
results.addStat(STANDARD_DEVIATION_HOURLY, hourlyStandardDeviation) |
|
|
|
results.addStat(STANDARD_DEVIATION_HOURLY, hourlyStandardDeviation) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
val d5 = Date() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val s1 = d2.time - d1.time |
|
|
|
|
|
|
|
val s2 = d3.time - d2.time |
|
|
|
|
|
|
|
val s3 = d4.time - d3.time |
|
|
|
|
|
|
|
val s4 = d5.time - d4.time |
|
|
|
|
|
|
|
Timber.d("Section 1 = $s1") |
|
|
|
|
|
|
|
Timber.d("Section 2 = $s2") |
|
|
|
|
|
|
|
Timber.d("Section 3 = $s3") |
|
|
|
|
|
|
|
Timber.d("Section 4 = $s4") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return results |
|
|
|
return results |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -616,14 +701,18 @@ class Calculator { |
|
|
|
|
|
|
|
|
|
|
|
class SSStats(sessionSet: SessionSet, query: Query) { // Session Set Stats |
|
|
|
class SSStats(sessionSet: SessionSet, query: Query) { // Session Set Stats |
|
|
|
|
|
|
|
|
|
|
|
var hourlyDuration: Double = 0.0 |
|
|
|
var hourlyDuration: Long = 0L |
|
|
|
var estimatedHands: Double = 0.0 |
|
|
|
var estimatedHands: Double = 0.0 |
|
|
|
var bbSum: Double = 0.0 |
|
|
|
var bbSum: Double = 0.0 |
|
|
|
var ratedNet: Double = 0.0 |
|
|
|
var ratedNet: Double = 0.0 |
|
|
|
|
|
|
|
|
|
|
|
val hourlyRate: Double |
|
|
|
val hourlyRate: Double |
|
|
|
get() { |
|
|
|
get() { |
|
|
|
return this.ratedNet / this.hourlyDuration |
|
|
|
return if (this.hourlyDuration > 0L) { |
|
|
|
|
|
|
|
this.ratedNet / this.hourlyDuration.toDouble() |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
0.0 |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
init { |
|
|
|
init { |
|
|
|
@ -636,10 +725,15 @@ class SSStats(sessionSet: SessionSet, query: Query) { // Session Set Stats |
|
|
|
if (setSessions.size == filteredSessions.size) { |
|
|
|
if (setSessions.size == filteredSessions.size) { |
|
|
|
this.initStatsWithSet(sessionSet) |
|
|
|
this.initStatsWithSet(sessionSet) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
|
|
ratedNet = filteredSessions.sumOf { it.computableResult?.ratedNet ?: 0.0 } |
|
|
|
ratedNet = filteredSessions.sumOf { it.computableResult?.ratedNet ?: 0.0 } |
|
|
|
bbSum = filteredSessions.sumOf { it.bbNet } |
|
|
|
bbSum = filteredSessions.sumOf { it.bbNet } |
|
|
|
hourlyDuration = filteredSessions.hourlyDuration |
|
|
|
|
|
|
|
estimatedHands = filteredSessions.sumOf { it.estimatedHands } |
|
|
|
estimatedHands = filteredSessions.sumOf { it.estimatedHands } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
val intervals = SessionInterval.intervalMap(filteredSessions.toSet()) |
|
|
|
|
|
|
|
val netDuration = intervals.sumOf { it.duration } |
|
|
|
|
|
|
|
val estimatedBreak = if (netDuration > 0.0) sessionSet.breakDuration * sessionSet.netDuration / netDuration else 0L |
|
|
|
|
|
|
|
hourlyDuration = netDuration - estimatedBreak |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -647,7 +741,7 @@ class SSStats(sessionSet: SessionSet, query: Query) { // Session Set Stats |
|
|
|
private fun initStatsWithSet(sessionSet: SessionSet) { |
|
|
|
private fun initStatsWithSet(sessionSet: SessionSet) { |
|
|
|
ratedNet = sessionSet.ratedNet |
|
|
|
ratedNet = sessionSet.ratedNet |
|
|
|
bbSum = sessionSet.bbNet |
|
|
|
bbSum = sessionSet.bbNet |
|
|
|
hourlyDuration = sessionSet.hourlyDuration |
|
|
|
hourlyDuration = sessionSet.hourlyDuration.toLong() |
|
|
|
estimatedHands = sessionSet.estimatedHands |
|
|
|
estimatedHands = sessionSet.estimatedHands |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|