Skip to content

Commit

Permalink
Implement mps timecontrol
Browse files Browse the repository at this point in the history
Fixes #5
  • Loading branch information
ArcticXWolf committed Apr 21, 2021
1 parent be24a0b commit 145c593
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 10 deletions.
2 changes: 1 addition & 1 deletion search/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,12 @@ func (s *Search) alphaBeta(ctx context.Context, depthLeft, ply, alpha, beta int,
var lastMove dragontoothmg.Move
moveIterator:
for _, m := range legal_moves {
lastMove = m
select {
case <-ctx.Done():
cancelled = true
break moveIterator
default:
lastMove = m
s.Game.PushMove(m)

newMoves, newScore, newCancelled = s.alphaBeta(ctx, depthLeft-1, ply+1, -beta, -alpha, m, previousMoves)
Expand Down
73 changes: 64 additions & 9 deletions uci/timemanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ const (
DefaultMovesToGo = 30
MoveOverhead = 200 * time.Millisecond
MaxTime = 30000 * time.Millisecond
MinTimeLeft = 3000 * time.Millisecond
)

type UciTimingInfo struct {
Expand Down Expand Up @@ -49,6 +48,32 @@ func NewTimingInfo(messageParts []string) (timingInfo *UciTimingInfo) {
}

func (timingInfo *UciTimingInfo) calculateTimeoutContext(ctx context.Context, g *game.Game, options []UciOption) (context.Context, func()) {
if timingInfo.MoveTime > 0 {
return context.WithDeadline(ctx, timingInfo.StartTimestamp.Add(time.Duration(timingInfo.MoveTime)))
}

maxTime := MaxTime
for _, option := range options {
if option.name == "Max Time" {
optionsMT, err := strconv.Atoi(option.value)
if err == nil {
maxTime = time.Duration(optionsMT) * time.Second
}
}
}

if timingInfo.MovesToGo > 0 && timingInfo.IncrementWhite <= 0 && timingInfo.IncrementBlack <= 0 && timingInfo.TimeWhite > 0 && timingInfo.TimeBlack > 0 {
return timingInfo.calculateTimeoutContextMPSTC(ctx, g, options)
}

if timingInfo.MovesToGo <= 0 && timingInfo.IncrementWhite > 0 && timingInfo.IncrementBlack > 0 && timingInfo.TimeWhite > 0 && timingInfo.TimeBlack > 0 {
return timingInfo.calculateTimeoutContextFisherTC(ctx, g, options)
}

return context.WithDeadline(ctx, timingInfo.StartTimestamp.Add(maxTime))
}

func (timingInfo *UciTimingInfo) calculateTimeoutContextFisherTC(ctx context.Context, g *game.Game, options []UciOption) (context.Context, func()) {
moveOverhead := MoveOverhead
maxTime := MaxTime
for _, option := range options {
Expand All @@ -66,10 +91,6 @@ func (timingInfo *UciTimingInfo) calculateTimeoutContext(ctx context.Context, g
}
}

if timingInfo.MovesToGo <= 0 && timingInfo.TimeWhite <= 0 && timingInfo.TimeBlack <= 0 {
return context.WithDeadline(ctx, timingInfo.StartTimestamp.Add(maxTime))
}

if timingInfo.MovesToGo <= 0 {
timingInfo.MovesToGo = DefaultMovesToGo
}
Expand All @@ -84,12 +105,46 @@ func (timingInfo *UciTimingInfo) calculateTimeoutContext(ctx context.Context, g
timeLeft = 0
}

total := float64(timeLeft) + float64(timingInfo.MovesToGo-1)*float64(increment)
limit := time.Duration(total / float64(timingInfo.MovesToGo-1))
total := float64(timeLeft) + float64(timingInfo.MovesToGo)*float64(increment)
limit := time.Duration(total / float64(timingInfo.MovesToGo))

if limit > maxTime {
limit = maxTime
}

return context.WithDeadline(ctx, timingInfo.StartTimestamp.Add(limit))
}

func (timingInfo *UciTimingInfo) calculateTimeoutContextMPSTC(ctx context.Context, g *game.Game, options []UciOption) (context.Context, func()) {
moveOverhead := MoveOverhead
maxTime := MaxTime
for _, option := range options {
if option.name == "Move Overhead" {
optionsMO, err := strconv.Atoi(option.value)
if err == nil {
moveOverhead = time.Duration(optionsMO) * time.Millisecond
}
}
if option.name == "Max Time" {
optionsMT, err := strconv.Atoi(option.value)
if err == nil {
maxTime = time.Duration(optionsMT) * time.Second
}
}
}

timeLeft := time.Duration(timingInfo.TimeWhite) * time.Millisecond
if !g.Position.Wtomove {
timeLeft = time.Duration(timingInfo.TimeBlack) * time.Millisecond
}

if limit > timeLeft-MinTimeLeft {
limit = timeLeft - MinTimeLeft
timeLeft -= moveOverhead
if timeLeft <= 0 {
timeLeft = 0
}

limit := time.Duration(float64(timeLeft) / float64(timingInfo.MovesToGo+1))

if limit > maxTime {
limit = maxTime
}
Expand Down

0 comments on commit 145c593

Please sign in to comment.