Эх сурвалжийг харах

#6 Improved estimation algorithm

Sacha Ligthert 1 жил өмнө
parent
commit
26b78420a2

+ 24 - 6
solver/processing.go

@@ -125,24 +125,25 @@ func (solver *Solver) tracker() {
 			rate_diff = rate_stop - rate_start
 			rate_diff = rate_stop - rate_start
 
 
 			// Make sure something happened, making rate_start the only reliable variable
 			// Make sure something happened, making rate_start the only reliable variable
-			if rate_diff == 0 && rate_start > 1 {
+			if rate_diff == 0 && int(percentage) > 1 {
 				percentage = 100
 				percentage = 100
 				solver.counter = solver.iter
 				solver.counter = solver.iter
 			}
 			}
 
 
 			timer_elapsed := time.Since(timer_start)
 			timer_elapsed := time.Since(timer_start)
 			rate := int64(rate_diff) / int64(timer_elapsed.Seconds())
 			rate := int64(rate_diff) / int64(timer_elapsed.Seconds())
+			solver.rates = append(solver.rates, rate)
+			rate_avg := solver.calc_avg()
 
 
-			// Estimate when this is finished:
-			// TODO: Make this Bayesian
+			// Estimate when this is finished
 			if rate_diff == 0 {
 			if rate_diff == 0 {
 				est_fin = "N/A"
 				est_fin = "N/A"
 			} else {
 			} else {
-				est_fin = solver.secondsToHuman((int(solver.iter) - int(solver.counter)) / int(rate))
+				est_fin = solver.secondsToHuman((int(solver.iter) - int(solver.counter)) / int(rate_avg))
 			}
 			}
 
 
 			// Printing the meat
 			// 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)
+			log.Println("Processing: " + strconv.Itoa(int(percentage)) + "% (" + strconv.Itoa(int(solver.counter)) + "/" + strconv.Itoa(int(solver.iter)) + "); Rate: " + strconv.Itoa(int(rate)) + "/sec for " + timer_elapsed.String() + "; Time left (est.): " + est_fin)
 
 
 			// Wrap up the loop or break
 			// Wrap up the loop or break
 			if int(percentage) > track {
 			if int(percentage) > track {
@@ -153,10 +154,14 @@ func (solver *Solver) tracker() {
 			rate_start = rate_stop
 			rate_start = rate_stop
 			timer_start = time.Now()
 			timer_start = time.Now()
 
 
-			if rate_diff == 0 && rate_start > 100 {
+			if percentage == 100 {
 				break
 				break
 			}
 			}
 
 
+		} else {
+			log.Println(percentage)
+			log.Println(solver.counter)
+			log.Println(rate_diff)
 		}
 		}
 		time.Sleep(1 * time.Second)
 		time.Sleep(1 * time.Second)
 
 
@@ -219,3 +224,16 @@ func (solver *Solver) validate_combination(row1 int, row2 int, row3 int, row4 in
 
 
 	return retval
 	return retval
 }
 }
+
+func (solver *Solver) calc_avg() int {
+	var avg_sum int64
+	var avg int
+
+	for _, value := range solver.rates {
+		avg_sum += value
+	}
+
+	avg = int(avg_sum) / len(solver.rates)
+
+	return avg
+}

+ 1 - 0
solver/types.go

@@ -23,4 +23,5 @@ type Solver struct {
 	iter      int64
 	iter      int64
 	counter   int64
 	counter   int64
 	solutions []string
 	solutions []string
+	rates     []int64
 }
 }