2014-11-10 14:55:25 -07:00
|
|
|
package lila.analyse
|
|
|
|
|
|
|
|
import lila.game.Pov
|
2017-01-30 09:21:02 -07:00
|
|
|
import lila.tree.Eval._
|
2014-11-10 14:55:25 -07:00
|
|
|
|
|
|
|
object Accuracy {
|
|
|
|
|
2016-11-07 07:34:43 -07:00
|
|
|
private def withSignOf(i: Int, signed: Int) = if (signed < 0) -i else i
|
2014-11-10 14:55:25 -07:00
|
|
|
|
2017-01-30 09:21:02 -07:00
|
|
|
private val makeDiff: PartialFunction[(Option[Cp], Option[Mate], Option[Cp], Option[Mate]), Int] = {
|
2014-11-10 14:55:25 -07:00
|
|
|
case (Some(s1), _, Some(s2), _) => s2.ceiled.centipawns - s1.ceiled.centipawns
|
2017-01-30 09:21:02 -07:00
|
|
|
case (Some(s1), _, _, Some(m2)) => withSignOf(Cp.CEILING, m2.value) - s1.ceiled.centipawns
|
|
|
|
case (_, Some(m1), Some(s2), _) => s2.ceiled.centipawns - withSignOf(Cp.CEILING, m1.value)
|
|
|
|
case (_, Some(m1), _, Some(m2)) => withSignOf(Cp.CEILING, m2.value) - withSignOf(Cp.CEILING, m1.value)
|
2014-11-10 14:55:25 -07:00
|
|
|
}
|
|
|
|
|
2018-01-16 16:33:30 -07:00
|
|
|
case class PovLike(
|
|
|
|
color: chess.Color,
|
|
|
|
startColor: chess.Color,
|
|
|
|
startedAtTurn: Int
|
|
|
|
)
|
|
|
|
|
2020-05-05 22:11:15 -06:00
|
|
|
implicit def povToPovLike(pov: Pov): PovLike =
|
|
|
|
PovLike(
|
|
|
|
color = pov.color,
|
|
|
|
startColor = pov.game.startColor,
|
|
|
|
startedAtTurn = pov.game.chess.startedAtTurn
|
|
|
|
)
|
2018-01-16 16:33:30 -07:00
|
|
|
|
2018-07-20 03:41:46 -06:00
|
|
|
def diffsList(pov: PovLike, analysis: Analysis): List[Int] = {
|
|
|
|
if (pov.color == pov.startColor) Info.start(pov.startedAtTurn) :: analysis.infos
|
|
|
|
else analysis.infos
|
2019-12-13 07:30:20 -07:00
|
|
|
}.grouped(2)
|
|
|
|
.foldLeft(List[Int]()) {
|
|
|
|
case (list, List(i1, i2)) =>
|
|
|
|
makeDiff.lift((i1.cp, i1.mate, i2.cp, i2.mate)).fold(list) { diff =>
|
|
|
|
(if (pov.color.white) -diff else diff).max(0) :: list
|
|
|
|
}
|
|
|
|
case (list, _) => list
|
|
|
|
}
|
|
|
|
.reverse
|
2015-01-06 19:17:22 -07:00
|
|
|
|
2018-01-16 16:33:30 -07:00
|
|
|
def prevColorInfos(pov: PovLike, analysis: Analysis): List[Info] = {
|
2018-07-20 03:41:46 -06:00
|
|
|
if (pov.color == pov.startColor) Info.start(pov.startedAtTurn) :: analysis.infos
|
|
|
|
else analysis.infos
|
|
|
|
}.zipWithIndex.collect {
|
|
|
|
case (e, i) if (i % 2) == 0 => e
|
2015-11-24 04:26:01 -07:00
|
|
|
}
|
|
|
|
|
2018-01-16 16:33:30 -07:00
|
|
|
def mean(pov: PovLike, analysis: Analysis): Option[Int] = {
|
2015-01-06 19:17:22 -07:00
|
|
|
val diffs = diffsList(pov, analysis)
|
2019-12-13 07:30:20 -07:00
|
|
|
val nb = diffs.size
|
2014-11-11 19:36:12 -07:00
|
|
|
(nb != 0) option (diffs.sum / nb)
|
2014-11-10 14:55:25 -07:00
|
|
|
}
|
2018-01-16 16:33:30 -07:00
|
|
|
def mean(pov: Pov, analysis: Analysis): Option[Int] = mean(povToPovLike(pov), analysis)
|
2014-11-10 14:55:25 -07:00
|
|
|
}
|