Vector-like operators
parent
e46cfbd7c4
commit
137291b2c9
|
@ -14,7 +14,8 @@
|
||||||
#define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
|
#define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace gtsam;
|
|
||||||
|
namespace gtsam {
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
void check_size(const string& key, const Vector & vj, const Vector & dj) {
|
void check_size(const string& key, const Vector & vj, const Vector & dj) {
|
||||||
|
@ -27,14 +28,65 @@ void check_size(const string& key, const Vector & vj, const Vector & dj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
VectorConfig VectorConfig::scale(double gain) const {
|
std::vector<std::string> VectorConfig::get_names() const {
|
||||||
|
std::vector<std::string> names;
|
||||||
|
for(const_iterator it=values.begin(); it!=values.end(); it++)
|
||||||
|
names.push_back(it->first);
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
VectorConfig& VectorConfig::insert(const std::string& name, const Vector& val) {
|
||||||
|
values.insert(std::make_pair(name,val));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
void VectorConfig::add(const std::string& j, const Vector& a) {
|
||||||
|
Vector& vj = values[j];
|
||||||
|
if (vj.size()==0) vj = a; else vj += a;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
size_t VectorConfig::dim() const {
|
||||||
|
size_t result=0;
|
||||||
|
string key; Vector v;
|
||||||
|
FOREACH_PAIR(key, v, values) result += v.size();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
VectorConfig VectorConfig::scale(double s) const {
|
||||||
VectorConfig scaled;
|
VectorConfig scaled;
|
||||||
string key; Vector val;
|
string key; Vector val;
|
||||||
FOREACH_PAIR(key, val, values)
|
FOREACH_PAIR(key, val, values)
|
||||||
scaled.insert(key, gain*val);
|
scaled.insert(key, s*val);
|
||||||
return scaled;
|
return scaled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
VectorConfig VectorConfig::operator*(double s) const {
|
||||||
|
return scale(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
VectorConfig VectorConfig::operator+(const VectorConfig& b) const {
|
||||||
|
VectorConfig result;
|
||||||
|
string key; Vector v;
|
||||||
|
FOREACH_PAIR(key, v, values)
|
||||||
|
result.insert(key, v + b.get(key));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
VectorConfig VectorConfig::operator-(const VectorConfig& b) const {
|
||||||
|
VectorConfig result;
|
||||||
|
string key; Vector v;
|
||||||
|
FOREACH_PAIR(key, v, values)
|
||||||
|
result.insert(key, v - b.get(key));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
VectorConfig VectorConfig::exmap(const VectorConfig & delta) const
|
VectorConfig VectorConfig::exmap(const VectorConfig & delta) const
|
||||||
{
|
{
|
||||||
|
@ -90,4 +142,16 @@ bool VectorConfig::equals(const VectorConfig& expected, double tol) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
double VectorConfig::dot(const VectorConfig& b) const {
|
||||||
|
string j; Vector v; double result = 0.0;
|
||||||
|
FOREACH_PAIR(j, v, values) result += gtsam::dot(v,b.get(j));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
double dot(const VectorConfig& a, const VectorConfig& b) {
|
||||||
|
return a.dot(b);
|
||||||
|
}
|
||||||
|
/* ************************************************************************* */
|
||||||
|
|
||||||
|
} // gtsam
|
||||||
|
|
|
@ -34,24 +34,13 @@ namespace gtsam {
|
||||||
virtual ~VectorConfig() {}
|
virtual ~VectorConfig() {}
|
||||||
|
|
||||||
/** return all the nodes in the graph **/
|
/** return all the nodes in the graph **/
|
||||||
std::vector<std::string> get_names() const {
|
std::vector<std::string> get_names() const;
|
||||||
std::vector<std::string> names;
|
|
||||||
for(const_iterator it=values.begin(); it!=values.end(); it++)
|
|
||||||
names.push_back(it->first);
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Insert a value into the configuration with a given index */
|
/** Insert a value into the configuration with a given index */
|
||||||
VectorConfig& insert(const std::string& name, const Vector& val) {
|
VectorConfig& insert(const std::string& name, const Vector& val);
|
||||||
values.insert(std::make_pair(name,val));
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Add to vector at position j */
|
/** Add to vector at position j */
|
||||||
void add(const std::string& j, const Vector& a) {
|
void add(const std::string& j, const Vector& a);
|
||||||
Vector& vj = values[j];
|
|
||||||
if (vj.size()==0) vj = a; else vj += a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a delta config, needed for use in NonlinearOptimizer
|
* Add a delta config, needed for use in NonlinearOptimizer
|
||||||
|
@ -59,9 +48,6 @@ namespace gtsam {
|
||||||
*/
|
*/
|
||||||
VectorConfig exmap(const VectorConfig & delta) const;
|
VectorConfig exmap(const VectorConfig & delta) const;
|
||||||
|
|
||||||
/** Scales the configuration by a gain */
|
|
||||||
VectorConfig scale(double gain) const;
|
|
||||||
|
|
||||||
const_iterator begin() const {return values.begin();}
|
const_iterator begin() const {return values.begin();}
|
||||||
const_iterator end() const {return values.end();}
|
const_iterator end() const {return values.end();}
|
||||||
|
|
||||||
|
@ -73,15 +59,24 @@ namespace gtsam {
|
||||||
|
|
||||||
bool contains(const std::string& name) const {
|
bool contains(const std::string& name) const {
|
||||||
const_iterator it = values.find(name);
|
const_iterator it = values.find(name);
|
||||||
if (it==values.end())
|
return (it!=values.end());
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** size of the configurations */
|
/** Nr of vectors */
|
||||||
size_t size() const {
|
size_t size() const { return values.size();}
|
||||||
return values.size();
|
|
||||||
}
|
/** Total dimensionality */
|
||||||
|
size_t dim() const;
|
||||||
|
|
||||||
|
/** Scale */
|
||||||
|
VectorConfig scale(double s) const;
|
||||||
|
VectorConfig operator*(double s) const;
|
||||||
|
|
||||||
|
/** Add */
|
||||||
|
VectorConfig operator+(const VectorConfig &b) const;
|
||||||
|
|
||||||
|
/** Subtract */
|
||||||
|
VectorConfig operator-(const VectorConfig &b) const;
|
||||||
|
|
||||||
/** print */
|
/** print */
|
||||||
void print(const std::string& name = "") const;
|
void print(const std::string& name = "") const;
|
||||||
|
@ -91,6 +86,8 @@ namespace gtsam {
|
||||||
|
|
||||||
void clear() {values.clear();}
|
void clear() {values.clear();}
|
||||||
|
|
||||||
|
/** Dot product */
|
||||||
|
double dot(const VectorConfig& b) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Serialization function */
|
/** Serialization function */
|
||||||
|
@ -100,5 +97,9 @@ namespace gtsam {
|
||||||
{
|
{
|
||||||
ar & BOOST_SERIALIZATION_NVP(values);
|
ar & BOOST_SERIALIZATION_NVP(values);
|
||||||
}
|
}
|
||||||
};
|
}; // VectorConfig
|
||||||
}
|
|
||||||
|
/** Dot product */
|
||||||
|
double dot(const VectorConfig&, const VectorConfig&);
|
||||||
|
|
||||||
|
} // gtsam
|
||||||
|
|
|
@ -122,6 +122,28 @@ TEST( VectorConfig, update_with_large_delta) {
|
||||||
CHECK(assert_equal(actual, expected));
|
CHECK(assert_equal(actual, expected));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( VectorConfig, dot) {
|
||||||
|
VectorConfig c = createConfig();
|
||||||
|
DOUBLES_EQUAL(3.25,dot(c,c),1e-9);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( VectorConfig, dim) {
|
||||||
|
VectorConfig c = createConfig();
|
||||||
|
LONGS_EQUAL(6,c.dim());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
TEST( VectorConfig, operators) {
|
||||||
|
VectorConfig c; c.insert("x", Vector_(2, 1.1, 2.2));
|
||||||
|
VectorConfig expected1; expected1.insert("x", Vector_(2, 2.2, 4.4));
|
||||||
|
CHECK(assert_equal(expected1,c*2));
|
||||||
|
CHECK(assert_equal(expected1,c+c));
|
||||||
|
VectorConfig expected2; expected2.insert("x", Vector_(2, 0.0, 0.0));
|
||||||
|
CHECK(assert_equal(expected2,c-c));
|
||||||
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
#ifdef HAVE_BOOST_SERIALIZATION
|
#ifdef HAVE_BOOST_SERIALIZATION
|
||||||
TEST( VectorConfig, serialize)
|
TEST( VectorConfig, serialize)
|
||||||
|
|
Loading…
Reference in New Issue