62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
package solver
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
// Perform some checks
|
|
// and
|
|
// Modify solver.row1s so it limits the workload to what is only desired.
|
|
func (solver *Solver) SelectWorkload() {
|
|
if solver.Controller.Split > len(solver.row1s) {
|
|
log.Println("ERROR: Unable to divide the workload in " + strconv.Itoa(solver.Controller.Split) + " parts, when only " + strconv.Itoa(len(solver.row1s)) + " are available.\n\n")
|
|
os.Exit(1)
|
|
}
|
|
defer solver.timeTrack(time.Now(), "Workload set")
|
|
log.Println("Setting workload")
|
|
log.Println("We are agent " + strconv.Itoa(solver.Controller.Part) + " of " + strconv.Itoa(solver.Controller.Split))
|
|
workloads := solver.splitWorkload()
|
|
solver.setWorkload(workloads)
|
|
}
|
|
|
|
// Determine how workload should be split among the agents
|
|
func (solver *Solver) splitWorkload() []int {
|
|
agents := make([]int, solver.Controller.Split)
|
|
var tracker int
|
|
var tasks int = len(solver.row1s)
|
|
|
|
for tasks != 0 {
|
|
agents[tracker] += 1
|
|
tasks -= 1
|
|
tracker += 1
|
|
if tracker == solver.Controller.Split {
|
|
tracker = 0
|
|
}
|
|
}
|
|
|
|
return agents
|
|
}
|
|
|
|
// Set the workload by setting solver.row1s
|
|
func (solver *Solver) setWorkload(agents []int) {
|
|
var start int = 0
|
|
var finish int = 0
|
|
for key, value := range agents {
|
|
if key == solver.Controller.Part-1 {
|
|
finish = start + value
|
|
break
|
|
} else {
|
|
start += value
|
|
}
|
|
}
|
|
|
|
// Set the shortened set of instructions
|
|
solver.row1s = solver.row1s[start:finish]
|
|
|
|
// Recalculate how much we need to grind through
|
|
solver.Iter = int64(len(solver.row1s)) * int64(len(solver.row2s)) * int64(len(solver.row3s)) * int64(len(solver.row4s)) * int64(len(solver.row5s)) * int64(len(solver.row6s)) * int64(len(solver.row7s)) * int64(len(solver.row8s)) * int64(len(solver.row9s))
|
|
}
|