/** * Assert equals with a relative error */ public static void assertRelativeEquals(DMatrix A, DMatrix B, double tol) { assertShape(A, B); for (int i = 0; i < A.getNumRows(); i++) { for (int j = 0; j < A.getNumCols(); j++) { double valA = A.get(i, j); double valB = B.get(i, j); if ((double.IsNaN(valA) != double.IsNaN(valB)) || (double.IsInfinity(valA) != double.IsInfinity(valB))) { throw new AssertFailedException("At (" + i + "," + j + ") A = " + valA + " B = " + valB); } double max = Math.Max(Math.Abs(valA), Math.Abs(valB)); double error = Math.Abs(valA - valB) / max; if (error > tol) { Console.WriteLine("------------ A -----------"); A.print(); Console.WriteLine("\n------------ B -----------"); B.print(); throw new AssertFailedException("At (" + i + "," + j + ") A = " + valA + " B = " + valB + " error = " + error); } } } }