Skip to content

Commit

Permalink
remove puzzle spaced repetition - closes lichess-org#3112
Browse files Browse the repository at this point in the history
  • Loading branch information
ornicar committed Jul 9, 2017
1 parent 3ff4238 commit badb7ab
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 123 deletions.
1 change: 0 additions & 1 deletion conf/base.conf
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ puzzle {
collection {
puzzle = puzzle
round = puzzle_round
learning = puzzle_learning
vote = puzzle_vote
head = puzzle_head
}
Expand Down
3 changes: 0 additions & 3 deletions modules/puzzle/src/main/Env.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ final class Env(
private val settings = new {
val CollectionPuzzle = config getString "collection.puzzle"
val CollectionRound = config getString "collection.round"
val CollectionLearning = config getString "collection.learning"
val CollectionVote = config getString "collection.vote"
val CollectionHead = config getString "collection.head"
val ApiToken = config getString "api.token"
Expand All @@ -38,7 +37,6 @@ final class Env(
lazy val api = new PuzzleApi(
puzzleColl = puzzleColl,
roundColl = roundColl,
learningColl = learningColl,
voteColl = voteColl,
headColl = headColl,
puzzleIdMin = PuzzleIdMin,
Expand Down Expand Up @@ -78,7 +76,6 @@ final class Env(

private[puzzle] lazy val puzzleColl = db(CollectionPuzzle)
private[puzzle] lazy val roundColl = db(CollectionRound)
private[puzzle] lazy val learningColl = db(CollectionLearning)
private[puzzle] lazy val voteColl = db(CollectionVote)
private[puzzle] lazy val headColl = db(CollectionHead)
}
Expand Down
57 changes: 25 additions & 32 deletions modules/puzzle/src/main/Finisher.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,32 +16,30 @@ private[puzzle] final class Finisher(
def apply(puzzle: Puzzle, user: User, result: Result): Fu[(Round, Mode)] =
api.head.find(user) flatMap {
case Some(PuzzleHead(_, Some(c), _)) if c == puzzle.id =>
api.head.solved(user, puzzle.id) >>
api.learning.update(user, puzzle, result).flatMap { isLearning =>
val userRating = user.perfs.puzzle.toRating
val puzzleRating = puzzle.perf.toRating
updateRatings(userRating, puzzleRating,
result = result.win.fold(Glicko.Result.Win, Glicko.Result.Loss),
isLearning = isLearning)
val date = DateTime.now
val puzzlePerf = puzzle.perf.addOrReset(_.puzzle.crazyGlicko, s"puzzle ${puzzle.id} user")(puzzleRating)
val userPerf = user.perfs.puzzle.addOrReset(_.puzzle.crazyGlicko, s"puzzle ${puzzle.id}")(userRating, date)
val a = new Round(
puzzleId = puzzle.id,
userId = user.id,
date = date,
result = result,
rating = user.perfs.puzzle.intRating,
ratingDiff = userPerf.intRating - user.perfs.puzzle.intRating
)
(api.round add a) >> {
puzzleColl.update(
$id(puzzle.id),
$inc(Puzzle.BSONFields.attempts -> $int(1)) ++
$set(Puzzle.BSONFields.perf -> PuzzlePerf.puzzlePerfBSONHandler.write(puzzlePerf))
) zip UserRepo.setPerf(user.id, PerfType.Puzzle, userPerf)
} inject (a -> Mode.Rated)
}
api.head.solved(user, puzzle.id) >> {
val userRating = user.perfs.puzzle.toRating
val puzzleRating = puzzle.perf.toRating
updateRatings(userRating, puzzleRating,
result = result.win.fold(Glicko.Result.Win, Glicko.Result.Loss))
val date = DateTime.now
val puzzlePerf = puzzle.perf.addOrReset(_.puzzle.crazyGlicko, s"puzzle ${puzzle.id} user")(puzzleRating)
val userPerf = user.perfs.puzzle.addOrReset(_.puzzle.crazyGlicko, s"puzzle ${puzzle.id}")(userRating, date)
val a = new Round(
puzzleId = puzzle.id,
userId = user.id,
date = date,
result = result,
rating = user.perfs.puzzle.intRating,
ratingDiff = userPerf.intRating - user.perfs.puzzle.intRating
)
(api.round add a) >> {
puzzleColl.update(
$id(puzzle.id),
$inc(Puzzle.BSONFields.attempts -> $int(1)) ++
$set(Puzzle.BSONFields.perf -> PuzzlePerf.puzzlePerfBSONHandler.write(puzzlePerf))
) zip UserRepo.setPerf(user.id, PerfType.Puzzle, userPerf)
} inject (a -> Mode.Rated)
}
case _ =>
incPuzzleAttempts(puzzle)
val a = new Round(
Expand All @@ -62,7 +60,7 @@ private[puzzle] final class Finisher(
def incPuzzleAttempts(puzzle: Puzzle) =
puzzleColl.incFieldUnchecked($id(puzzle.id), Puzzle.BSONFields.attempts)

private def updateRatings(u1: Rating, u2: Rating, result: Glicko.Result, isLearning: Boolean) {
private def updateRatings(u1: Rating, u2: Rating, result: Glicko.Result) {
val results = new RatingPeriodResults()
result match {
case Glicko.Result.Draw => results.addDraw(u1, u2)
Expand All @@ -72,11 +70,6 @@ private[puzzle] final class Finisher(
try {
val (r1, r2) = (u1.getRating, u2.getRating)
system.updateRatings(results)
if (isLearning) {
def mitigate(prev: Double, next: Rating) = next.setRating((next.getRating + prev) / 2)
mitigate(r1, u1)
mitigate(r2, u2)
}
// never take away more than 30 rating points - it just causes upsets
List(r1 -> u1, r2 -> u2).foreach {
case (prev, next) if next.getRating - prev < -30 => next.setRating(prev - 30)
Expand Down
35 changes: 0 additions & 35 deletions modules/puzzle/src/main/Learning.scala

This file was deleted.

43 changes: 1 addition & 42 deletions modules/puzzle/src/main/PuzzleApi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import Puzzle.{ BSONFields => F }
private[puzzle] final class PuzzleApi(
puzzleColl: Coll,
roundColl: Coll,
learningColl: Coll,
voteColl: Coll,
headColl: Coll,
puzzleIdMin: PuzzleId,
Expand Down Expand Up @@ -78,36 +77,6 @@ private[puzzle] final class PuzzleApi(
def add(a: Round) = roundColl insert a void
}

object learning {

private implicit val learningBSONHandler = reactivemongo.bson.Macros.handler[Learning]

def find(user: User): Fu[Option[Learning]] = learningColl.byId[Learning](user.id)

def add(l: Learning) = learningColl insert l void

def update(user: User, puzzle: Puzzle, result: Result): Fu[Boolean] =
if (result.win) solved(user, puzzle.id)
else failed(user, puzzle.id)

def solved(user: User, puzzleId: PuzzleId): Fu[Boolean] = learning find user flatMap {
case None => fuccess(false)
case Some(l) =>
learningColl.update($id(l.id), l solved puzzleId) inject l.contains(puzzleId)
}

def failed(user: User, puzzleId: PuzzleId): Fu[Boolean] = learning find user flatMap {
case None => learning add Learning(user.id, List(puzzleId), List()) inject false
case Some(l) =>
learningColl.update($id(l.id), l failed puzzleId) inject l.contains(puzzleId)
}

def nextPuzzle(user: User): Fu[Option[Puzzle]] = learning find user flatMap {
case None => fuccess(none)
case Some(l) => l.nextPuzzleId ?? puzzle.find
}
}

object vote {

def value(id: PuzzleId, user: User): Fu[Option[Boolean]] =
Expand Down Expand Up @@ -146,17 +115,7 @@ private[puzzle] final class PuzzleApi(

def find(user: User): Fu[Option[PuzzleHead]] = headColl.byId[PuzzleHead](user.id)

def add(h: PuzzleHead) = headColl update (
$id(h.id),
h,
upsert = true
) void

def addLearning(user: User, puzzleId: PuzzleId) = headColl update (
$id(user.id),
$set(PuzzleHead.BSONFields.current -> puzzleId.some),
upsert = true
) void
def add(h: PuzzleHead) = headColl.update($id(h.id), h, upsert = true) void

def addNew(user: User, puzzleId: PuzzleId) = add(PuzzleHead(user.id, puzzleId.some, puzzleId))

Expand Down
12 changes: 2 additions & 10 deletions modules/puzzle/src/main/Selector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,9 @@ private[puzzle] final class Selector(
api.head.find(user) flatMap {
case Some(PuzzleHead(_, Some(c), _)) => api.puzzle.find(c)
case _ =>
val isLearn = scala.util.Random.nextInt(7) == 0
val next = if (isLearn) api.learning.nextPuzzle(user) flatMap {
case None => newPuzzleForUser(user)
case p => fuccess(p)
newPuzzleForUser(user) flatMap { next =>
next.?? { p => api.head.addNew(user, p.id) } inject next
}
else newPuzzleForUser(user)
(next flatMap {
case Some(p) if isLearn => api.head.addLearning(user, p.id)
case Some(p) => api.head.addNew(user, p.id)
case _ => fuccess(none)
}) >> next
}
}
}.mon(_.puzzle.selector.time) flatten "No puzzles available" addEffect { puzzle =>
Expand Down

0 comments on commit badb7ab

Please sign in to comment.