split.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package solver
  2. import (
  3. "log"
  4. "os"
  5. "strconv"
  6. "time"
  7. )
  8. // Perform some checks
  9. // and
  10. // Modify solver.row1s so it limits the workload to what is only desired.
  11. func (solver *Solver) SelectWorkload() {
  12. if solver.Controller.Split > len(solver.row1s) {
  13. 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")
  14. os.Exit(1)
  15. }
  16. defer solver.timeTrack(time.Now(), "Workload set")
  17. log.Println("Setting workload")
  18. log.Println("We are agent " + strconv.Itoa(solver.Controller.Part) + " of " + strconv.Itoa(solver.Controller.Split))
  19. workloads := solver.splitWorkload()
  20. solver.setWorkload(workloads)
  21. }
  22. // Determine how workload should be split among the agents
  23. func (solver *Solver) splitWorkload() []int {
  24. agents := make([]int, solver.Controller.Split)
  25. var tracker int
  26. var tasks int = len(solver.row1s)
  27. for tasks != 0 {
  28. agents[tracker] += 1
  29. tasks -= 1
  30. tracker += 1
  31. if tracker == solver.Controller.Split {
  32. tracker = 0
  33. }
  34. }
  35. return agents
  36. }
  37. // Set the workload by setting solver.row1s
  38. func (solver *Solver) setWorkload(agents []int) {
  39. var start int = 0
  40. var finish int = 0
  41. for key, value := range agents {
  42. if key == solver.Controller.Part-1 {
  43. finish = start + value
  44. break
  45. } else {
  46. start += value
  47. }
  48. }
  49. // Set the shortened set of instructions
  50. solver.row1s = solver.row1s[start:finish]
  51. // Recalculate how much we need to grind through
  52. 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))
  53. }