diff options
author | Mo Tarbin <mhed.t91@gmail.com> | 2024-08-10 00:27:07 -0400 |
---|---|---|
committer | Mo Tarbin <mhed.t91@gmail.com> | 2024-08-10 00:27:07 -0400 |
commit | 4f22460313f21494442fbea5b1fcda49fb897df0 (patch) | |
tree | cbfd2d9432c9ae9f6b84fc2dcba352e03c09abff /internal/chore/scheduler.go | |
parent | 042cd3b473d0bfe32f2ebcac907437f456e3e112 (diff) | |
download | donetick-4f22460313f21494442fbea5b1fcda49fb897df0.tar.gz donetick-4f22460313f21494442fbea5b1fcda49fb897df0.tar.bz2 donetick-4f22460313f21494442fbea5b1fcda49fb897df0.zip |
Refactor scheduleAdaptiveNextDueDate function for improved readability and fix bug, Add New Tests for it
Diffstat (limited to '')
-rw-r--r-- | internal/chore/scheduler.go | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/internal/chore/scheduler.go b/internal/chore/scheduler.go index 5413447..cec120d 100644 --- a/internal/chore/scheduler.go +++ b/internal/chore/scheduler.go @@ -3,6 +3,7 @@ package chore import ( "encoding/json" "fmt" + "math" "math/rand" "strings" "time" @@ -141,11 +142,15 @@ func scheduleNextDueDate(chore *chModel.Chore, completedDate time.Time) (*time.T return &nextDueDate, nil } - func scheduleAdaptiveNextDueDate(chore *chModel.Chore, completedDate time.Time, history []*chModel.ChoreHistory) (*time.Time, error) { - // will generate due date base on history and the different between the completed date and the due date - // the more recent the higher weight - if len(history) <= 1 { + + history = append([]*chModel.ChoreHistory{ + { + CompletedAt: &completedDate, + }, + }, history...) + + if len(history) < 2 { if chore.NextDueDate != nil { diff := completedDate.UTC().Sub(chore.NextDueDate.UTC()) nextDueDate := completedDate.UTC().Add(diff) @@ -153,22 +158,23 @@ func scheduleAdaptiveNextDueDate(chore *chModel.Chore, completedDate time.Time, } return nil, nil } - var weight float64 + + var totalDelay float64 var totalWeight float64 - var nextDueDate time.Time + decayFactor := 0.5 // Adjust this value to control the decay rate + for i := 0; i < len(history)-1; i++ { delay := history[i].CompletedAt.UTC().Sub(history[i+1].CompletedAt.UTC()).Seconds() - weight = delay * float64(len(history)-i) + weight := math.Pow(decayFactor, float64(i)) + totalDelay += delay * weight totalWeight += weight } - // calculate the average delay - averageDelay := totalWeight / float64(len(history)-1) - // calculate the difference between the completed date and the due date - nextDueDate = completedDate.UTC().Add(time.Duration(averageDelay) * time.Second) + + averageDelay := totalDelay / totalWeight + nextDueDate := completedDate.UTC().Add(time.Duration(averageDelay) * time.Second) return &nextDueDate, nil } - func RemoveAssigneeAndReassign(chore *chModel.Chore, userID int) { for i, assignee := range chore.Assignees { if assignee.UserID == userID { |