package solver import ( "log" "os" "strconv" "time" ) // Renders workload for an agent. // Checks if this feature can be used, otherwise exits. // 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 = uint64(len(solver.row1s)) * uint64(len(solver.row2s)) * uint64(len(solver.row3s)) * uint64(len(solver.row4s)) * uint64(len(solver.row5s)) * uint64(len(solver.row6s)) * uint64(len(solver.row7s)) * uint64(len(solver.row8s)) * uint64(len(solver.row9s)) }