[gegl] gegl-random: keep random data stable, increase number of primes
- From: Ãyvind KolÃs <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] gegl-random: keep random data stable, increase number of primes
- Date: Wed, 19 Dec 2012 07:47:45 +0000 (UTC)
commit 7aa94317a97604aa60806302398e4d8b20631585
Author: Ãyvind KolÃs <pippin gimp org>
Date: Wed Dec 19 18:45:56 2012 +1100
gegl-random: keep random data stable, increase number of primes
increasing the number of primes used from ~50 to ~500 increases the set of
different permutations of three primes is possible. Providing for a greater
variety. This greater variety is needed when always reusing the data and
not computing the tables based on the seed.
gegl/gegl-random.c | 101 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 77 insertions(+), 24 deletions(-)
---
diff --git a/gegl/gegl-random.c b/gegl/gegl-random.c
index 04cd48c..52e8d65 100644
--- a/gegl/gegl-random.c
+++ b/gegl/gegl-random.c
@@ -27,25 +27,61 @@
* cyclically, each LUT has a prime number as a size, thus the combination
* of the three values xored will have a period of prime1 * prime2 * prime3,
* with the primes used this yields roughly 3TB of random data from ~300kb
- * of lookup data. The LUTs are being initialized from a random seed.
+ * of lookup data.
*
- * It might * be possible to change this so that the random source data is reused
- * across seeds - and only the sizes of the arrays are manipulated - thus
- * removing most of the initialization overhead when setting a new seed.
+ * The data for the LUTs is shared between different random seeds, it
+ * is just the sizes of the LUTs that change, currently with 468 primes
+ * there is about 101847096 different seeds achivable (with 45 primes
+ * only 83160 combinations are possible (maybe this would have been enough
+ * though)
*/
-
#include <glib.h>
#include <gegl.h>
/* a set of reasonably large primes to choose from for array sizes
*/
static long primes[]={
-14699,14713,14717,14723,14731,14737,14741,14747,14753,
-14759,14767,14771,14779,14783,14797,14813,14821,14827,
-14831,14843,14851,14867,14869,14879,14887,14891,14897,
-14923,14929,14939,14947,14951,14957,14969,14983,15013,
-15017,15031,15053,15061,15073,15077,15083,15091,15101
+10007,10009,10037,10039,10061,10067,10069,10079,10091,10093,10099,10103,10111,
+10133,10139,10141,10151,10159,10163,10169,10177,10181,10193,10211,10223,10243,
+10247,10253,10259,10267,10271,10273,10289,10301,10303,10313,10321,10331,10333,10337,10343,10357,10369,10391,10399,10427,10429,10433,10453,10457,10459,10463,
+10477,10487,10499,10501,10513,10529,10531,10559,10567,10589,10597,10601,10607,
+10613,10627,10631,10639,10651,10657,10663,10667,10687,10691,10709,10711,10723,
+10729,10733,10739,10753,10771,10781,10789,10799,10831,10837,10847,10853,10859,
+10861,10867,10883,10889,10891,10903,10909,10937,10939,10949,10957,10973,10979,
+10987,10993,11003,11027,11047,11057,11059,11069,11071,11083,11087,11093,11113,
+11117,11119,11131,11149,11159,11161,11171,11173,11177,11197,11213,11239,11243,
+11251,11257,11261,11273,11279,11287,11299,11311,11317,11321,11329,11351,11353,
+11369,11383,11393,11399,11411,11423,11437,11443,11447,11467,11471,11483,11489,
+11491,11497,11503,11519,11527,11549,11551,11579,11587,11593,11597,11617,11621,
+11633,11657,11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,11779,
+11783,11789,11801,11807,11813,11821,11827,11831,11833,11839,11863,11867,11887,
+11897,11903,11909,11923,11927,11933,11939,11941,11953,11959,11969,11971,11981,
+11987,12007,12011,12037,12041,12043,12049,12071,12073,12097,12101,12107,12109,
+12113,12119,12143,12149,12157,12161,12163,12197,12203,12211,12227,12239,12241,
+12251,12253,12263,12269,12277,12281,12289,12301,12323,12329,12343,12347,12373,
+12377,12379,12391,12401,12409,12413,12421,12433,12437,12451,12457,12473,12479,
+12487,12491,12497,12503,12511,12517,12527,12539,12541,12547,12553,12569,12577,
+12583,12589,12601,12611,12613,12619,12637,12641,12647,12653,12659,12671,12689,
+12697,12703,12713,12721,12739,12743,12757,12763,12781,12791,12799,12809,12821,
+12823,12829,12841,12853,12889,12893,12899,12907,12911,12917,12919,12923,12941,
+12953,12959,12967,12973,12979,12983,13001,13003,13007,13009,13033,13037,13043,
+13049,13063,13093,13099,13103,13109,13121,13127,13147,13151,13159,13163,13171,
+13177,13183,13187,13217,13219,13229,13241,13249,13259,13267,13291,13297,13309,
+13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,13417,13421,13441,
+13451,13457,13463,13469,13477,13487,13499,13513,13523,13537,13553,13567,13577,
+13591,13597,13613,13619,13627,13633,13649,13669,13679,13681,13687,13691,13693,
+13697,13709,13711,13721,13723,13729,13751,13757,13759,13763,13781,13789,13799,
+13807,13829,13831,13841,13859,13873,13877,13879,13883,13901,13903,13907,13913,
+13921,13931,13933,13963,13967,13997,13999,14009,14011,14029,14033,14051,14057,
+14071,14081,14083,14087,14107,14143,14149,14153,14159,14173,14177,14197,14207,
+14221,14243,14249,14251,14281,14293,14303,14321,14323,14327,14341,14347,14369,
+14387,14389,14401,14407,14411,14419,14423,14431,14437,14447,14449,14461,14479,
+14489,14503,14519,14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,
+14621,14627,14629,14633,14639,14653,14657,14699,14713,14717,14723,14731,14737,
+14741,14747,14753,14759,14767,14771,14779,14783,14797,14813,14821,14827,14831,
+14843,14851,14867,14869,14879,14887,14891,14897,14923,14929,14939,14947,14951,
+14957,14969,14983,15013,15017,15031,15053,15061,15073,15077,15083,15091,15101
};
/* these primes should not exist in the above set */
@@ -54,6 +90,11 @@ static long primes[]={
#define NPRIME 101111
#define MAX_TABLES 3
+#define RANDOM_DATA_SIZE (15083+15091+15101)
+
+static gint64 random_data[RANDOM_DATA_SIZE];
+static gboolean random_data_inited = FALSE;
+
typedef struct GeglRandomSet
{
int seed;
@@ -76,6 +117,15 @@ gegl_random_set_new (int seed)
set->seed = seed;
set->tables = MAX_TABLES;
+ if (!random_data_inited)
+ {
+ gr = g_rand_new_with_seed (42);
+ for (i = 0; i < RANDOM_DATA_SIZE; i++)
+ random_data[i] = (((gint64) g_rand_int (gr)) << 32) + g_rand_int (gr);
+ g_rand_free (gr);
+ random_data_inited = TRUE;
+ }
+
gr = g_rand_new_with_seed (set->seed);
for (i = 0; i < set->tables; i++)
@@ -91,10 +141,10 @@ gegl_random_set_new (int seed)
found = 1;
} while (found);
- set->table[i] = g_malloc0 (sizeof (gint64) * set->prime[i]);
+ set->table[i] = random_data;
- for (j = 0; j < set->prime[i]; j++)
- set->table[i][j] = (((gint64) g_rand_int (gr)) << 32) + g_rand_int (gr);
+ for (j = 0; j < i-1; j++)
+ set->table[i]+= set->prime[j];
}
g_rand_free (gr);
@@ -105,15 +155,9 @@ gegl_random_set_new (int seed)
static void
gegl_random_set_free (GeglRandomSet *set)
{
- int i;
-
- for (i = 0; i < set->tables; i++)
- g_free (set->table[i]);
-
g_free (set);
}
-/* a better cache with more entries would be nice ;) */
static GeglRandomSet *cached = NULL;
static GList *cache = NULL;
@@ -166,8 +210,8 @@ gegl_random_get_set_for_seed (int seed)
return cached;
}
-gint64
-gegl_random_int (int seed,
+static inline gint64
+_gegl_random_int (int seed,
int x,
int y,
int z,
@@ -188,6 +232,16 @@ gegl_random_int (int seed,
}
gint64
+gegl_random_int (int seed,
+ int x,
+ int y,
+ int z,
+ int n)
+{
+ return _gegl_random_int (seed, x, y, z, n);
+}
+
+gint64
gegl_random_int_range (int seed,
int x,
int y,
@@ -196,8 +250,7 @@ gegl_random_int_range (int seed,
int min,
int max)
{
- gint64 ret = gegl_random_int (seed, x, y, z, n);
-
+ gint64 ret = _gegl_random_int (seed, x, y, z, n);
return (ret % (max-min)) + min;
}
@@ -211,7 +264,7 @@ gegl_random_double (int seed,
int z,
int n)
{
- return (gegl_random_int (seed, x, y, z, n) & 0xffffffff) * G_RAND_DOUBLE_TRANSFORM;
+ return (_gegl_random_int (seed, x, y, z, n) & 0xffffffff) * G_RAND_DOUBLE_TRANSFORM;
}
double
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]