From 2697fa49989c52159bb2e059e3b658f494e98c18 Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Thu, 9 Aug 2012 16:12:33 +0200
Subject: [PATCH] Move signals errordotSIN and errordotSOUT up to class
 FeatureAbstract.

  errordotSOUT callback computeErrorDot copies components of input signal
  errordotSIN of reference feature defined by selectionSIN flag to output
  signal errordotSOUT. This was previously performed by FeatureGeneric.

  Remove calls to withErrorDot, result is always true.
---
 doc/pictures/feature.fig             | 138 ++++++++++++++-------------
 doc/pictures/feature.png             | Bin 13124 -> 13278 bytes
 include/sot/core/feature-abstract.hh |  54 +++++------
 include/sot/core/feature-generic.hh  |   5 -
 src/feature/feature-abstract.cpp     |  40 +++++++-
 src/feature/feature-generic.cpp      |  37 -------
 src/task/task.cpp                    |  20 +---
 7 files changed, 137 insertions(+), 157 deletions(-)

diff --git a/doc/pictures/feature.fig b/doc/pictures/feature.fig
index 8df1036a..30af0c3a 100644
--- a/doc/pictures/feature.fig
+++ b/doc/pictures/feature.fig
@@ -7,104 +7,108 @@ A4
 Single
 -2
 1200 2
-6 910 413 4728 1522
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 59.15 118.32
-	 999 991 1797 991
+6 6120 6030 12690 8145
 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
-	 1797 413 3797 413 3797 1522 1797 1522 1797 413
+	 8930 6070 12665 6070 12665 8145 8930 8145 8930 6070
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 59.15 118.32
-	 3797 1389 4595 1389
+	1 1 1.00 110.67 221.33
+	 7470 6485 8930 6485
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 59.15 118.32
-	 3797 1035 4595 1035
+	1 1 1.00 110.67 221.33
+	 6357 7149 8930 7149
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 59.15 118.32
-	 3797 679 4595 679
-4 1 0 50 -1 2 13 0.0000 4 150 1470 2775 1035 FeatureAbstract\001
-4 2 0 50 -1 0 11 0.0000 4 135 690 1664 900 selection\001
-4 0 0 50 -1 0 11 0.0000 4 135 765 3885 1301 dimension\001
-4 0 0 50 -1 0 11 0.0000 4 180 630 3885 945 jacobian\001
-4 0 0 50 -1 0 11 0.0000 4 90 360 3885 591 error\001
+	1 1 1.00 110.67 221.33
+	 6357 7896 8930 7896
+4 2 0 50 -1 0 22 0.0000 4 255 2520 8681 6983 articularJacobian\001
+4 2 0 50 -1 0 22 0.0000 4 330 1230 8681 7730 jacobian\001
+4 2 0 50 -1 0 22 0.0000 4 330 1170 8681 6319 position\001
+4 1 0 50 -1 2 26 0.0000 4 300 2940 10756 6651 FeaturePoint6d\001
 -6
-6 540 4905 7380 7020
-6 540 4950 7380 6795
-6 540 5535 2115 6075
-6 630 5535 1845 5850
-4 2 0 50 -1 0 22 0.0000 4 255 1170 1823 5813 errordot\001
+6 8910 3735 10485 4275
+6 9000 3735 10215 4050
+4 2 0 50 -1 0 22 0.0000 4 255 1170 10193 4013 errordot\001
 -6
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
-	 578 5979 2072 5979
+	 8948 4179 10442 4179
 -6
-6 5805 4995 7380 5535
-6 5895 4995 7110 5310
-4 2 0 50 -1 0 22 0.0000 4 255 1170 7088 5273 errordot\001
+6 3600 3285 5175 3825
+6 3690 3285 4905 3600
+4 2 0 50 -1 0 22 0.0000 4 255 1170 4883 3563 errordot\001
 -6
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
-	 5843 5439 7337 5439
+	 3638 3729 5132 3729
 -6
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 110.67 221.33
-	 578 5315 2072 5315
+6 540 6300 2115 6795
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
 	 578 6726 2072 6726
-4 2 0 50 -1 0 22 0.0000 4 180 705 1823 5149 error\001
 4 2 0 50 -1 0 22 0.0000 4 330 1230 1823 6560 jacobian\001
-4 1 0 50 -1 2 26 0.0000 4 300 2955 3898 5481 FeatureGeneric\001
-4 0 0 50 -1 0 18 0.0000 4 195 1335 2487 5951 errSOUT =\001
-4 0 0 50 -1 0 18 0.0000 4 195 2685 2487 6320 errorSIN - ref.errorSIN\001
-4 0 0 50 -1 0 18 0.0000 4 255 2205 2487 6726 jacSOUT = jacSIN\001
 -6
-2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
-	 2072 4945 5807 4945 5807 7020 2072 7020 2072 4945
--6
-6 6120 6030 12690 8145
-2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
-	 8930 6070 12665 6070 12665 8145 8930 8145 8930 6070
+6 540 5175 2115 5625
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
-	 7470 6485 8930 6485
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 110.67 221.33
-	 6357 7149 8930 7149
+	 578 5540 2072 5540
+4 2 0 50 -1 0 22 0.0000 4 180 705 1823 5374 error\001
+-6
+6 945 495 1800 765
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 110.67 221.33
-	 6357 7896 8930 7896
-4 2 0 50 -1 0 22 0.0000 4 255 2520 8681 6983 articularJacobian\001
-4 2 0 50 -1 0 22 0.0000 4 330 1230 8681 7730 jacobian\001
-4 2 0 50 -1 0 22 0.0000 4 330 1170 8681 6319 position\001
-4 1 0 50 -1 2 26 0.0000 4 300 2940 10756 6651 FeaturePoint6d\001
+	1 1 1.00 59.15 118.32
+	 999 721 1797 721
+4 2 0 50 -1 0 11 0.0000 4 135 690 1664 630 selection\001
 -6
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
 	0 0 1.00 110.67 221.33
-	 3234 1522 3234 2435 5226 2435
+	 3234 1522 3234 1935 5226 1935
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 1.00 110.67 221.33
-	 3732 3348 5226 3348
+	0 0 1.00 110.67 221.33
+	 3825 4950 6471 4344
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	0 0 1.00 110.67 221.33
+	 10710 6075 7965 4344
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 2072 4945 5807 4945 5807 7020 2072 7020 2072 4945
 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
-	 5226 2269 8961 2269 8961 4344 5226 4344 5226 2269
+	 5175 1665 8961 1665 8961 4344 5175 4344 5175 1665
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
-	 8961 4095 10455 4095
+	 3732 2700 5226 2700
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
-	 8961 3431 10455 3431
+	 8961 3510 10455 3510
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
 	1 1 1.00 110.67 221.33
-	 8961 2767 10455 2767
+	 8961 2846 10455 2846
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	0 0 1.00 110.67 221.33
-	 3825 4950 6471 4344
+	1 1 1.00 110.67 221.33
+	 8961 2182 10455 2182
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 1797 413 3797 413 3797 1522 1797 1522 1797 413
 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	0 0 1.00 110.67 221.33
-	 10710 6075 7965 4344
-4 1 0 50 -1 2 26 0.0000 4 300 3105 7052 3431 FeatureAbstract\001
-4 2 0 50 -1 0 22 0.0000 4 255 1305 4977 3182 selection\001
-4 0 0 50 -1 0 22 0.0000 4 255 1545 9127 3929 dimension\001
-4 0 0 50 -1 0 22 0.0000 4 330 1230 9127 3265 jacobian\001
-4 0 0 50 -1 0 22 0.0000 4 180 705 9127 2601 error\001
-4 2 0 50 -1 0 22 0.0000 4 255 1365 4977 2186 reference\001
+	1 1 1.00 59.15 118.32
+	 3797 1389 4595 1389
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 59.15 118.32
+	 3797 1035 4595 1035
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 59.15 118.32
+	 3797 679 4595 679
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 59.15 118.32
+	 999 1306 1797 1306
+4 1 0 50 -1 2 26 0.0000 4 300 2955 3898 5481 FeatureGeneric\001
+4 0 0 50 -1 0 18 0.0000 4 195 1335 2487 5951 errSOUT =\001
+4 0 0 50 -1 0 18 0.0000 4 195 2685 2487 6320 errorSIN - ref.errorSIN\001
+4 0 0 50 -1 0 18 0.0000 4 255 2205 2487 6726 jacSOUT = jacSIN\001
+4 1 0 50 -1 2 26 0.0000 4 300 3105 7052 2340 FeatureAbstract\001
+4 2 0 50 -1 0 22 0.0000 4 255 1365 4977 1845 reference\001
+4 2 0 50 -1 0 22 0.0000 4 255 1305 4977 2475 selection\001
+4 0 0 50 -1 0 22 0.0000 4 255 1545 9127 3344 dimension\001
+4 0 0 50 -1 0 22 0.0000 4 330 1230 9127 2680 jacobian\001
+4 0 0 50 -1 0 22 0.0000 4 180 705 9127 2016 error\001
+4 1 0 50 -1 2 13 0.0000 4 150 1470 2775 1035 FeatureAbstract\001
+4 0 0 50 -1 0 11 0.0000 4 135 765 3885 1301 dimension\001
+4 0 0 50 -1 0 11 0.0000 4 180 630 3885 945 jacobian\001
+4 0 0 50 -1 0 11 0.0000 4 90 360 3885 591 error\001
+4 2 0 50 -1 0 11 0.0000 4 135 600 1664 1215 errordot\001
diff --git a/doc/pictures/feature.png b/doc/pictures/feature.png
index 6f41967f51581ab486f974ce255191acde0a3072..21b13466b421d61c051270ffaecd02446328040f 100644
GIT binary patch
delta 10192
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
Zl^=v+{?ZBmQBq%oFFpAB^QJfB{{y^VK|lZi

delta 9804
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
UDR2_O%*c8c2bR9%cfa_50Jo{9Q~&?~

diff --git a/include/sot/core/feature-abstract.hh b/include/sot/core/feature-abstract.hh
index 2cc1b842..7d2e0e7d 100644
--- a/include/sot/core/feature-abstract.hh
+++ b/include/sot/core/feature-abstract.hh
@@ -35,6 +35,7 @@ namespace ml = maal::boost;
 #include <dynamic-graph/entity.h>
 #include <sot/core/pool.hh>
 #include "sot/core/api.hh"
+#include "sot/core/deprecated.hh"
 
 /* STD */
 #include <string>
@@ -66,29 +67,6 @@ namespace dynamicgraph {
       evolution of the feature with respect to time: \f$\frac{\partial
       f}{\partial t}\f$.
 
-      \par Time derivative of the error
-
-      Some Feature types provide as output signal the derivative of the
-      error of the feature (<c>errordotSOUT</c>). The value is computed by
-      method computeErrorDot. In this case, these feature types should
-      \li have attribute
-      \code
-      dg::SignalTimeDependent< ml::Vector,int > errordotSOUT;
-      \endcode
-      \li implement method
-      \code
-      virtual bool withErrorDot() const { return true; }
-      \endcode
-      \li implement method
-      \code
-      virtual SignalTimeDependent<ml::Vector,int>& getErrorDot()
-      {
-      return errordotSOUT;
-      }
-      \endcode
-
-      See dynamicgraph::sot::FeatureGeneric for an example.
-
       \image html pictures/feature.png "Feature diagram: Feature types derive from FeatureAbstract. Each feature has a reference of the same type and compute an error by comparing errorSIN signals from itself and from the reference." width=15cm
     */
     class SOT_CORE_EXPORT FeatureAbstract
@@ -162,6 +140,12 @@ namespace dynamicgraph {
       */
       virtual ml::Matrix& computeJacobian( ml::Matrix& res,int time ) = 0;
 
+      /// Callback for signal errordotSOUT
+      ///
+      /// Copy components of the input signal errordotSIN defined by selection
+      /// flag selectionSIN.
+      virtual ml::Vector& computeErrorDot (ml::Vector& res,int time);
+
       /*! @} */
 
       /* --- SIGNALS ------------------------------------------------------------ */
@@ -178,6 +162,10 @@ namespace dynamicgraph {
 	be used for computing error, activation and Jacobian, then the vector to specify
 	is \f$ [ 0 1 0] \f$.*/
       SignalPtr< Flags,int > selectionSIN;
+
+      /// Derivative of the reference value.
+      SignalPtr< ml::Vector,int > errordotSIN;
+
       /*! @} */
 
       /*! \name Output signals:
@@ -187,6 +175,9 @@ namespace dynamicgraph {
 	the current value : \f$ {\bf s}^*(t) - {\bf s}(t)\f$ */
       SignalTimeDependent<ml::Vector,int> errorSOUT;
 
+      /// Derivative of the reference value.
+      SignalTimeDependent< ml::Vector,int > errordotSOUT;
+
       /*! \brief This signal returns the Jacobian of the current value
 	according to the robot state: \f$ J(t) = \frac{\delta{\bf s}^*(t)}{\delta {\bf q}(t)}\f$ */
       SignalTimeDependent<ml::Matrix,int> jacobianSOUT;
@@ -198,8 +189,14 @@ namespace dynamicgraph {
       virtual std::ostream & writeGraph(std::ostream & os) const;
 
       /// Return true for children that provide the errordot output signal
-      virtual bool withErrorDot( void ) const { return false; }
-      virtual SignalTimeDependent<ml::Vector,int>& getErrorDot( void ) {throw;}
+      virtual bool withErrorDot( void ) const SOT_CORE_DEPRECATED
+      {
+	return true;
+      }
+      virtual SignalTimeDependent<ml::Vector,int>& getErrorDot()
+      {
+	return errordotSOUT;
+      }
 
       /*! @} */
 
@@ -286,13 +283,6 @@ namespace dynamicgraph {
     /* To force a ; */bool NO_REFERENCE
     /* END OF define DECLARE_REFERENCE_FUNCTIONS */
 
-#define WITH_ERRORDOT  \
-      virtual bool withErrorDot() const { return true; }   \
-      virtual SignalTimeDependent<ml::Vector,int>& getErrorDot() { return errordotSOUT; } \
-      dg::SignalTimeDependent< ml::Vector,int > errordotSOUT;   \
-      virtual ml::Vector& computeErrorDot( ml::Vector& res,int time )
-
-
   } // namespace sot
 } // namespace dynamicgraph
 
diff --git a/include/sot/core/feature-generic.hh b/include/sot/core/feature-generic.hh
index 540b11fb..c2afbe15 100644
--- a/include/sot/core/feature-generic.hh
+++ b/include/sot/core/feature-generic.hh
@@ -87,9 +87,6 @@ class SOTFEATUREGENERIC_EXPORT FeatureGeneric
   /*! \brief Input for the error. */
   dg::SignalPtr< ml::Vector,int > errorSIN;
 
-  /*! \brief Input for the errordot. */
-  dg::SignalPtr< ml::Vector,int > errordotSIN;
-
   /*! \brief Input for the Jacobian. */
   dg::SignalPtr< ml::Matrix,int > jacobianSIN;
 
@@ -126,8 +123,6 @@ class SOTFEATUREGENERIC_EXPORT FeatureGeneric
   /*! \brief Compute the Jacobian of the value according to the robot state.. */
   virtual ml::Matrix& computeJacobian( ml::Matrix& res,int time );
 
-  WITH_ERRORDOT;
-
   /*! @} */
 
   /*! \brief Display the information related to this generic implementation. */
diff --git a/src/feature/feature-abstract.cpp b/src/feature/feature-abstract.cpp
index 372f1c9f..06d86c55 100644
--- a/src/feature/feature-abstract.cpp
+++ b/src/feature/feature-abstract.cpp
@@ -20,10 +20,12 @@
 
 #include <sot/core/feature-abstract.hh>
 #include <sot/core/pool.hh>
+#include "sot/core/debug.hh"
+#include "sot/core/exception-feature.hh"
 #include <dynamic-graph/all-commands.h>
 
 using namespace dynamicgraph::sot;
-namespace dg = dynamicgraph;
+using dynamicgraph::sot::ExceptionFeature;
 
 const std::string 
 FeatureAbstract::CLASS_NAME = "FeatureAbstract";
@@ -33,6 +35,7 @@ FeatureAbstract::
 FeatureAbstract( const std::string& name ) 
   :Entity(name)
    ,selectionSIN(NULL,"sotFeatureAbstract("+name+")::input(flag)::selec")
+  ,errordotSIN (NULL,"sotFeatureAbstract("+name+")::input(vector)::errordotIN" )
    ,errorSOUT( boost::bind(&FeatureAbstract::computeError,this,_1,_2),
 	       selectionSIN,
 	       "sotFeatureAbstract("+name+")::output(vector)::error" )
@@ -42,6 +45,9 @@ FeatureAbstract( const std::string& name )
    ,dimensionSOUT( boost::bind(&FeatureAbstract::getDimension,this,_1,_2),
 		   selectionSIN,
 		   "sotFeatureAbstract("+name+")::output(uint)::dim" )
+  ,errordotSOUT (boost::bind(&FeatureAbstract::computeErrorDot,this,_1,_2),
+		 selectionSIN << errordotSIN,
+		 "sotFeatureAbstract("+name+")::output(vector)::errordot" )
 {
   selectionSIN = true;
   signalRegistration( selectionSIN
@@ -97,3 +103,35 @@ getReferenceByName() const
 {
   if( isReferenceSet() ) return getReferenceAbstract()->getName(); else return "none";
 }
+
+ml::Vector& FeatureAbstract::
+computeErrorDot( ml::Vector& res,int time )
+{ 
+  const Flags &fl = selectionSIN.access(time);
+  const unsigned int & dim = dimensionSOUT(time);
+
+  unsigned int curr = 0;
+  res.resize( dim );
+
+  sotDEBUG(25) << "Dim = " << dim << std::endl;
+
+  if( isReferenceSet () && getReferenceAbstract ()->errordotSIN.isPluged ())
+    {
+      const ml::Vector& errdotDes = getReferenceAbstract ()->errordotSIN(time);
+      sotDEBUG(15) << "Err* = " << errdotDes;
+      if( errdotDes.size()<dim )
+	{ SOT_THROW ExceptionFeature( ExceptionFeature::UNCOMPATIBLE_SIZE,
+					 "Error: dimension uncompatible with des->errorIN size."
+					 " (while considering feature <%s>).",getName().c_str() ); }
+
+      for( unsigned int i=0;i<errdotDes.size();++i ) if( fl(i) ) 
+	if( fl(i) ) res( curr++ ) = errdotDes(i);
+    }
+  else
+    {
+      for( unsigned int i=0;i<dim;++i )
+	if( fl(i) ) res( curr++ ) = 0.0;
+    }
+  
+  return res; 
+}
diff --git a/src/feature/feature-generic.cpp b/src/feature/feature-generic.cpp
index 9b972775..ef5e8420 100644
--- a/src/feature/feature-generic.cpp
+++ b/src/feature/feature-generic.cpp
@@ -44,11 +44,7 @@ FeatureGeneric( const string& pointName )
   : FeatureAbstract( pointName )
     ,dimensionDefault(0)
     ,errorSIN( NULL,"sotFeatureGeneric("+name+")::input(vector)::errorIN" )
-    ,errordotSIN( NULL,"sotFeatureGeneric("+name+")::input(vector)::errordotIN" )
     ,jacobianSIN( NULL,"sotFeatureGeneric("+name+")::input(matrix)::jacobianIN" )
-    ,errordotSOUT(  boost::bind(&FeatureGeneric::computeErrorDot,this,_1,_2),
-		    selectionSIN << errordotSIN,
-		    "sotFeatureAbstract("+name+")::output(vector)::errordot" )
 
 {
   jacobianSOUT.addDependency( jacobianSIN );
@@ -135,39 +131,6 @@ computeError( ml::Vector& res,int time )
 
 }
 
-ml::Vector& FeatureGeneric::
-computeErrorDot( ml::Vector& res,int time )
-{ 
-  const Flags &fl = selectionSIN.access(time);
-  const unsigned int & dim = dimensionSOUT(time);
-
-  unsigned int curr = 0;
-  res.resize( dim );
-
-  sotDEBUG(25) << "Dim = " << dim << endl;
-
-  if( isReferenceSet() && getReference()->errordotSIN.isPluged())
-    {
-      const ml::Vector& errdotDes = getReference()->errordotSIN(time);
-      sotDEBUG(15) << "Err* = " << errdotDes;
-      if( errdotDes.size()<dim )
-	{ SOT_THROW ExceptionFeature( ExceptionFeature::UNCOMPATIBLE_SIZE,
-					 "Error: dimension uncompatible with des->errorIN size."
-					 " (while considering feature <%s>).",getName().c_str() ); }
-
-      for( unsigned int i=0;i<errdotDes.size();++i ) if( fl(i) ) 
-	if( fl(i) ) res( curr++ ) = errdotDes(i);
-    }
-  else
-    {
-      for( unsigned int i=0;i<dim;++i )
-	if( fl(i) ) res( curr++ ) = 0.0;
-    }
-  
-  return res; 
-}
-
-
 ml::Matrix& FeatureGeneric::
 computeJacobian( ml::Matrix& res,int time )
 { 
diff --git a/src/task/task.cpp b/src/task/task.cpp
index 98edc36f..4bc8f302 100644
--- a/src/task/task.cpp
+++ b/src/task/task.cpp
@@ -110,8 +110,7 @@ addFeature( FeatureAbstract& s )
   featureList.push_back(&s);
   jacobianSOUT.addDependency( s.jacobianSOUT );
   errorSOUT.addDependency( s.errorSOUT );
-  if( s.withErrorDot() )
-    { errorTimeDerivativeSOUT.addDependency( s.getErrorDot() ); }
+  errorTimeDerivativeSOUT.addDependency (s.getErrorDot());
 }
 
 void Task::
@@ -132,8 +131,7 @@ clearFeatureList( void )
       FeatureAbstract & s = **iter;
       jacobianSOUT.removeDependency( s.jacobianSOUT );
       errorSOUT.removeDependency( s.errorSOUT );
-      if( s.withErrorDot() )
-	{ errorTimeDerivativeSOUT.removeDependency( s.getErrorDot() ); }
+      errorTimeDerivativeSOUT.removeDependency (s.getErrorDot());
     }
 
   featureList.clear();
@@ -237,17 +235,9 @@ computeErrorTimeDerivative( ml::Vector & res, int time)
       {
 	FeatureAbstract &feature = **iter;
 
-	if( feature.withErrorDot() )
-	  {
-	    const ml::Vector& partialErrorDot = feature.getErrorDot()(time);
-	    const int dim = partialErrorDot.size();
-	    for( int k=0;k<dim;++k ){ res(cursor++) = partialErrorDot(k); }
-	  }
-	else
-	  {
-	    const int dim = feature.errorSOUT(time).size();
-	    for( int k=0;k<dim;++k ){ res(cursor++) = 0; }
-	  }
+	const ml::Vector& partialErrorDot = feature.getErrorDot()(time);
+	const int dim = partialErrorDot.size();
+	for( int k=0;k<dim;++k ){ res(cursor++) = partialErrorDot(k); }
       }
 
   return res;
-- 
GitLab