ode/src/misc.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ode/src/misc.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,168 @@
+/*************************************************************************
+ *                                                                       *
+ * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
+ * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
+ *                                                                       *
+ * This library is free software; you can redistribute it and/or         *
+ * modify it under the terms of EITHER:                                  *
+ *   (1) The GNU Lesser General Public License as published by the Free  *
+ *       Software Foundation; either version 2.1 of the License, or (at  *
+ *       your option) any later version. The text of the GNU Lesser      *
+ *       General Public License is included with this library in the     *
+ *       file LICENSE.TXT.                                               *
+ *   (2) The BSD-style license that is included with this library in     *
+ *       the file LICENSE-BSD.TXT.                                       *
+ *                                                                       *
+ * This library is distributed in the hope that it will be useful,       *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
+ * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
+ *                                                                       *
+ *************************************************************************/
+
+#include <ode/config.h>
+#include <ode/misc.h>
+#include <ode/matrix.h>
+#include <ode/ode.h>
+
+//****************************************************************************
+// random numbers
+
+EXPORT_C unsigned long dRand()
+{
+  GetGlobalData()->seed = (1664525L*GetGlobalData()->seed + 1013904223L) & 0xffffffff;
+  return GetGlobalData()->seed;
+}
+
+
+EXPORT_C unsigned long  dRandGetSeed()
+{
+  return GetGlobalData()->seed;
+}
+
+
+EXPORT_C void dRandSetSeed (unsigned long s)
+{
+  GetGlobalData()->seed = s;
+}
+
+
+EXPORT_C int dTestRand()
+{
+  unsigned long oldseed = GetGlobalData()->seed;
+  int ret = 1;
+  GetGlobalData()->seed = 0;
+  if (dRand() != 0x3c6ef35f || dRand() != 0x47502932 ||
+      dRand() != 0xd1ccf6e9 || dRand() != 0xaaf95334 ||
+      dRand() != 0x6252e503) ret = 0;
+  GetGlobalData()->seed = oldseed;
+  return ret;
+}
+
+
+// adam's all-int straightforward(?) dRandInt (0..n-1)
+EXPORT_C int dRandInt (int n)
+{
+  // seems good; xor-fold and modulus
+  const unsigned long un = n;
+  unsigned long r = dRand();
+  
+  // note: probably more aggressive than it needs to be -- might be
+  //       able to get away without one or two of the innermost branches.
+  if (un <= 0x00010000UL) {
+    r ^= (r >> 16);
+    if (un <= 0x00000100UL) {
+      r ^= (r >> 8);
+      if (un <= 0x00000010UL) {
+        r ^= (r >> 4);
+        if (un <= 0x00000004UL) {
+          r ^= (r >> 2);
+          if (un <= 0x00000002UL) {
+            r ^= (r >> 1);
+          }
+        }
+      }
+    }
+  }
+
+  return (int) (r % un);    
+}
+
+
+EXPORT_C dReal dRandReal()
+{
+  return REAL(((dReal) dRand()) / ((dReal) 0xffffffff));
+}
+
+//****************************************************************************
+// matrix utility stuff
+
+EXPORT_C void dPrintMatrix (const dReal *A, int n, int m, char *fmt, FILE *f)
+{
+  int i,j;
+  int skip = dPAD(m);
+  for (i=0; i<n; i++) {
+    for (j=0; j<m; j++) fprintf (f,fmt,A[i*skip+j]);
+    fprintf (f,"\n");
+  }
+}
+
+
+EXPORT_C void dMakeRandomVector (dReal *A, int n, dReal range)
+{
+  int i;
+  for (i=0; i<n; i++) A[i] = dMUL((dMUL(dRandReal(),REAL(2.0))-REAL(1.0)),range);
+}
+
+
+EXPORT_C void dMakeRandomMatrix (dReal *A, int n, int m, dReal range)
+{
+  int i,j;
+  int skip = dPAD(m);
+  dSetZero (A,n*skip);
+  for (i=0; i<n; i++) {
+    for (j=0; j<m; j++) A[i*skip+j] = dMUL((dMUL(dRandReal(),REAL(2.0))-REAL(1.0)),range);
+  }
+}
+
+
+EXPORT_C void dClearUpperTriangle (dReal *A, int n)
+{
+  int i,j;
+  int skip = dPAD(n);
+  for (i=0; i<n; i++) {
+    for (j=i+1; j<n; j++) A[i*skip+j] = 0;
+  }
+}
+
+
+EXPORT_C dReal dMaxDifference (const dReal *A, const dReal *B, int n, int m)
+{
+  int i,j;
+  int skip = dPAD(m);
+  dReal diff,max;
+  max = 0;
+  for (i=0; i<n; i++) {
+    for (j=0; j<m; j++) {
+      diff = dFabs(A[i*skip+j] - B[i*skip+j]);
+      if (diff > max) max = diff;
+    }
+  }
+  return max;
+}
+
+
+EXPORT_C dReal dMaxDifferenceLowerTriangle (const dReal *A, const dReal *B, int n)
+{
+  int i,j;
+  int skip = dPAD(n);
+  dReal diff,max;
+  max = 0;
+  for (i=0; i<n; i++) {
+    for (j=0; j<=i; j++) {
+      diff = dFabs(A[i*skip+j] - B[i*skip+j]);
+      if (diff > max) max = diff;
+    }
+  }
+  return max;
+}