103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
/* ----------------------------------------------------------------------------
 | 
						|
 | 
						|
 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
 | 
						|
 * Atlanta, Georgia 30332-0415
 | 
						|
 * All Rights Reserved
 | 
						|
 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
 | 
						|
 | 
						|
 * See LICENSE for the license information
 | 
						|
 | 
						|
 * -------------------------------------------------------------------------- */
 | 
						|
 | 
						|
/**
 | 
						|
 * @file     LP.h
 | 
						|
 * @brief    Struct used to hold a Linear Programming Problem
 | 
						|
 * @author   Ivan Dario Jimenez
 | 
						|
 * @date     1/24/16
 | 
						|
 */
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include <gtsam_unstable/linear/LinearCost.h>
 | 
						|
#include <gtsam_unstable/linear/EqualityFactorGraph.h>
 | 
						|
#include <gtsam_unstable/linear/InequalityFactorGraph.h>
 | 
						|
 | 
						|
#include <string>
 | 
						|
 | 
						|
namespace gtsam {
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
/// Mapping between variable's key and its corresponding dimensionality
 | 
						|
using KeyDimMap = std::map<Key, size_t>;
 | 
						|
/*
 | 
						|
 * Iterates through every factor in a linear graph and generates a
 | 
						|
 * mapping between every factor key and it's corresponding dimensionality.
 | 
						|
 */
 | 
						|
template <class LinearGraph>
 | 
						|
KeyDimMap collectKeyDim(const LinearGraph& linearGraph) {
 | 
						|
  KeyDimMap keyDimMap;
 | 
						|
  for (const typename LinearGraph::sharedFactor& factor : linearGraph) {
 | 
						|
    if (!factor) continue;
 | 
						|
    for (Key key : factor->keys())
 | 
						|
      keyDimMap[key] = factor->getDim(factor->find(key));
 | 
						|
  }
 | 
						|
  return keyDimMap;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Data structure of a Linear Program
 | 
						|
 */
 | 
						|
struct LP {
 | 
						|
  using shared_ptr = boost::shared_ptr<LP>;
 | 
						|
 | 
						|
  LinearCost cost; //!< Linear cost factor
 | 
						|
  EqualityFactorGraph equalities; //!< Linear equality constraints: cE(x) = 0
 | 
						|
  InequalityFactorGraph inequalities; //!< Linear inequality constraints: cI(x) <= 0
 | 
						|
private:
 | 
						|
  mutable KeyDimMap cachedConstrainedKeyDimMap_; //!< cached key-dim map of all variables in the constraints
 | 
						|
 | 
						|
public:
 | 
						|
  /// check feasibility
 | 
						|
  bool isFeasible(const VectorValues& x) const {
 | 
						|
    return (equalities.error(x) == 0 && inequalities.error(x) == 0);
 | 
						|
  }
 | 
						|
 | 
						|
  /// print
 | 
						|
  void print(const string& s = "") const {
 | 
						|
    std::cout << s << std::endl;
 | 
						|
    cost.print("Linear cost: ");
 | 
						|
    equalities.print("Linear equality factors: ");
 | 
						|
    inequalities.print("Linear inequality factors: ");
 | 
						|
  }
 | 
						|
 | 
						|
  /// equals
 | 
						|
  bool equals(const LP& other, double tol = 1e-9) const {
 | 
						|
    return cost.equals(other.cost) && equalities.equals(other.equalities)
 | 
						|
        && inequalities.equals(other.inequalities);
 | 
						|
  }
 | 
						|
 | 
						|
  const KeyDimMap& constrainedKeyDimMap() const {
 | 
						|
    if (!cachedConstrainedKeyDimMap_.empty())
 | 
						|
      return cachedConstrainedKeyDimMap_;
 | 
						|
    // Collect key-dim map of all variables in the constraints
 | 
						|
    cachedConstrainedKeyDimMap_ = collectKeyDim(equalities);
 | 
						|
    KeyDimMap keysDim2 = collectKeyDim(inequalities);
 | 
						|
    cachedConstrainedKeyDimMap_.insert(keysDim2.begin(), keysDim2.end());
 | 
						|
    return cachedConstrainedKeyDimMap_;
 | 
						|
  }
 | 
						|
 | 
						|
  Vector costGradient(Key key, const VectorValues& delta) const {
 | 
						|
    Vector g = Vector::Zero(delta.at(key).size());
 | 
						|
    Factor::const_iterator it = cost.find(key);
 | 
						|
    if (it != cost.end()) g = cost.getA(it).transpose();
 | 
						|
    return g;
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
/// traits
 | 
						|
template<> struct traits<LP> : public Testable<LP> {
 | 
						|
};
 | 
						|
 | 
						|
}
 |