From 0d2b82900bbd68fea9c5f47f4c7deb8293f89352 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Thu, 11 Feb 2010 21:39:32 +0000
Subject: [PATCH] rewrite the gradient assembler such as to demand the
 derivative of the _squared_ distance from the target space.  Unlike the
 distance itself, the squared distance is differentiable at zero

[[Imported from SVN: r5546]]
---
 src/averagedistanceassembler.hh | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/averagedistanceassembler.hh b/src/averagedistanceassembler.hh
index 17f9c3ee..0f62f984 100644
--- a/src/averagedistanceassembler.hh
+++ b/src/averagedistanceassembler.hh
@@ -33,9 +33,16 @@ public:
                           typename TargetSpace::EmbeddedTangentVector& gradient) const
     {
         gradient = 0;
+#if 0  // This old code uses the derivative of dist(,), which is (frequently, at least)
+        // not differentiable at 0
         for (size_t i=0; i<coefficients_.size(); i++)
             gradient.axpy(weights_[i]*TargetSpace::distance(coefficients_[i], x),
                           TargetSpace::derivativeOfDistanceWRTSecondArgument(coefficients_[i], x));
+#else
+        for (size_t i=0; i<coefficients_.size(); i++)
+            gradient.axpy(0.5*weights_[i], 
+                          TargetSpace::derivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i], x));
+#endif
     }
 
     void assembleMatrix(const TargetSpace& x,
-- 
GitLab