search.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "search.h"
  2. #include <cassert>
  3. search::search(int dim, int npoints, int *p) : dim(dim), npoints(npoints),
  4. best(1.), ha(dim, p), ps(dim, npoints) {
  5. assert(dim > 0);
  6. assert(npoints > 0);
  7. }
  8. void search::check() {
  9. // TODO adapter l'API pour ne pas recalculer la discrepancy
  10. double discr = ps.discrepancy();
  11. if(discr < best) {
  12. best = discr;
  13. FILE *f = fopen(filename.c_str(), "w");
  14. ps.dump(f);
  15. fclose(f);
  16. }
  17. }
  18. double search::run(int iterations) {
  19. _run(iterations);
  20. printf("Best discrepancy found after %d iterations : %g\nResult saved in %s\n", iterations, best, filename.c_str());
  21. return best;
  22. }
  23. random_search::random_search(int dim, int npoints, int *p) : search(dim, npoints, p) {
  24. filename = std::string("random_search");
  25. }
  26. void random_search::_run(int iterations) {
  27. for(int t = 0; t < iterations; t++) {
  28. // shuffle permutations
  29. for(int i = 0; i < dim; i++)
  30. ha.get_pi(i).random();
  31. // compute points
  32. for(int i = 0; i < npoints; i++)
  33. ha.compute(i+1, ps.point(i));
  34. // compute discrepancy and check if it is good
  35. check();
  36. }
  37. }