benchmark_r_patch.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """Benchmarking of r.patch
  2. @author Aaron Saw Min Sern
  3. """
  4. from grass.exceptions import CalledModuleError
  5. from grass.pygrass.modules import Module
  6. from subprocess import DEVNULL
  7. import grass.benchmark as bm
  8. def main():
  9. results = []
  10. # Users can add more or modify existing reference maps
  11. benchmark(7071, "r.patch_50M", results)
  12. benchmark(14142, "r.patch_200M", results)
  13. benchmark(10000, "r.patch_100M", results)
  14. benchmark(20000, "r.patch_400M", results)
  15. bm.nprocs_plot(results, filename="rpatch_benchmark.svg")
  16. def benchmark(size, label, results):
  17. references = ["r_patch_reference_map_{}".format(i) for i in range(4)]
  18. output = "benchmark_r_patch"
  19. generate_map(rows=size, cols=size, fname=references)
  20. module = Module(
  21. "r.patch",
  22. input=references,
  23. output=output,
  24. run_=False,
  25. stdout_=DEVNULL,
  26. overwrite=True,
  27. )
  28. results.append(bm.benchmark_nprocs(module, label=label, max_nprocs=24, repeat=3))
  29. for r in references:
  30. Module("g.remove", quiet=True, flags="f", type="raster", name=r)
  31. Module("g.remove", quiet=True, flags="f", type="raster", name=output)
  32. def generate_map(rows, cols, fname):
  33. temp = "r_patch_reference_tmp"
  34. Module("g.region", flags="p", s=0, n=rows, w=0, e=cols, res=1)
  35. # Generate using r.random.surface if r.surf.fractal fails
  36. try:
  37. print("Generating reference map using r.surf.fractal...")
  38. for r in fname:
  39. Module(
  40. "r.surf.fractal",
  41. output=temp,
  42. overwrite=True,
  43. )
  44. # Make approximate half of the reference map to be null
  45. Module(
  46. "r.mapcalc",
  47. expression=f"{r} = if({temp}, {temp}, 0, null())",
  48. overwrite=True,
  49. )
  50. except CalledModuleError:
  51. print("r.surf.fractal fails, using r.random.surface instead...")
  52. for r in fname:
  53. Module(
  54. "r.random.surface",
  55. maximum=255,
  56. output=temp,
  57. overwrite=True,
  58. )
  59. Module(
  60. "r.mapcalc",
  61. expression=f"{r} = if({temp} - 128, {temp}, 0, null())",
  62. overwrite=True,
  63. )
  64. Module("g.remove", quiet=True, flags="f", type="raster", name=temp)
  65. if __name__ == "__main__":
  66. main()