From 71c5f2de8a2b6e36300d8dadeac71446ff346304 Mon Sep 17 00:00:00 2001 From: Shashankss1205 Date: Sun, 10 Mar 2024 04:28:02 +0530 Subject: [PATCH 1/4] r.surf.rfractal: Added seed option and -s fag to module --- .vscode/settings.json | 5 + raster/r.surf.fractal/main.c | 40 +++++++ raster/r.surf.fractal/spec_syn.c | 3 - .../testsuite/test_r_surf_fractal.py | 110 ++++++++++++++++++ 4 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 raster/r.surf.fractal/testsuite/test_r_surf_fractal.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..d65458432ab --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "gmath.h": "c" + } +} \ No newline at end of file diff --git a/raster/r.surf.fractal/main.c b/raster/r.surf.fractal/main.c index f92fadff62c..5911faeaf3a 100644 --- a/raster/r.surf.fractal/main.c +++ b/raster/r.surf.fractal/main.c @@ -28,6 +28,11 @@ int main(int argc, char *argv[]) struct Option *rast_out; /* Structure for output raster */ struct Option *frac_dim; /* Fractal dimension of surface. */ struct Option *num_images; /* Number of images to produce. */ + struct Option *seed; + struct Flag *s_flag; + + long seed_value; + char *seedptr; G_gisinit(argv[0]); /* Link with GRASS interface. */ @@ -54,9 +59,44 @@ int main(int argc, char *argv[]) num_images->required = NO; num_images->answer = "0"; + seed = G_define_option(); + seed->key = "seed"; + seed->type = TYPE_INTEGER; + seed->required = NO; + seed->label = _("Seed for random number generator"); + seed->description = _("The same seed can be used to obtain same results" + " or random seed can be generated by other means."); + + s_flag = G_define_flag(); + s_flag->key = 's'; + s_flag->label = _("Generate random seed (result is non-deterministic)"); + s_flag->description = + _("Automatically generates random seed for random number" + " generator (use when you don't want to provide the seed option)"); + + if (G_parser(argc, argv)) /* Performs the prompting for */ exit(EXIT_FAILURE); /* keyboard input. */ + /****** INITIALISE RANDOM NUMBER GENERATOR ******/ + if (s_flag->answer) { + seed_value = G_math_srand_auto(); + G_verbose_message(_("Generated random seed (-s): %ld"), seed_value); + } + else if (seed->answer) { + seed_value = atol(seed->answer); + G_math_srand(seed_value); + G_verbose_message(_("Read random seed from %s option: %ld"), seed->key, + seed_value); + } + else { + /* default as it used to be */ + seed_value = G_math_srand_auto(); + G_verbose_message(_("Warning set flag s or option seed. Generated " + "random seed (-s): %ld"), + seed_value); + } + rast_out_name = rast_out->answer; sscanf(frac_dim->answer, "%lf", &H); H = 3.0 - H; diff --git a/raster/r.surf.fractal/spec_syn.c b/raster/r.surf.fractal/spec_syn.c index 04d1e9b9a57..23acb75024f 100644 --- a/raster/r.surf.fractal/spec_syn.c +++ b/raster/r.surf.fractal/spec_syn.c @@ -42,9 +42,6 @@ int specsyn(double *data[2], /* Array holding complex data to transform. */ double phase, rad, /* polar coordinates of Fourier coeff. */ *temp[2]; - /* You can set GRASS_RANDOM_SEED for repeatability */ - G_math_srand_auto(); /* Reset random number generator. */ - temp[0] = (double *)G_malloc(nn * nn * sizeof(double)); temp[1] = (double *)G_malloc(nn * nn * sizeof(double)); diff --git a/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py b/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py new file mode 100644 index 00000000000..c904160668a --- /dev/null +++ b/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 + +""" +MODULE: Test of r.surf.fractal + +AUTHOR(S): Shashank Shekhar Singh + +PURPOSE: Test fractal surface generation with r.surf.fractal module + +COPYRIGHT: (C) 2024 by Shashank Shekhar Singh and the GRASS Development Team + +This program is free software under the GNU General Public +License (>=v2). Read the file COPYING that comes with GRASS +for details. +""" + +import os + +import grass.script as gs + +from grass.gunittest.case import TestCase +from grass.gunittest.main import test + + +class FractalTestCase(TestCase): + """Test case for r.surf.fractal""" + + # Raster map name to be used as output + output = "fractal_result" + + @classmethod + def setUpClass(cls): + """Set up necessary environment""" + # Set up temporary computational region + cls.use_temp_region() + # Only 100,000,000 seem to reasonably (not 100%) ensure that all values + # are generated, so exceeding of ranges actually shows up. + cls.runModule("g.region", rows=10000, cols=10000) + + @classmethod + def tearDownClass(cls): + """Clean up temporary environment""" + cls.del_temp_region() + + def tearDown(self): + """Remove the output created from the module after each test""" + self.runModule("g.remove", flags="f", type="raster", name=[self.output]) + + def test_default_settings(self): + """Test with default settings""" + self.assertModule("r.surf.fractal", output=self.output) + + def test_fractal_dimension(self): + """Test with specified fractal dimension""" + fractal_dim = 2.05 # Example fractal dimension value + self.assertModule( + "r.surf.fractal", + dimension=fractal_dim, + output=self.output, + ) + + def test_num_images(self): + """Test with specified number of intermediate images""" + num_images = 5 # Example number of intermediate images + self.assertModule( + "r.surf.fractal", + number=num_images, + output=self.output, + ) + + def test_random_seed(self): + """Test with specified random seed""" + seed_value = 12345 # Example random seed value + self.assertModule( + "r.surf.fractal", + seed=seed_value, + output=self.output, + ) + + def test_generate_random_seed(self): + """Test with flag to generate random seed""" + self.assertModule( + "r.surf.fractal", + flags="s", + output=self.output, + ) + + def test_invalid_fractal_dimension(self): + """Test with invalid fractal dimension""" + invalid_dim = 1.5 # Example invalid fractal dimension value + # Ensure that the module fails with an error message + self.assertModuleFail( + "r.surf.fractal", + dimension=invalid_dim, + output=self.output, + ) + + def test_invalid_seed_value(self): + """Test with invalid random seed value""" + invalid_seed = "abc" # Example invalid random seed value + # Ensure that the module fails with an error message + self.assertModuleFail( + "r.surf.fractal", + seed=invalid_seed, + output=self.output, + ) + + +if __name__ == "__main__": + test() From 44791a52901fc962dd61b5c3770ea08f40734af5 Mon Sep 17 00:00:00 2001 From: Shashank Shekhar Singh <123410790+Shashankss1205@users.noreply.github.com> Date: Sun, 10 Mar 2024 19:28:09 +0530 Subject: [PATCH 2/4] Deleted .vscode/settings.json Added the VS code settings by mistake, so removing them in this commit. --- .vscode/settings.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index d65458432ab..00000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "gmath.h": "c" - } -} \ No newline at end of file From e2318bff55b5e364e5b1279e7795e4787b85d072 Mon Sep 17 00:00:00 2001 From: Shashankss1205 Date: Thu, 14 Mar 2024 01:37:44 +0530 Subject: [PATCH 3/4] Removed the abundant -s flag from the module --- raster/r.surf.fractal/main.c | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/raster/r.surf.fractal/main.c b/raster/r.surf.fractal/main.c index 5911faeaf3a..7915171e0a0 100644 --- a/raster/r.surf.fractal/main.c +++ b/raster/r.surf.fractal/main.c @@ -29,7 +29,6 @@ int main(int argc, char *argv[]) struct Option *frac_dim; /* Fractal dimension of surface. */ struct Option *num_images; /* Number of images to produce. */ struct Option *seed; - struct Flag *s_flag; long seed_value; char *seedptr; @@ -67,32 +66,20 @@ int main(int argc, char *argv[]) seed->description = _("The same seed can be used to obtain same results" " or random seed can be generated by other means."); - s_flag = G_define_flag(); - s_flag->key = 's'; - s_flag->label = _("Generate random seed (result is non-deterministic)"); - s_flag->description = - _("Automatically generates random seed for random number" - " generator (use when you don't want to provide the seed option)"); - - if (G_parser(argc, argv)) /* Performs the prompting for */ exit(EXIT_FAILURE); /* keyboard input. */ /****** INITIALISE RANDOM NUMBER GENERATOR ******/ - if (s_flag->answer) { - seed_value = G_math_srand_auto(); - G_verbose_message(_("Generated random seed (-s): %ld"), seed_value); - } - else if (seed->answer) { + if (seed->answer) { seed_value = atol(seed->answer); - G_math_srand(seed_value); + G_srand48(seed_value); G_verbose_message(_("Read random seed from %s option: %ld"), seed->key, seed_value); } else { /* default as it used to be */ - seed_value = G_math_srand_auto(); - G_verbose_message(_("Warning set flag s or option seed. Generated " + seed_value = G_srand48_auto(); + G_verbose_message(_("Warning set option seed. Generated " "random seed (-s): %ld"), seed_value); } From 8dca62b65f651e94258d02e121ce25bd9bea2a99 Mon Sep 17 00:00:00 2001 From: Shashank Shekhar Singh <123410790+Shashankss1205@users.noreply.github.com> Date: Sun, 10 Nov 2024 03:17:21 +0530 Subject: [PATCH 4/4] Update raster/r.surf.fractal/testsuite/test_r_surf_fractal.py Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- raster/r.surf.fractal/testsuite/test_r_surf_fractal.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py b/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py index c904160668a..8b9d37b4dd1 100644 --- a/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py +++ b/raster/r.surf.fractal/testsuite/test_r_surf_fractal.py @@ -14,9 +14,6 @@ for details. """ -import os - -import grass.script as gs from grass.gunittest.case import TestCase from grass.gunittest.main import test