X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/272ccad1b68b6d9c17069f3c934886925bb15b5d..4bd1f48f0bf1ad1703be680ec2a38d626c6a2668:/src/xbt/RngStream.c diff --git a/src/xbt/RngStream.c b/src/xbt/RngStream.c index 1021e7ed7f..816d5d6497 100644 --- a/src/xbt/RngStream.c +++ b/src/xbt/RngStream.c @@ -1,3 +1,9 @@ +/* Copyright (c) 2012, 2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + /***********************************************************************\ * * File: RngStream.c for multiple streams of Random Numbers @@ -11,18 +17,16 @@ * \***********************************************************************/ - #include "xbt/RngStream.h" +#include "xbt/sysdep.h" #include #include #include - /*---------------------------------------------------------------------*/ /* Private part. */ /*---------------------------------------------------------------------*/ - #define norm 2.328306549295727688e-10 #define m1 4294967087.0 #define m2 4294944443.0 @@ -35,14 +39,9 @@ #define two53 9007199254740992.0 #define fact 5.9604644775390625e-8 /* 1 / 2^24 */ - - - -/* Default initial seed of the package. Will be updated to become - the seed of the next created stream. */ +/* Default initial seed of the package. Will be updated to become the seed of the next created stream. */ static double nextSeed[6] = { 12345, 12345, 12345, 12345, 12345, 12345 }; - /* The following are the transition matrices of the two MRG components */ /* (in matrix form), raised to the powers -1, 1, 2^76, and 2^127, resp.*/ static double InvA1[3][3] = { /* Inverse of A1p0 */ @@ -70,19 +69,19 @@ static double A2p0[3][3] = { }; static double A1p76[3][3] = { - { 82758667.0, 1871391091.0, 4127413238.0 }, - { 3672831523.0, 69195019.0, 1871391091.0 }, + { 82758667.0, 1871391091.0, 4127413238.0 }, + { 3672831523.0, 69195019.0, 1871391091.0 }, { 3672091415.0, 3528743235.0, 69195019.0 } }; static double A2p76[3][3] = { - { 1511326704.0, 3759209742.0, 1610795712.0 }, - { 4292754251.0, 1511326704.0, 3889917532.0 }, + { 1511326704.0, 3759209742.0, 1610795712.0 }, + { 4292754251.0, 1511326704.0, 3889917532.0 }, { 3859662829.0, 4292754251.0, 3708466080.0 } }; static double A1p127[3][3] = { - { 2427906178.0, 3580155704.0, 949770784.0 }, + { 2427906178.0, 3580155704.0, 949770784.0 }, { 226153695.0, 1230515664.0, 3580155704.0 }, { 1988835001.0, 986791581.0, 1230515664.0 } }; @@ -93,12 +92,6 @@ static double A2p127[3][3] = { { 2824425944.0, 32183930.0, 2093834863.0 } }; - - - - -/*-------------------------------------------------------------------------*/ - static double MultModM (double a, double s, double c, double m) /* Compute (a*s + c) % m. m must be < 2^35. Works also for s, c < 0 */ { @@ -120,9 +113,6 @@ static double MultModM (double a, double s, double c, double m) return v; } - -/*-------------------------------------------------------------------------*/ - static void MatVecModM (double A[3][3], double s[3], double v[3], double m) /* Returns v = A*s % m. Assumes that -m < s[i] < m. */ /* Works even if v = s. */ @@ -138,11 +128,7 @@ static void MatVecModM (double A[3][3], double s[3], double v[3], double m) v[i] = x[i]; } - -/*-------------------------------------------------------------------------*/ - -static void MatMatModM (double A[3][3], double B[3][3], double C[3][3], - double m) +static void MatMatModM (double A[3][3], double B[3][3], double C[3][3], double m) /* Returns C = A*B % m. Work even if A = C or B = C or A = B = C. */ { int i, j; @@ -160,9 +146,6 @@ static void MatMatModM (double A[3][3], double B[3][3], double C[3][3], } } - -/*-------------------------------------------------------------------------*/ - static void MatTwoPowModM (double A[3][3], double B[3][3], double m, long e) /* Compute matrix B = (A^(2^e) % m); works even if A = B */ { @@ -180,9 +163,6 @@ static void MatTwoPowModM (double A[3][3], double B[3][3], double m, long e) MatMatModM (B, B, B, m); } - -/*-------------------------------------------------------------------------*/ - static void MatPowModM (double A[3][3], double B[3][3], double m, long n) /* Compute matrix B = A^n % m ; works even if A = B */ { @@ -208,9 +188,6 @@ static void MatPowModM (double A[3][3], double B[3][3], double m, long n) } } - -/*-------------------------------------------------------------------------*/ - static double U01 (RngStream g) { long k; @@ -241,9 +218,6 @@ static double U01 (RngStream g) return (g->Anti) ? (1 - u) : u; } - -/*-------------------------------------------------------------------------*/ - static double U01d (RngStream g) { double u; @@ -258,13 +232,9 @@ static double U01d (RngStream g) } } - -/*-------------------------------------------------------------------------*/ - static int CheckSeed (unsigned long seed[6]) { - /* Check that the seeds are legitimate values. Returns 0 if legal seeds, - -1 otherwise */ + /* Check that the seeds are legitimate values. Returns 0 if legal seeds, -1 otherwise */ int i; for (i = 0; i < 3; ++i) { @@ -299,26 +269,24 @@ static int CheckSeed (unsigned long seed[6]) return 0; } - /*---------------------------------------------------------------------*/ /* Public part. */ /*---------------------------------------------------------------------*/ - RngStream RngStream_CreateStream (const char name[]) { int i; RngStream g; size_t len; - g = (RngStream) malloc (sizeof (struct RngStream_InfoState)); + g = (RngStream) xbt_malloc (sizeof (struct RngStream_InfoState)); if (g == NULL) { printf ("RngStream_CreateStream: No more memory\n\n"); exit (EXIT_FAILURE); } if (name) { len = strlen (name); - g->name = (char *) malloc ((len + 1) * sizeof (char)); + g->name = (char *) xbt_malloc ((len + 1) * sizeof (char)); strncpy (g->name, name, len + 1); } else g->name = 0; @@ -333,8 +301,6 @@ RngStream RngStream_CreateStream (const char name[]) return g; } -/*-------------------------------------------------------------------------*/ - void RngStream_DeleteStream (RngStream * p) { if (*p == NULL) @@ -344,18 +310,16 @@ void RngStream_DeleteStream (RngStream * p) *p = NULL; } -/*-------------------------------------------------------------------------*/ - RngStream RngStream_CopyStream (const RngStream src) { RngStream g; - + if(src == NULL) { printf ("RngStream_CopyStream: 'src' not initialized\n\n"); exit (EXIT_FAILURE); } - g = (RngStream) malloc (sizeof (struct RngStream_InfoState)); + g = (RngStream) xbt_malloc (sizeof (struct RngStream_InfoState)); if (g == NULL) { printf ("RngStream_CopyStream: No more memory\n\n"); exit (EXIT_FAILURE); @@ -365,8 +329,6 @@ RngStream RngStream_CopyStream (const RngStream src) return g; } -/*-------------------------------------------------------------------------*/ - void RngStream_ResetStartStream (RngStream g) { int i; @@ -374,8 +336,6 @@ void RngStream_ResetStartStream (RngStream g) g->Cg[i] = g->Bg[i] = g->Ig[i]; } -/*-------------------------------------------------------------------------*/ - void RngStream_ResetNextSubstream (RngStream g) { int i; @@ -385,8 +345,6 @@ void RngStream_ResetNextSubstream (RngStream g) g->Cg[i] = g->Bg[i]; } -/*-------------------------------------------------------------------------*/ - void RngStream_ResetStartSubstream (RngStream g) { int i; @@ -394,8 +352,6 @@ void RngStream_ResetStartSubstream (RngStream g) g->Cg[i] = g->Bg[i]; } -/*-------------------------------------------------------------------------*/ - int RngStream_SetPackageSeed (unsigned long seed[6]) { int i; @@ -406,8 +362,6 @@ int RngStream_SetPackageSeed (unsigned long seed[6]) return 0; /* SUCCESS */ } -/*-------------------------------------------------------------------------*/ - int RngStream_SetSeed (RngStream g, unsigned long seed[6]) { int i; @@ -415,11 +369,9 @@ int RngStream_SetSeed (RngStream g, unsigned long seed[6]) return -1; /* FAILURE */ for (i = 0; i < 6; ++i) g->Cg[i] = g->Bg[i] = g->Ig[i] = seed[i]; - return 0; /* SUCCESS */ + return 0; /* SUCCESS */ } -/*-------------------------------------------------------------------------*/ - void RngStream_AdvanceState (RngStream g, long e, long c) { double B1[3][3], C1[3][3], B2[3][3], C2[3][3]; @@ -449,8 +401,6 @@ void RngStream_AdvanceState (RngStream g, long e, long c) MatVecModM (C2, &g->Cg[3], &g->Cg[3], m2); } -/*-------------------------------------------------------------------------*/ - void RngStream_GetState (RngStream g, unsigned long seed[6]) { int i; @@ -458,8 +408,6 @@ void RngStream_GetState (RngStream g, unsigned long seed[6]) seed[i] = g->Cg[i]; } -/*-------------------------------------------------------------------------*/ - void RngStream_WriteState (RngStream g) { int i; @@ -476,8 +424,6 @@ void RngStream_WriteState (RngStream g) printf ("%lu }\n\n", (unsigned long) g->Cg[5]); } -/*-------------------------------------------------------------------------*/ - void RngStream_WriteStateFull (RngStream g) { int i; @@ -508,22 +454,16 @@ void RngStream_WriteStateFull (RngStream g) printf ("%lu }\n\n", (unsigned long) g->Cg[5]); } -/*-------------------------------------------------------------------------*/ - void RngStream_IncreasedPrecis (RngStream g, int incp) { g->IncPrec = incp; } -/*-------------------------------------------------------------------------*/ - void RngStream_SetAntithetic (RngStream g, int a) { g->Anti = a; } -/*-------------------------------------------------------------------------*/ - double RngStream_RandU01 (RngStream g) { if (g->IncPrec) @@ -532,21 +472,7 @@ double RngStream_RandU01 (RngStream g) return U01 (g); } -/*-------------------------------------------------------------------------*/ - int RngStream_RandInt (RngStream g, int i, int j) { return i + (int) ((j - i + 1.0) * RngStream_RandU01 (g)); } - -/* Undefine this terms, or supernovae build will fail. */ -#undef norm -#undef m1 -#undef m2 -#undef a12 -#undef a13n -#undef a21 -#undef a23n -#undef two17 -#undef two53 -#undef fact