|
|
@@ -2,11 +2,15 @@ package solver
|
|
|
|
|
|
import (
|
|
|
"log"
|
|
|
- "runtime"
|
|
|
"strconv"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
func (solver *Solver) populate_blocks() {
|
|
|
+
|
|
|
+ defer solver.timeTrack(time.Now(), "Populated blocks")
|
|
|
+ log.Println("Populating blocks")
|
|
|
+
|
|
|
solver.find_blocks(&solver.row1, &solver.row1s)
|
|
|
solver.find_blocks(&solver.row2, &solver.row2s)
|
|
|
solver.find_blocks(&solver.row3, &solver.row3s)
|
|
|
@@ -19,6 +23,7 @@ func (solver *Solver) populate_blocks() {
|
|
|
|
|
|
// This calculates and stores the total number of solutions to validate.
|
|
|
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))
|
|
|
+
|
|
|
}
|
|
|
|
|
|
func (solver *Solver) find_blocks(row *string, rows *[]int) {
|
|
|
@@ -80,17 +85,84 @@ func (solver *Solver) check_combinations() {
|
|
|
|
|
|
func (solver *Solver) routine_validator(rows1_index int, rows2_index int, rows3_index int, rows4_index int, rows5_index int, rows6_index int, rows7_index int, rows8_index int, rows9_index int) {
|
|
|
|
|
|
- var percentage float32
|
|
|
+ solver.counter = solver.counter + 1
|
|
|
|
|
|
if solver.validate_combination(solver.row1s[rows1_index], solver.row2s[rows2_index], solver.row3s[rows3_index], solver.row4s[rows4_index], solver.row5s[rows5_index], solver.row6s[rows6_index], solver.row7s[rows7_index], solver.row8s[rows8_index], solver.row9s[rows9_index]) {
|
|
|
solver.solutions = append(solver.solutions, solver.render_combination(solver.row1s[rows1_index], solver.row2s[rows2_index], solver.row3s[rows3_index], solver.row4s[rows4_index], solver.row5s[rows5_index], solver.row6s[rows6_index], solver.row7s[rows7_index], solver.row8s[rows8_index], solver.row9s[rows9_index]))
|
|
|
}
|
|
|
|
|
|
- solver.counter = solver.counter + 1
|
|
|
+}
|
|
|
+
|
|
|
+func (solver *Solver) tracker() {
|
|
|
+
|
|
|
+ defer solver.timeTrack(time.Now(), "Validated solutions")
|
|
|
+ log.Println("Validating solutions")
|
|
|
+
|
|
|
+ // Tracking percenting an progress
|
|
|
+ var percentage float32
|
|
|
+ var track int
|
|
|
+
|
|
|
+ // Tracking the rate
|
|
|
+ var rate_start int
|
|
|
+ var rate_stop int
|
|
|
+ var rate_diff int
|
|
|
+
|
|
|
+ // Tracking duration
|
|
|
+ var timer_start = time.Now()
|
|
|
+ // Prevent division-by-zero error when establishing `rate`
|
|
|
+ time.Sleep(time.Second)
|
|
|
|
|
|
- if solver.counter%1000000 == 0 {
|
|
|
+ // Estimation how long it will take
|
|
|
+ var est_fin string
|
|
|
+
|
|
|
+ for solver.iter != solver.counter {
|
|
|
+
|
|
|
+ // Determine how far we are.
|
|
|
percentage = (float32(solver.counter) / (float32(solver.iter) / 100))
|
|
|
- log.Println("Processing:", percentage, "%; Procs:", runtime.NumGoroutine())
|
|
|
+ if track <= int(percentage) {
|
|
|
+ // Reset the loop
|
|
|
+ rate_stop = int(solver.counter)
|
|
|
+ rate_diff = rate_stop - rate_start
|
|
|
+
|
|
|
+ // Make sure something happened, making rate_start the only reliable variable
|
|
|
+ if rate_diff == 0 && rate_start > 1 {
|
|
|
+ percentage = 100
|
|
|
+ solver.counter = solver.iter
|
|
|
+ }
|
|
|
+
|
|
|
+ timer_elapsed := time.Since(timer_start)
|
|
|
+ rate := int64(rate_diff) / int64(timer_elapsed.Seconds())
|
|
|
+
|
|
|
+ // Estimate when this is finished:
|
|
|
+ // TODO: Make this Bayesian
|
|
|
+ // TODO: Fix
|
|
|
+ // For short running solutions this is fine
|
|
|
+ // For long running solutions this breaks
|
|
|
+ if rate_diff == 0 {
|
|
|
+ est_fin = "N/A"
|
|
|
+ } else {
|
|
|
+ est_fin = solver.secondsToHuman((int(solver.iter) - int(solver.counter)) / int(rate))
|
|
|
+ }
|
|
|
+
|
|
|
+ // Printing the meat
|
|
|
+ log.Println("Processing: " + strconv.Itoa(int(percentage)) + "% (" + strconv.Itoa(int(solver.counter)) + "/" + strconv.Itoa(int(solver.iter)) + "); Rate (avg): " + strconv.Itoa(int(rate)) + "/sec for " + timer_elapsed.String() + "; Time left (est.): " + est_fin)
|
|
|
+
|
|
|
+ // Wrap up the loop or break
|
|
|
+ if int(percentage) > track {
|
|
|
+ track = int(percentage)
|
|
|
+ } else {
|
|
|
+ track = track + 1
|
|
|
+ }
|
|
|
+ rate_start = rate_stop
|
|
|
+ timer_start = time.Now()
|
|
|
+
|
|
|
+ if rate_diff == 0 && rate_start > 100 {
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ time.Sleep(1 * time.Second)
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|