From 13b18e869452cc9e2fb6492db758d7554d5ac48b Mon Sep 17 00:00:00 2001 From: Carsten Schlote Date: Sun, 19 May 2019 14:26:18 +0200 Subject: [PATCH] Add code to check for NAN results and abort program in this case The has only minimal impact on speed, but prevents execution of float calculations including NANs. --- src/vectorflow/layers.d | 13 ++++++++++--- src/vectorflow/regularizers.d | 5 +++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/vectorflow/layers.d b/src/vectorflow/layers.d index b42d1c6..f9ec1c5 100644 --- a/src/vectorflow/layers.d +++ b/src/vectorflow/layers.d @@ -83,14 +83,21 @@ class Linear : NeuralLayer { auto row = W[k]; float dp = _with_intercept * row[0]; auto offset = _with_intercept; - foreach(l; parents) + foreach(idx, l; parents) { final switch(l.type) { case LayerT.DENSE: - dp += dotProd(row[offset..offset+l.dim_out], l.out_d); + auto dp_ret = dotProd(row[offset..offset+l.dim_out], l.out_d); + import std.math : isNaN; + if (isNaN(dp_ret)) + { + import std.format; + throw new Exception(format("Internal math error: Got NaN result from dotProd() on layer %d.", idx)); + } + dp += dp_ret; break; - + case LayerT.SPARSE: foreach(ref f; l.out_s) dp += row[offset + f.id] * f.val; diff --git a/src/vectorflow/regularizers.d b/src/vectorflow/regularizers.d index da5f5d0..f7a568e 100644 --- a/src/vectorflow/regularizers.d +++ b/src/vectorflow/regularizers.d @@ -350,6 +350,11 @@ class RotationPrior : AdditiveLinearPrior auto ri = W[i]; auto rj = W[j]; float g = dotProd(ri, rj); + import std.math : isNaN; + if (isNaN(g)) + { + throw new Exception("Internal math error: Got NaN result from dotProd()"); + } if(i != j) { foreach(u; 0..W[i].length)